From c325d81b2e2763c948748d3df86bac26ad4f1498 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 18 Sep 2007 20:03:47 +0000 Subject: [PATCH 01/25] branched 1.4.2 to 1.6.0 --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40421 --- installer/Attach.cfg | 38 + installer/Attach.dpr | 68 + installer/Attach.exe | Bin 0 -> 281600 bytes installer/HL2Launch.cfg | 38 + installer/HL2Launch.dpr | 189 + installer/HL2Launch.exe | Bin 0 -> 43008 bytes installer/MMS_Installer.cfg | 38 + installer/MMS_Installer.dpr | 72 + installer/MMS_Installer.exe | Bin 0 -> 637952 bytes installer/MMS_Installer.res | Bin 0 -> 171456 bytes installer/UnitFunctions.pas | 126 + installer/UnitInstall.pas | 561 + installer/UnitPackSystem.pas | 211 + installer/UnitSelectModPath.dfm | Bin 0 -> 1148 bytes installer/UnitSelectModPath.pas | 26 + installer/UnitfrmMain.dfm | 11577 ++++++++++++++++ installer/UnitfrmMain.pas | 730 + installer/UnitfrmProxy.dfm | Bin 0 -> 1584 bytes installer/UnitfrmProxy.pas | 72 + installer/del.bat | 15 + installer/files/Readme.txt | 7 + installer/install.bmp | Bin 0 -> 154542 bytes installer/upx.exe | Bin 0 -> 126464 bytes modules.versions | 9 + sourcehook/FastDelegate.h | 3811 +++++ sourcehook/generate/FastDelegate.h | 3811 +++++ sourcehook/generate/FastDelegate.hxx | 1054 ++ sourcehook/generate/generate | 7 + sourcehook/generate/generate.bat | 10 + sourcehook/generate/sh_memfuncinfo.h | 912 ++ sourcehook/generate/sh_memfuncinfo.hxx | 332 + sourcehook/generate/shworker.bin | Bin 0 -> 54998 bytes sourcehook/generate/shworker.exe | Bin 0 -> 352256 bytes sourcehook/generate/shworker/Makefile | 13 + sourcehook/generate/shworker/fd_hopter.cpp | 370 + .../generate/shworker/msvc7/shworker.vcproj | 137 + .../generate/shworker/msvc8/shworker.vcproj | 208 + sourcehook/generate/shworker/shworker.cpp | 767 + sourcehook/generate/sourcehook.h | 6104 ++++++++ sourcehook/generate/sourcehook.hxx | 1370 ++ sourcehook/sh_list.h | 291 + sourcehook/sh_memfuncinfo.h | 912 ++ sourcehook/sh_memory.h | 186 + sourcehook/sh_stack.h | 237 + sourcehook/sh_string.h | 401 + sourcehook/sh_tinyhash.h | 534 + sourcehook/sh_vector.h | 490 + sourcehook/sourcehook.cpp | 1212 ++ sourcehook/sourcehook.h | 6104 ++++++++ sourcehook/sourcehook_impl.h | 656 + sourcehook/test/Makefile | 63 + sourcehook/test/main.cpp | 131 + sourcehook/test/msvc7/test.vcproj | 359 + sourcehook/test/msvc8/test.vcproj | 513 + sourcehook/test/sourcehook_test.h | 27 + sourcehook/test/test1.cpp | 700 + sourcehook/test/test2.cpp | 171 + sourcehook/test/test3.cpp | 238 + sourcehook/test/test4.cpp | 420 + sourcehook/test/testbail.cpp | 115 + sourcehook/test/testbail.h | 39 + sourcehook/test/testbail2.cpp | 36 + sourcehook/test/testevents.h | 153 + sourcehook/test/testlist.cpp | 282 + sourcehook/test/testmanual.cpp | 355 + sourcehook/test/testmulti.cpp | 106 + sourcehook/test/testrecall.cpp | 226 + sourcehook/test/testreentr.cpp | 599 + sourcehook/test/testref.cpp | 163 + sourcehook/test/testrefret.cpp | 200 + sourcemm/CPlugin.cpp | 618 + sourcemm/CPlugin.h | 146 + sourcemm/CSmmAPI.cpp | 668 + sourcemm/CSmmAPI.h | 98 + sourcemm/IPluginManager.h | 137 + sourcemm/ISmmAPI.h | 320 + sourcemm/ISmmPlugin.h | 409 + sourcemm/LICENSE.txt | 29 + sourcemm/Makefile | 69 + sourcemm/SourceMM.Doxyfile | 257 + sourcemm/changelog.txt | 125 + sourcemm/concommands.cpp | 764 + sourcemm/concommands.h | 53 + sourcemm/convar_smm.h | 523 + sourcemm/msvc7/sourcemm.sln | 21 + sourcemm/msvc7/sourcemm.vcproj | 258 + sourcemm/msvc8/sourcemm.sln | 20 + sourcemm/msvc8/sourcemm.vcproj | 360 + sourcemm/oslink.cpp | 69 + sourcemm/oslink.h | 91 + sourcemm/sample_mm/LICENSE.txt | 29 + sourcemm/sample_mm/Makefile | 67 + sourcemm/sample_mm/SamplePlugin.cpp | 237 + sourcemm/sample_mm/SamplePlugin.h | 132 + sourcemm/sample_mm/cvars.cpp | 27 + sourcemm/sample_mm/cvars.h | 24 + sourcemm/sample_mm/msvc7/sample_mm.sln | 21 + sourcemm/sample_mm/msvc7/sample_mm.vcproj | 149 + sourcemm/sample_mm/msvc8/sample_mm.sln | 20 + sourcemm/sample_mm/msvc8/sample_mm.vcproj | 222 + sourcemm/sourcemm.cpp | 717 + sourcemm/sourcemm.h | 122 + sourcemm/stub_mm/LICENSE.txt | 29 + sourcemm/stub_mm/Makefile | 66 + sourcemm/stub_mm/msvc7/stub_mm.sln | 21 + sourcemm/stub_mm/msvc7/stub_mm.vcproj | 142 + sourcemm/stub_mm/msvc8/stub_mm.sln | 20 + sourcemm/stub_mm/msvc8/stub_mm.vcproj | 214 + sourcemm/stub_mm/stub_mm.cpp | 105 + sourcemm/stub_mm/stub_mm.h | 45 + sourcemm/svn_version.h | 13 + sourcemm/svn_version.tpl | 13 + sourcemm/util.cpp | 408 + sourcemm/util.h | 76 + sourcemm/version.rc | 101 + sourcemm/vsp_listener.cpp | 152 + sourcemm/vsp_listener.h | 49 + update_tool/Makefile | 68 + update_tool/README.txt | 90 + update_tool/api_link.asm | 138 + update_tool/msvc8/update_tool.sln | 20 + update_tool/msvc8/update_tool.vcproj | 203 + update_tool/sourcemm_update_tool.vdf | 6 + update_tool/sourcemm_updater.conf | 9 + update_tool/update_tool.cpp | 366 + 125 files changed, 57758 insertions(+) create mode 100644 installer/Attach.cfg create mode 100644 installer/Attach.dpr create mode 100644 installer/Attach.exe create mode 100644 installer/HL2Launch.cfg create mode 100644 installer/HL2Launch.dpr create mode 100644 installer/HL2Launch.exe create mode 100644 installer/MMS_Installer.cfg create mode 100644 installer/MMS_Installer.dpr create mode 100644 installer/MMS_Installer.exe create mode 100644 installer/MMS_Installer.res create mode 100644 installer/UnitFunctions.pas create mode 100644 installer/UnitInstall.pas create mode 100644 installer/UnitPackSystem.pas create mode 100644 installer/UnitSelectModPath.dfm create mode 100644 installer/UnitSelectModPath.pas create mode 100644 installer/UnitfrmMain.dfm create mode 100644 installer/UnitfrmMain.pas create mode 100644 installer/UnitfrmProxy.dfm create mode 100644 installer/UnitfrmProxy.pas create mode 100644 installer/del.bat create mode 100644 installer/files/Readme.txt create mode 100644 installer/install.bmp create mode 100644 installer/upx.exe create mode 100644 modules.versions create mode 100644 sourcehook/FastDelegate.h create mode 100644 sourcehook/generate/FastDelegate.h create mode 100644 sourcehook/generate/FastDelegate.hxx create mode 100755 sourcehook/generate/generate create mode 100644 sourcehook/generate/generate.bat create mode 100644 sourcehook/generate/sh_memfuncinfo.h create mode 100644 sourcehook/generate/sh_memfuncinfo.hxx create mode 100755 sourcehook/generate/shworker.bin create mode 100644 sourcehook/generate/shworker.exe create mode 100644 sourcehook/generate/shworker/Makefile create mode 100644 sourcehook/generate/shworker/fd_hopter.cpp create mode 100644 sourcehook/generate/shworker/msvc7/shworker.vcproj create mode 100644 sourcehook/generate/shworker/msvc8/shworker.vcproj create mode 100644 sourcehook/generate/shworker/shworker.cpp create mode 100644 sourcehook/generate/sourcehook.h create mode 100755 sourcehook/generate/sourcehook.hxx create mode 100644 sourcehook/sh_list.h create mode 100644 sourcehook/sh_memfuncinfo.h create mode 100644 sourcehook/sh_memory.h create mode 100644 sourcehook/sh_stack.h create mode 100755 sourcehook/sh_string.h create mode 100644 sourcehook/sh_tinyhash.h create mode 100755 sourcehook/sh_vector.h create mode 100644 sourcehook/sourcehook.cpp create mode 100644 sourcehook/sourcehook.h create mode 100644 sourcehook/sourcehook_impl.h create mode 100644 sourcehook/test/Makefile create mode 100644 sourcehook/test/main.cpp create mode 100644 sourcehook/test/msvc7/test.vcproj create mode 100644 sourcehook/test/msvc8/test.vcproj create mode 100644 sourcehook/test/sourcehook_test.h create mode 100644 sourcehook/test/test1.cpp create mode 100644 sourcehook/test/test2.cpp create mode 100644 sourcehook/test/test3.cpp create mode 100644 sourcehook/test/test4.cpp create mode 100644 sourcehook/test/testbail.cpp create mode 100644 sourcehook/test/testbail.h create mode 100644 sourcehook/test/testbail2.cpp create mode 100644 sourcehook/test/testevents.h create mode 100644 sourcehook/test/testlist.cpp create mode 100644 sourcehook/test/testmanual.cpp create mode 100644 sourcehook/test/testmulti.cpp create mode 100644 sourcehook/test/testrecall.cpp create mode 100644 sourcehook/test/testreentr.cpp create mode 100644 sourcehook/test/testref.cpp create mode 100644 sourcehook/test/testrefret.cpp create mode 100644 sourcemm/CPlugin.cpp create mode 100644 sourcemm/CPlugin.h create mode 100644 sourcemm/CSmmAPI.cpp create mode 100644 sourcemm/CSmmAPI.h create mode 100644 sourcemm/IPluginManager.h create mode 100644 sourcemm/ISmmAPI.h create mode 100644 sourcemm/ISmmPlugin.h create mode 100644 sourcemm/LICENSE.txt create mode 100644 sourcemm/Makefile create mode 100644 sourcemm/SourceMM.Doxyfile create mode 100644 sourcemm/changelog.txt create mode 100644 sourcemm/concommands.cpp create mode 100644 sourcemm/concommands.h create mode 100644 sourcemm/convar_smm.h create mode 100644 sourcemm/msvc7/sourcemm.sln create mode 100644 sourcemm/msvc7/sourcemm.vcproj create mode 100644 sourcemm/msvc8/sourcemm.sln create mode 100644 sourcemm/msvc8/sourcemm.vcproj create mode 100644 sourcemm/oslink.cpp create mode 100644 sourcemm/oslink.h create mode 100644 sourcemm/sample_mm/LICENSE.txt create mode 100644 sourcemm/sample_mm/Makefile create mode 100644 sourcemm/sample_mm/SamplePlugin.cpp create mode 100644 sourcemm/sample_mm/SamplePlugin.h create mode 100644 sourcemm/sample_mm/cvars.cpp create mode 100644 sourcemm/sample_mm/cvars.h create mode 100644 sourcemm/sample_mm/msvc7/sample_mm.sln create mode 100644 sourcemm/sample_mm/msvc7/sample_mm.vcproj create mode 100644 sourcemm/sample_mm/msvc8/sample_mm.sln create mode 100644 sourcemm/sample_mm/msvc8/sample_mm.vcproj create mode 100644 sourcemm/sourcemm.cpp create mode 100644 sourcemm/sourcemm.h create mode 100644 sourcemm/stub_mm/LICENSE.txt create mode 100644 sourcemm/stub_mm/Makefile create mode 100644 sourcemm/stub_mm/msvc7/stub_mm.sln create mode 100644 sourcemm/stub_mm/msvc7/stub_mm.vcproj create mode 100644 sourcemm/stub_mm/msvc8/stub_mm.sln create mode 100644 sourcemm/stub_mm/msvc8/stub_mm.vcproj create mode 100644 sourcemm/stub_mm/stub_mm.cpp create mode 100644 sourcemm/stub_mm/stub_mm.h create mode 100644 sourcemm/svn_version.h create mode 100644 sourcemm/svn_version.tpl create mode 100644 sourcemm/util.cpp create mode 100644 sourcemm/util.h create mode 100755 sourcemm/version.rc create mode 100644 sourcemm/vsp_listener.cpp create mode 100644 sourcemm/vsp_listener.h create mode 100644 update_tool/Makefile create mode 100644 update_tool/README.txt create mode 100644 update_tool/api_link.asm create mode 100644 update_tool/msvc8/update_tool.sln create mode 100644 update_tool/msvc8/update_tool.vcproj create mode 100644 update_tool/sourcemm_update_tool.vdf create mode 100644 update_tool/sourcemm_updater.conf create mode 100644 update_tool/update_tool.cpp diff --git a/installer/Attach.cfg b/installer/Attach.cfg new file mode 100644 index 0000000..662b86f --- /dev/null +++ b/installer/Attach.cfg @@ -0,0 +1,38 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"c:\programme\borland\delphi7\Projects\Bpl" +-LN"c:\programme\borland\delphi7\Projects\Bpl" +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/installer/Attach.dpr b/installer/Attach.dpr new file mode 100644 index 0000000..1056bb3 --- /dev/null +++ b/installer/Attach.dpr @@ -0,0 +1,68 @@ +program Attach; + +{$APPTYPE CONSOLE} + +uses + SysUtils, Classes, UnitPackSystem; + +var eStream: TMemoryStream; + eFiles: TStringList; + Version: String; +begin + WriteLn('// File attacher for the MM:S installer'); + WriteLn('// by Basic-Master'); + WriteLn(''); + WriteLn('// Looking up files...'); + { Check files } + if FileExists(ExtractFilePath(ParamStr(0)) + 'files\hl2launch.exe') then + WriteLn('// Found files\hl2launch.exe') + else begin + WriteLn('// Error: Couldn''t find files\hl2launch.exe!'); + ReadLn; + exit; + end; + if FileExists(ExtractFilePath(ParamStr(0)) + 'files\server.dll') then + WriteLn('// Found files\server.dll') + else begin + WriteLn('// Error: Couldn''t find files\server.dll!'); + ReadLn; + exit; + end; + if FileExists(ExtractFilePath(ParamStr(0)) + 'files\server_i486.so') then + WriteLn('// Found files\server_i486.so') + else begin + WriteLn('// Error: Couldn''t find files\server_i486.so!'); + ReadLn; + exit; + end; + if FileExists(ExtractFilePath(ParamStr(0)) + 'MMS_Installer.exe') then + WriteLn('// Found MMS_Installer.exe') + else begin + WriteLn('// Error: Couldn''t find MMS_Installer.exe!'); + ReadLn; + exit; + end; + { Get version number } + WriteLn('// Please enter the version number:'); + ReadLn(Version); + if (Trim(Version) = '') then begin + WriteLn('// Error: Invalid version number!'); + ReadLn; + exit; + end; + { Compress files } + WriteLn('// Compressing files...'); + eFiles := TStringList.Create; + eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\hl2launch.exe'); + eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\server.dll'); + eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\server_i486.so'); + eStream := TMemoryStream.Create; + CompressFiles(eFiles, ExtractFilePath(ParamStr(0)) + 'temp.zip'); + eStream.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'temp.zip'); + WriteLn('// Attaching output to MMS_Installer.exe...'); + AttachToFile(ExtractFilePath(ParamStr(0)) + 'MMS_Installer.exe', eStream, Version); + DeleteFile(ExtractFilePath(ParamStr(0)) + 'temp.zip'); + eStream.Free; + WriteLn('// Done.'); + ReadLn; +end. diff --git a/installer/Attach.exe b/installer/Attach.exe new file mode 100644 index 0000000000000000000000000000000000000000..d46d25b1eb68420be438b22a716efff34509cfab GIT binary patch literal 281600 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%0D@v_Cl9GFUg# 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

*l&bREZEk6+Iz4TB(>Zi{ka{ylIvuN~h89mp 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%0D;OtCILASc04`QAy6gvCb0rMrP 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 W4c%0MOn~vvf(0NG+}J1 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 Wc${})c-)2nkvK6N^y2@f@_zsi(xgoQ literal 0 HcmV?d00001 diff --git a/installer/HL2Launch.cfg b/installer/HL2Launch.cfg new file mode 100644 index 0000000..662b86f --- /dev/null +++ b/installer/HL2Launch.cfg @@ -0,0 +1,38 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"c:\programme\borland\delphi7\Projects\Bpl" +-LN"c:\programme\borland\delphi7\Projects\Bpl" +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/installer/HL2Launch.dpr b/installer/HL2Launch.dpr new file mode 100644 index 0000000..7eacc19 --- /dev/null +++ b/installer/HL2Launch.dpr @@ -0,0 +1,189 @@ +program HL2Launch; + +{$APPTYPE CONSOLE} + +uses + SysUtils, + ShellApi, + Windows, + Classes; + +procedure LaunchFile(eFile, eStartDir, eParams: String); +var eStartInfo: TStartupInfo; + eProcInfo: TProcessInformation; +begin + FillChar(eStartInfo, SizeOf(TStartupInfo), 0); + with eStartInfo do begin + cb := SizeOf(eStartInfo); + dwFlags := STARTF_USESHOWWINDOW; + end; + + if (CreateProcess(nil, PChar(eFile + #32 + eParams), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, PChar(eStartDir), eStartInfo, eProcInfo)) then begin + try + WaitForSingleObject(eProcInfo.hProcess, INFINITE); + finally + CloseHandle(eProcInfo.hProcess); + CloseHandle(eProcInfo.hThread); + end; + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); + Write(' Done.' + #13#10); + end + else begin + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); + Write(' Couldn''t start hl2.exe!' + #13#10); + end; +end; + +function GetFileSize(eFile: String): Int64; +var eFindHandle: THandle; + eFindData: TWIN32FINDDATA; +begin + Result := 0; + if not FileExists(eFile) then exit; + eFindHandle := FindFirstFile(PChar(eFile), eFindData); + if eFindHandle = INVALID_HANDLE_VALUE then exit; + Result := (eFindData.nFileSizeHigh * (Int64(MAXDWORD) + 1)) + eFindData.nFileSizeLow; + FindClose(eFindHandle); +end; + +var eStream: TFileStream; + ePath, eParams: String; + eModDir: String; + eSearchRec: TSearchRec; + eStr: TStringList; + i: integer; + CheckSuccessful: Boolean; + StartTime: Cardinal; +begin + ePath := ExtractFilePath(ParamStr(0)); + for i := 1 to ParamCount do + eParams := eParams + #32 + ParamStr(i); + Delete(eParams, 1, 1); + if Pos('console', LowerCase(eParams)) = 0 then + eParams := eParams + ' -console'; + eStream := nil; + eModDir := ''; + + SetConsoleTitle('HL2 Launcher'); + Sleep(200); // wait a few ms until the launch program is closed + + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); + WriteLn(' _ _ _ ____ _ _ '); + WriteLn('| | | | | |___ \ | | __ _ _ _ _ __ ___| |__ ___ _ __ '); + WriteLn('| |_| | | __) | | | / _` | | | | ''_ \ / __| ''_ \ / _ \ ''__|'); + WriteLn('| _ | |___ / __/ | |__| (_| | |_| | | | | (__| | | | __/ | '); + WriteLn('|_| |_|_____|_____| |_____\__,_|\__,_|_| |_|\___|_| |_|\___|_| '); + WriteLn(' for listen servers using Metamod:Source'); + WriteLn(''); + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); + { Check files } + WriteLn('Checking files...'); + if not FileExists(ePath + 'hl2.exe') then begin + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); + WriteLn('Error: hl2.exe is missing! Maybe wrong directory? If not, start your HL2 Mod again via Steam and try again.'); + ReadLn; + exit; + end; + if not FileExists(Copy(ePath, 1, Pos('\steamapps\', LowerCase(ePath))) + 'steam.exe') then begin + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); + WriteLn('Error: Cannot find steam.exe! Make sure this application is located in your listen server''s directory.'); + ReadLn; + exit; + end; + { Verify GameInfo.txt ... } + Write('Verifying GameInfo.txt...'); + if (FindFirst(ePath + '*.*', faDirectory, eSearchRec) = 0) then begin + repeat + if (FileExists(ePath + eSearchRec.Name + '\GameInfo.txt')) then begin + eModDir := eSearchRec.Name; + break; + end; + until (FindNext(eSearchRec) <> 0); + end; + FindClose(eSearchRec.FindHandle); + if eModDir = '' then begin + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); + WriteLn(''); + WriteLn('Error: Couldn''t find GameInfo.txt!'); + ReadLn; + exit; + end + else begin + if Pos('game', LowerCase(eParams)) = 0 then // a small test which isn't worth a notice + eParams := '-game ' + eSearchRec.Name + #32 + eParams; + + eStr := TStringList.Create; + eStr.LoadFromFile(ePath + eModDir + '\GameInfo.txt'); + if Pos('|gameinfo_path|addons/metamod/bin', LowerCase(eStr.Text)) = 0 then begin + CheckSuccessful := False; + for i := 0 to eStr.Count -1 do begin + if Pos('searchpaths', LowerCase(Trim(eStr[i]))) = 1 then begin + if i+3 >= eStr.Count then + break; + eStr.Insert(i+2, ' GameBin |gameinfo_path|addons/metamod/bin'); + CheckSuccessful := True; + break; + end; + end; + + if CheckSuccessful then begin + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); + SetFileAttributes(PChar(ePath + eModDir + '\GameInfo.txt'), 0); + eStr.SaveToFile(ePath + eModDir + '\GameInfo.txt'); + SetFileAttributes(PChar(ePath + eModDir + '\GameInfo.txt'), faReadOnly); + Write(' Registered MM:S sucessfully' + #13#10); + end + else begin + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4); + Write(' Unexpected EOF, your GameInfo.txt seems to be corrupt' + #13#10); + end; + end + else begin + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); + Write(' Done' + #13#10); + end; + eStr.Free; + end; + { ... and set it to write-protected } + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); + Write('Setting GameInfo.txt to write-protected...'); + try + eStream := TFileStream.Create(ePath + eModDir + '\GameInfo.txt', fmShareDenyWrite); + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); + Write(' Done.' + #13#10); + except + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14); + WriteLn(''); + WriteLn('Warning: Couldn''t set GameInfo.txt to write-protected!'); + eStream := nil; + end; + { Launch Steam if not opened } + ShellExecute(0, 'open', PChar(Copy(ePath, 1, Pos('\steamapps\', LowerCase(ePath))) + 'steam.exe'), nil, PChar(Copy(ePath, 1, Pos('\steamapps\', LowerCase(ePath)))), SW_SHOW); + { Launch game } + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); + Write('Starting HL2...'); + StartTime := GetTickCount; + LaunchFile(ePath + 'hl2.exe', Copy(ePath, 1, Pos('Steam', ePath)+5), eParams); + if (GetTickCount - StartTime < 10000) then begin + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14); + WriteLn('Important: If you experience any problems starting HL2 using this program, please start it once via Steam and try again.'); + ReadLn; + end; + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); + { Free GameInfo.txt } + Write('Removing read-only again from GameInfo.txt...'); + if Assigned(eStream) then begin + eStream.Free; + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); + Write(' Done' + #13#10); + end + else begin + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4); + Write(' Skipped' + #13#10); + end; + { End message } + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); + WriteLn(''); + WriteLn('Thanks for using Metamod:Source! Visit http://www.sourcemm.net/'); + Sleep(2500); +end. diff --git a/installer/HL2Launch.exe b/installer/HL2Launch.exe new file mode 100644 index 0000000000000000000000000000000000000000..4a85d2d04505ca2d88c227910a38a2f1ea200285 GIT binary patch literal 43008 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

55V$X_SxwbIGd;j5TO>d^rSiV zUw|Xm$nX|ouv1<2C{aP>rcl$x{aeRKrK57nO0BYw&r*UQW$*6@aV4Z#Y9V$hAkTHb zq!*B#F()9=Y@kPLf_^u_>-=p_~EzUVSza#`tP2%qR?OWPA~-bLoHc+S>s1noBSMoxb?( zh%&522{@sar7h=%NP!a1B^N;;>vbjP*zPk1xyn-VKR>tb4rV#gkxZZ?Ks`NfQ7-vw ziO*!4-3ae)c?h+}9{`z;DDLLDZg#;hM#f@_TevG5_txsg{z{*$|5t=Ia$Ig@Br2{A z?$1YHn4A|=)>r~nPq%K6u26)NYx&xuZX6bw!{}~OtLYv28T2&g%Z1h{7^>;DZnJES zR*7n)n%hPs3up6vaN#o-u7g0^lH9mL#La6zM~@}lKqMPDDRe<>-|SkKIkiX0mU6qz z;8@(-Ozciy^bMTe-1?wM@*0DtAS*47%zv-C8J7H#w10O8BEUG6YjXIQ^X~Y^L7ir0 zV^G=d4`34Y0Md;h-i$86!7|Qru3iv5iP+WM3w_AEBC2ZEZH;LnKO^nspY7jk%0*Z( zxRF8!I;UwlCK!}MUC_oUyItkyA9x)YfE89r<4CtfHxUwWAn+7x+M>HcFMQ>%%8(_FF}TkStrdX0cz=V4ESK`S5e zR*^!(%pH=cw(9~<^qIeB#^b;CL6`^1wYi>hg-TCfs*3%-LJQ_uWp=~y zDdL^M0_c-MbieRLno0wo(072AF(5PaD-2QuYTfI~ zOf>x!yyf{P_~pDCB=TL;hOi8Mbp0ODUgce-C1q1gt1B=8Bq2nKNhhQQ#Cj!?> zF4rQNHH1Ea)pOFG0%KdFbG*TEkH?>S#$IiOt?y_9K$Pb!b@!j7~zl=*&3 zYa?7Qt=~DZ?)1VikX%*~LV;9d(g&a2l#sg%t2FWOYdjHpcy9My!_pM}E9lgo_o3m| zNKR<%V^&U>uEGUVg>E&t(7`zDK}q{*r?@8R@T#6?AfD@A`>`+1YM zbgAoBa{hMSy``DSHe;Zpxy`5&{yR4xyUn1tvhj_&du%oi^Ow2_Of+w9W=k7QPmXTs zZq7jenJwsa@`cjkX@WhhukoR<&(wax$jv$W0sU0&gD6@=Bb z^)1cZ__w(|reJbvoB8r}dYk$7{m0BUGy9Xf&CJa&Y%`1f@3)x`9|yLXPlH38ZD#oM z$Tl-NHonbFw6tzBZSAkNnU2n`?ro;$^_y*`_wBoFrmw1co2jXNvduiLt8dt5o;5aY zGtXbV+-91~%D0&t6*sq;Tet7rO)l*v+=CBC9-qz$q)tXs^@VVI%%XmvTttL$+`Umn zcxl{(2;jQCA^M(#kVBe!T!dij?gjNwVnP`us%%=K<`8x+(yx+CuTgYxiU>^#DBYk4 zc9?f>ct@cf_R*;Oj+~?kBHbe56O)gW;G^sPqMH=kb||78oD+f^k`dCc>yjx|zE!3N z%drtC>PTpuhJFod2yw_4aVT8K`O&Fpu~zno^z(1fT6h;4pNl5bMY_uzyS=LC90a%5a$YA?kA zG?k|qR?`(wjdB~WDOHWFeRN7gUp1BygR~o-h^9*&3g4Ghn&F#ah65>u)s>ddMK=3K z4EPRoVr6n-Lt?SNm8W##;5u>m*Vi)lCxrWz=K3mPrVy0{m|${ZUd`>IL!?PcfpE@W zMYKMeVmIwj_cb(ynrInMv5fEOUqcEz*r^>FD#pJSxj<2TLrMIHz&hB36{Mv26vpYF zp*{{RY2qvHxhLVIou2kvIsH&v#Me@Cf-gCtcp?P)*ozt(7R$gIov|vdq*PY*|1=Ov zJc_l;eeTo{3rXyPBwmI{D)@w=L$8NW>%9U5s$ zcz+`zxNF85CYzfj3f40h4-1<(b*h-@0~1eL1x=_Pu2pQ7 z160_%AezO!y`z&kW&^h0!tq~du#xwQ;9h3SKwC`)e9o?)(1)pJ=)gJE2QL07E;`R`d7tOXfX)Zc}#@^#|Zv4hU`| zAQ!JkjX)n1Wn%<_MS?3}V$*D$%E8pNgNC&FDFVhLigKwm8SjQOy+N*@CGMSH4$Fmk zgLbS>81LeQ`n8kcX3!8LzjjQ!U#vru?^m=Z;iJH=8_F>S4k9!~!<53E^9q38qSt@2 zJp^Q4ZkHRcDH3Q${F8CAEKvYwWGD&<^d)2_lHGxnc)4=~?~XI&?|i5I#^y+R72~*> zxh5XbLtDw-5M;F+5n16x{jAcpaW90mKSQqh7=AdqUNW=t%e|SgW|0hr!wV$^*`ds9 zKMS>fX}zXnf$ysfv^pmsV6blq(P6m4$}FAvCYhAL>-QZ=&b z&GKLl+5C79;DRPJCm_4V5aU^` z?!)|vgwfR^fq~_}L`ua_>>x~%^YQY;QCtVb~*^0f9EY{ z5FDS&C$L_+Jz$IT<1AqEW}hE_0diqJUyD#hFqJQWKGV-Fdv+s@c}I%b{fS8en4joK zJdYzkU3eRF7R(KeuW53YjXbkoz*k3g*I6w`srnm3JHe4k%DJ4^dFWj5owh-_T|yOo zKm*iXuVFMu*YL!z0Z%N~P$zX=G-D56S3%-1TTGU#ip{+xEOo9d)iv`y^_?yP|a z9oKdL{HB1<>=v;9Fu#MDo1j$d3prnSzx*MKR%@hGqsbU>Ofrr z;ZM!F)GadK5={)=5(`9HL(M_cD!c7_6in5dqRR%*oyzMTIyjU2LbFk2zA*`MUW6{$ z^-`5N^DIB@w897*h+>7zwOd*Ubf3>{U0a8TXo%w8kXErvxL;R0Kklup6YV7gg58K;rbQCW z2LHK`V%4Eu=n^mcXAoeK+Cj&StDS=1SREI^@X80~7X_9VT(qhhd${ZC5H?EK9;YgK zWAs>N<{r9Azm2j6Z=1GJ>F$Hz&B44(Q zaClIVrBxKTThL;|m|2u_iR0A^IO4=1y^1tT5Dm6(pJw(@lcBn((Zrhj#|G%guED@` zvltXl?A?bHp8F&vTQisu=%Wy5VSFY6evWbfS-*+S!O%OmP4$c05o68XMbRn7SBwcF zRkEG!n)wdOk9|Xq$=$w{9r9o|(qlTG92N!9dQ&&;bXU${R`J8eN<4o6NPc)$Q=p10 zIpIOQJ)=kJWxLI}USxd%vOET*vAwWImp;m3L4QYz_+8@yqx$^3ys?H?0?)&Xs_-mq3!gGx7W{Wim<@?9>#s9`h8fnf31zw2HY z8+IBSwg~CRMKgaI3@d$5QYz9ple_o8GX>w&^1j-&wVwnWb;SNg{Ue5TZw(indzL|m zn+PEV=J}B$sGAo3v{m5wU6mI>m+VPhS9@9E0!qxvduOU1>m6$XqQUj5j?Gbb4yvu9A6G}xKsGC1#B8`+LLFz%+ubJM#@&-aWP;`bjOHDCLeifP3#ld%Rx9rsM1pHL1(>R;Qfd{ zEWUR3%|z6``ootcf6tOO9cKz1#tzo6|FG1hK_x~jBN8P$Xvp=X^m_af_Dv;sN@%hv z)lyHwVM0Afr9onpMdKWceqs$tJP^QE!MIT3f`KE9%pZG^Us6oozscgr%ib&)MpY61 z+!x*hN=TGuX7YX`J#QpvHqHmI0<7JyCIs1A?)YgZ!1q`hBwJaUr8>Z ziOD#-ftObYbMqNfJ~=)*h4V^w)V9i4}e7CTtORIbs^Q zUx!<}^G@_U?9SUuOkyeg!cvhiR@8``o!G-z^}^&Cq)sp{Rkw>AjI5+%SZ%O} z1Vqe8hRgTL_j@A=HiMN5KI^L%)oJ>~NE^$A?2@4^|CX9naJhnJRH_ zOy#>x3o-u;qraNb(en+^H|7ZnXoF|mCu(DN#M;}(+!1_ z_fL^oU%_>8vOHk}7_3m-&KWST%@@GP*|RQ1;QQuZX?(u};t>s2W&?*WmSw*_VtnF7 z`FdFve62hUzf_iS2f0V#Pg&;gu9pdg29})-;!pq$e>%;P&H0r11egWgA1BqR%es%$ zkSgPi+hRe<;DuEUk-~ZTtviUAdX%mbY+@(fB1J|9PsNu!ajwNZF1#Z;=Xy(4mcrIG z8nO+-W|xdCj{&I=NU9K~*^C&F1$vf58JaASyQ-uYM3#jF!7;erw2kAl;otP(vyE!b zIp7B6JZE>ur}KJzcN_OgguH=!`^7=py(IPvA>I4!SpjYXCI`wW?b+yTdFJZB3@Ke1 z_51&eqAQPv^83TH&zQvw2Ez;nV_&mxY3w5rSt68WELkFqr7UC1USp|bDO;sdwz9U^ zVq{4rSxcHq21!Ek<>&X$y`T4-d(J)YJ)d*l=f0oM^E^!GG^#b(Ae(T1YYKBJ>|Bjy z;2%>9jr$ARVLQ=DaDmJ|vi}1VTyk5^pXdx1f)t3m=P*9+L3p$Mqyw!nhC7c&8Xqf_ z2SXAE8!WOtxh^FM@h_amk3JaJi4fPBGu-{h9|7%fxK#+{D)K{-Sm4PItn0=9y`??c z{GIv5%&7}&6VnNpVQl36d$e+2^nk@-6ZO-BRE`DS|H5N*6kswrjs3{@tNLiG_h{Vj z`IXQ1=U?LxnDut-=j-Qm74?R$XAXVLD=SS;zm^kNeA^Rxg!nKu`mA`h5rs=d=Bg&# z&OpD9NIuaXZ?-TsedfU48htFGFjiBKj{}NJsykMgY&3;4CdiQ18*z6*@2|1I5MS8s>s#=5tIG;kH|GuU5>qb39icdezP|EOte{L}OQu@)k9gT8-@rSO! z5Fe#r84}ib?rW90U;3GB$a4uC*(M=45+=C>$U7zg>(R32lXcXCC>o)%j6^YtWV= zs56s^`7TAvbBSEW`#?qVoPThrc}ZoOs%4x^nZF6`#Rg0xvw+< zi3ff(xc}2K>zBav9Rqa+!V>jFt&dk+|5wy;ejy{lotR3CO3M@YO;=#gk@pc-r;jl- zxvx_KlZMo#lpH`)^9OuSnU9%}Pe;mTj!gL9yCJ3ep4-y^JT-l$wZ11OG@t9@4>2Nt zod31|q-U~D*#Lr!#7<)zgN-f*H%^00xl6=s-kthZiQw;l3l(@RgWn>rB>yuB{Pbvp z9kE0NJr+zk6K=WHl^=vXA9Qb0$62WB=!ut5^`0xvUH4go*P`6R)Bx0U=z1eCqHY{g zeC1oOTd^c9JeF|gviJ+>6w>&`8D+|xcxjpkGn9;0n##IX))3hUyguPo-39zSS0QQe zJiIr`By}0lPAPRg#pSyixN5T194mtKa(GyEiwAn@D)NQ4TZ*V^0OF(ku{Xcb#wbFh zEu>NT6ZD@^q}5-Ou!E$49gj5F=+b1a>a^r7wE_@t&%X6q;`SiloXjclSOkw8{iV9- zJ_DN69?SlYm?M;m`6wKV3_g9Xw@M@?XQ<{_tF~yv9B^r$fdip;nVYsN(-%lhdA580 z9lrDcpI}hhjiGR?5rFeH&*I{1{@q1z7&g`76k3Tb(w#aV?CqWjHk0I;(s_={Z~e5O zX}6jFmVxJOX92xU@KwJ=13u##m9Gb(&waW)2EM3lmy`#gf?iI}s+nh23-1B3DVI;$ zy>urKWw05k<}*!mb3Y;ypy-$w)Xw?Df!ZBgK378z)4dovnzkpL1#RX_5(0Z1-7}%> zHilsW38U6I-M4RS?VbG*KJQ0vsvAjfvmJL#5Gz^bp5ChTODzHX2`gUfYHPP1LJ6PiF6USH4?vE4cRpG1-?zml zlZ5<(#pz&A(NiIl3iy%rC(ztwm15=o?s<^d^fW+;a8yvvQ+_fWR9%}hhFqgg{_c6O z>_7YHS^M-6Hp}Ih-QH83soBurEjvSa1d0cvaC-@Lfy$lzDx&NkJmN6Lv3R}H({MdP22_0e)owe?cG^z&uQe4CVw|nh=k%e=KM-g8 zevCC>+qtXc4iFo^u^auaYx*?Y{G_SqcmeNtz`xbz$tw z2hJZAL2Va89#7Vww0%^|v~@m<>ep+Vsi#Mx7JjS42O!s${zZ0{tghB|)M~5r1p>Uy zzg8A5n&7dQE^jWnecDd6IJxnxqV{%j-qp?{V>^oN+GTdw^jt!v(Trt!azJZ|6a;ho z;>#XJLNB75Q9DTwT8SAj@NUIZCr~%v7AQTqJik7Lml%Q)dV}nzOC_ zK&%WrW;#E=|K>7udn+yufP!cQtXW_HR^v;x52YWDgC|!OWf8;xQV-MGct%f2VS)ZP&&Hn>y zy^YYhc&q#&t}Y99)R+&D$RnQZxdgeTEE*XMKKA`S@D z$aXt^bk|#0oe_It(8??==-Q{GkHZS)hH>%`00uCUl;*?x69qs+!2l2pq7$!p6V6kJ z6oKFil}qnTfqhxeq>5f^jYLc>Tot%x9(O;u#D7Y_qu^nAE^6?ofI#+X zhJDAMWys~gbN_5Z>Rt=4&j~4agbRX&I-(%w{0t-+V)4Dg*#M83k9AtWOvt_n=|pGp z&BdeIISEUFF8({t~eayV`~o z5_PFCNT5x7!&O|lF{q~iB?1KX`z}ucHH{7KrGd1s5~toO(UAmx;a8shTC&&pK)AFxH#x9GQh1Yjh*E%Uk^ z9P?uq&ODrq(<)zX&RfQ&%H&2}lw6^y(Q~UA06Lr9G091U)$K^v@-Ae+e&-0pspZ z#(df41jv{&G7|nLVx-==6Y!9bxMRmV8M?%;*z+zEgwG+E36bFQ@1;*VFT2FY`VV63V(Nn9$Iln)&R2iP#K$$dRP>YL&hQ z`2(wdJ7oTZKJG?ox27BS2sSQ#CahHD0KMZp=*v`-1ivkbYsR<7H_;eTcmhtFl~sPgVTG+}R;#G4F+gnEkmAowT6mbjWFi zxk>B3oR?q0@Kew`XYiLRqPEw$Yo@Z9JUxrY8E;`_2>63c&5f`Yq_Yt}!yt9XH;Ix& zKDK5zrg7wkW{=WOrrAsn7~OqpAh?STPH6p8J^3Vd*P9oy<+{s-6#`!yN6>aPz`bFU z%0oH?_#|j{o9+djFZJry)=TT2@MY-%K< zSB$8n#WtvH-?!jKZn$KV(w?1r1buNx7nhCMIji%#Jk&@?RCQ_HNR7n<8U_4#$`E+F z_O3B|UKtqSE*ul$Cgp9wJ>jy(|6>$z>D=a`|CBhK#j^uA#ML3Ln_ly$Z-{Pib232R z*Zw_nPExtHlnV23`y1Yd!+f?p6chCG(pW=C^0*S$VcGIA8be)``L($+_vtVZ5N$*? zWG8Cl2IyQh18?^b6>F=_Q~c@bO>Z0GBs!bA(^vu!`t~4C0LMI_xpddZp=4ga;YjI| zqdhc?C?Eeua)e~)?<-XXJko8-Q+_bUk{8KI!KJ{JIlCX4{GaHicF3%7Sd^l-0J}+H zvS?D6PsOV4hWm3@y@^Lh|2nVUz8ILiWw{=y5&!YlWCsM6RSePV-S*SIIh9ntcr~1I#y(e3zKCSYE?R@u3k0f;0dnJc zUgih@+#PuBkI(!NY38f80G5fu;*{h9U+h*v@6V&Umd$w(a1qkyt}#{ zO7T>^%Ocq|75*(lk5`({OYJCr*fyg1hk1W)n^;c2IQbXqEeYq%z{te*sx0KMU6Y$z zniOlO+ML^}-jBfW&N|OYlyXt%!b~*{`Zz)Mr7J$@h0N--Hs3r6nbmP3Cm&mjx~;){ zD|1TA0nMAi@cH1g!(5V#SchQVUK+~J2YsZd=xyChQ1rJ&cp~ic0OngP`TY}YD}InO zPO;lJYtbRKU&w+*0Ty*5BTtYK1S&sCg+ffKva-pbU4v9<+1~EsQI2v>#h3}4 zRKb-B*^1p}j5&hWlPC4E4ggbuXOc(0^wxx2!T@fO4W3sdjH&AI#Xy{c zP=DH)IA*6Bg{JyVojPc2ge^x*dKS)iq;?$&UnU-4Hp=3zV#MG-8t)>4QO4z`t&F~^k+=~N zSnJRrkGkBw5~^$hGloY=95pJx?2~sH#8|t<6EG(GOR(`IyxwyC9m2rDS)7#8O z*=yeq;jdn8^{COcQu>s?2TI)adO-$$DgHJC0v76ai*YgTFR+!8xRboyu5~AZHxg)t z!ifi^+>33#7OH0G`||qIf2k%$K@gYnKsE8iOXD&~`;OwaxJ?wbZUF3jl(7*6md_A0 z5y#ywk_AURF1WL7R(H)o_E3gJwmL_+15~TV+cW}d>E9;Q2H2>c<=O7RX0B)~rkDfk z(SpCVmrDM;$#m2H`lRcj=#!huR`-=NTp~iMg+6@dWiHjAp&MOe_f~3$h7;Yde-VC= zHl72;P$_q}A=P zM{gD?^3*OX%f4aB9g0*!mzaD)1teYhs8L($2LM!eJ@WDT#TT3mx6{v5F{}^9n*m)@l9y@Rk-MwDd$jCL5ogxKTdaD->5--LZ|c>a>hA*Y zorm*23G;m5MdROD!=*2yA%mfSr=9Wv=PTRFo$?a8A@es$?dp{Pi2$5aR2Zvb^k&+k zHb789M1=0<=xjubqOr+IY_79rlrGmwdvApOT3(2&CL_j`YykH*K-{kRO@W{=ID#kW zAVi@tyh0+MgR#=D@0!=<(8X)jvmA5T>`k;K0@_fULQ)#7J6zom;&ETv&o%ubJ^?$( zV`5ww>s&R3hD71ZF!m>J{=y+6m%e@aMe|4DE{M~R%(ZKo}H5!w9 zd%zG}a9*C|hm91>TRUiu;1dyIoz}15uBZB4cK!VoDE>YydplcKWXf%L%s;n3Sml-F zrlNj1eV{ZCYjiA>>q%eE%`0XZ7o9HF7r8+%tEgdV3hwSq zX!}0d`3?VwI*iK#wW*_@I(lBPg{mEnXcDayR08~h_va#}d{#`1C$31bvM-pyScubR z8ZnMirPa6_%dFl}#0Hzkm^1} zHQQbY{cG#8Fz|r){&&Ce1KYED7ze{5vtv=SZDSC5d^@v#HrS-q|IE)WKu25fMIV2r z(JwC{)!b77c-pZG+!If_F{N8}Wp=xegwZ|zY_xjvX9-Nij~5TBRQyNz=i{K(se^mo z`{~&xa7Yt~E07J*v$k?h)d0!fbvp#f7Ag-!SY#bfnXJ#`3$aEVf z$Kn?1))ILN#tH$jHTUY-S~$T4b#p}!ozt>zX>8c#jcWess$NGXTY=&Ycj9G;7-Wm= z^ls=43ra%J2_TeT^A3-o29atslRppK)snPylE^+2Av0j;xsi}?`<3eN`1fZ-g{luNx4skd5c`5XJc5IgkH5C zr?(^(BK9FZe5onmL$+QTUax#DLwLv;7-?jHEbO9Nga4TXEGp|HV~Tyo2zkQ7q;8X` z)GJ7?0r{s&ObU0qhPWKkls1%(=t+{wcGBEWUZ4tknwF7)Be4+7@bW~U!c6@VWjv?jIf5f-~**CctpPk8p(8gEivX0-!~65)}a zf8y@~?jBuZwrmqLeCI&tLR=%wAr=p@IG=szZl#xJ#the^?^azHDi*7H7A!P;yW-Ly z?8x1CZK(F2n?$i2gepI1F>jS5N$RPn?qc^U{J{kiLsRzobf+V*u?o2yVWkO`3zf3t zZG4ClMGF4n7H3-rt zCZB4y4OYO|8#xu-x2qERmQR*EXz_UsxZ7vjzWD+DcK?MgEZajDt~ePXYL;oSpKUSz zpjGjC-X8DX5MyaGbuW!M^b?(cR6&|E*!oReUvv1jL<}4Pa7^sZS;7`rS<&}yj;tjN zK%;r4d5i#SnT2sw-spje1kaRe8Gjxk$A1p@lxPq3%@R~US-bZf-MxscKJ*;j;a*(c zoxIeJz`B5*Wd)#KJ+!GU{v^;3wfKYyFjRn<TkBU_Yd5hX1 zjMxTmCLzR{@z*h7%N4Ux@U*s}r|xJTg6Oq(H7)go!)zD+o?Y{G?1^D4E ziwF($v*c4kvyOv72*e2@Nz zlhapl;8U0V5|#DdN&jI-+ThUMC4!ZwBs*D4Fbr2b+gvUzo`JkQWuG20cEH@Hf8& z={hKc1~B07EdXO>#pRhb!|y@ocPv|Rj5pbbnF}J9SE{rWl5G>=Xr;ye&Kl%zhuOJQ zn~+wky=;&MjDr1{FPXv;$W6%Yp*2ymSA2L~x0V*O^`?p{VR(RAt50&%1YKHP?gCE2ZSv)#s z3i$~N;#>CNQ3ko$BlsIt5E+WSCBuqXe@Tf{5%rX*878*F%RT^e8Yqn3=@z06D*nqd zg>X@qlLZTdXpXHy3Cs69-m(?&1D4O!FA-DE?*pafg|ZaQuN}i`bywQR5@saMH&lg= z>I;(1YO>XVuzumC%CX*T)kdak3k?#=>Cf?L+hm%xAn@c_he@9NOQZb~R0SJL*s`NM ziiWqAHC(nQoFIl{@&9-vPM{W>fpXi136$GaW;(yq8mC^s@YV90h)eaEt56M#NpI}+ z-i3@+>}^WE*P~gkC{Kra`C-0z-rdu1)9}f#;Xfk4QzD0@8E-xLomi@-i2c@Zs}5Uv znqh=z@BTB<+#U zA6CfAE-njqsV0w{dJ#%Pm$jCu=+mOjw8q6kIGShK$$xpKxFX+SjV9BAE&Ka{(<8I# zZ_`Alb8xzdc<*qMvDTNPyS5*?EMvzmZoos9JMXwfW4jzV8?$hPvzF~Um2o-zuxsBt zZO?aQPqDF&;Vj#C+O~B@HAl?L^t2D+A}lpGFzwFSj@1Bcyl`z)c=?^+ju5yL{kXk{ z?N-MJtkZG$u`5aD94*gx+D6zKt>bIT2P;;EDQa3I;bU?dbHep_0eSx!FS}?I+Yv4B zXHeKHjCBX`7~&|+^3!DlmW6j6#tP>K&uybXO~MP(r{Lo3#}WA4aQFN$3*J88F0GxcZHBK(`?MMd6UD2G0<%HAVldNX}j>aTBK=Q0O zdCVU@Dvn`QFbj%r&74cKjM0;ZYgI80HbPkbyj6&-^2&Cc!9p$#SLzltHYic(Ury1;C-BykzYmzGyFi+Qaire`SVLwzu<~_XE5_l(x<= z6ZV0Bh+Wx2phRy4ksFVzAE2!0*s@dkKbBtkz;tLL;! zqulT>2piI(&I)6JStw2x=Q>8xh=qrY&?Tf!w+S*4KyzxIZ7jvtDlcF+5|0{zO?8;Q zXZb#D`@h@8a<#D?%jTJIC?5`<68DfX$bH;c;Vmf^4b2V;9*ADeTqczBpF-hL2_QD(;v9z|Hole<%-cFyi>;4Ac)YMiC){5XjteO=3n zI;6bVRU&=e$Y@!8_?XSje4Dij57Zui@y1YCh@UqjsD>(#F~zJ%0TF0KyGxv`2`xK*R{LbM%C|Be$k-#p+J`0`;J&d=8U5tl(XlhM zH<)a3?{m|9fV4N)W_Z-GkN<$%HqApy?wpNvEuuc&m>cwKUXJ}Ut5S>2tz3I_Q9?iq z%P_c4>`RWzUqg&5A;yVmy28G%=zg(EA-?nj4oV2&8DEs4iMw~)O0XZ@Y|0A? z9uF8-|KLb5i}1@0KyobBjour*M`@{Z@XxHnLpDtZy?rYrhE#xxg7*h=ax(%D6TXOv z&z7G7&gXW{_(qi+uxDT)z7oEw$_|RR!wY=_k7U}b`+gA_oiHoOl=NrG3TK-RZz;dM zI>wWe|9)Z+0ZUG4=2W`29FkuKEpn2qYW?5=AN(i_Ojhe913i?$Vov{G9bC|&ULmKl z#_=@UMwU|wIrjk|*U`1gHi!MpMQvD^KjDHZ(e>_&*nIsoE&$eo+b;hPEQI) zkkuYdx@Hn2a?7|w#wd% z;O7^=S9!>ve3h(%kd8V+i}Fbo^cv+wK|%E3l@N_v1e(D7CslT+wc&q&oBd3lH?RoP z#3`z?>$@~;(_ghW1L511vyOgy*Hmt7A1Ja_BKnS&*lavyjre)ihRCdu$7z~_@a4(| zr{y(zelk6(P8z@QOqHu>$Bn!caqTOQJ$9Z6(~4pz45P9< z$6({lA*816zP{qg*%28v8#bt`(xa;_iYmuC2bp=%MJUiMxIN#2_}FQsRhjdEzcoYV{)BA9+C#R!-oQp#a^vP9QG;=lGzh9eS^Td(M9LW>ZT$Vuj z%%3oG-PYu8z{?z`ZU`9Py=41K=#XJi>SgS$9-1g@_L?E2F5ycU^jYTw#7|>CEm?}V z^J3y&uFm1990meh)^B~VvCMpA*`*|@!k;U^MmH`Dl$DzzB;T46&2xfgKQ!#cH_xnw z`&?f9y|}xdzUvOPM0Mr80+LHlHXxA!pO}Xbg8pL=K`F~%Ecc4GGjT)e=2f*mYLvSb zwON2N3$WRq@*mXUV)=2r+t8;0?buepS~-+X+z}H9Hq+eCd(z*pxVU&3a2g8DvjT2S z7Cuznenw#BrElP3bcjtvavk-mq)CJNj*>mZ6w9*WUGY;Zwqe|4h?-ei+Bb~U!fTM0 z4W7Y&BPhR}W$M{2f<{ASZZe9I%fg(lkLfDW^5Q(D&7H_mva`-G;|cf}QtE|#+v8H0 z$!9>!3A%LV_5b$pkr+n_uDeBcVrCnVfjyRIhNyDw;FGWr1R`Va1s28bD(Sq&NdFlv;3jJ zvnYLomA5&+d|uB#_Hd)@{?!^ZE$Qa|XhX|XO!05{58&GC z=7|$kG)KwIo7w|-C$f)(iuUuaN){o?5iO|6Oui5%J=1vPjN$JnoretB$FP2CI8sXV z+QY-DUo9aaDNr=}*JTI23+S;1v$M<+d`ymkf*uItRyptc6Qf;%9>(~0zyKGLLtOgs z?rOUC^GWP9C-`87fBwu<*H;UqNx2X^mrAs=HR`G0{LKo&^|0enFuFbbnKak*KY?9% zkm}fOsjpUViOvvZhAT^6TifvAIH&QtZ9p|@YT^h3Zx+^6MDBShVHbNbaWwSxFNb|o z%Q?h4Ax02l%F!~oH<4UPm@At%$qDCcoPChftZr%k*3ip>RCnL}Ep6DS&ywR0_&x+x zW}Aq|e;Fl{*6)3~anoYL@`%CwMLE!kq24FYEDL!4sd-!;zGNr?@4=&8A_{!d#xsE& z*~Rz#YDfCL5d4g>-O$W)=6&i)Yl6%KwW({0Ne(HT1di2_`;vP(Lwsh3pCIkAB-dP9 z*YRbCv=ol*$aGq^+xK_8lJH!a#P%QmK&ZC7jIqafY=-WP3Qpv`QNM%eSMZ&)CH}H@ zXH#oNn$DKIT-cxcwn=#xKcqAK4GTVUN}8=@8=YT&(>F3+w|dH-c^LP42QyE&A%E)Y z8f3j4Rx6AbmSbL#Zj_$HzDV&S&)%rhYUmdQh-^2SJO)n*#myY_zBoDEiBl%C4>W}~ z=GI6vaE-P7NHhp>?M8!)VZxgV(&DN*>+9s=(6!~BKuGTk4y7f)MyA`p^DRzv-c)wS zbQb%3ZB|&r?Ok{_adKRjHHdsEIvzL`a#_mz#{rlPX#ms5hDpN)UYevdx8MF0y5R)d z`0cm?I|Pcf-CY{IWdBMh^%AO|D?jMSuM2j&jP83^(T8E57na7Rp<=Xmmjf4M_Fu$p zXL5k)$G?|+b*okdSAXxCZ8|uUeW^tguSMw*dg1DMl(@j<2ai17MSW? zIs7;$!lPlYhFX$cM!c{_ZOzj2nh17`WCf|ELL|dT_~5=p&>#em0M5mF#q@?DUT$Dl z5wWQ0SC`%~2d=RlOVu^QmL)AOCuiNFdb1bu60eZ^&6~=~E$aHwl~&Bj?SR)BXmq7@ z|4TQ26yevf3=vsv^;fU+A^y})HbO5)EIBU`bBzE9fXk0%wCRM*vce~0Jyw~=QruF^ zGAQ+Ghyi;>P9Ly7u{2XVw`7DrMUfYsFNi0I%*&Q>!%ZKdSLsPyyyL@NA3i zPsA!#=VR#|w?weRN=RmP_X;zFmtWj~Js;c0`;dbGypXe2cDEK66?dUQ+(pD21o^wk z;^adYlg-5qA*6z~5E*fj3lT#@w>;$VabWbUWDUOg`DN-t&zD)gSz;HAqB_YpDLO?i z?Bg3BpFO2h;HqlS2-6&Sq2NDUZ0bXvnd)m9=5xDjt8oc9rkvYLjiVmSeDhSG(jb zz%N|GS3{aIwe(SK?Gec}^WiJgE2H^XL-b|SHvf4sDGflFg?#w zU~TKWnf&>?#_9lZ3br+tiaVg#Zl(YeT zIdAnfYawjgBwN<-fkkL|R2-svNNV4XF#{bt_Z*9G4E4qV{dj}B1>gyWzA=0Oei70z ziGUEl1K~DKA=W&M;bUgTh=}kz=POA-Km(4YM7zByJ+2PDcS$Ts)2>|6%c=EL6ETIE z!SwS!hus~NbaCue6m`q*fv2J-tJxCQj7;N*C&MD> z$?b}Sc!A!k$!FE3I$B!_@-W;Pb2lU9o5-H~zhPf&8?|>Tzc=jTV}wk)EZjR!@*!b~f% zAka05I~R!%%HHaM^ukm|hd>9 zC|bPnw*pN0f|bAu`ff$Rq2uj@b-Mi#lXG$6`k%pjG4?wb7A%CH4FQU#XtHsdSJ|^BVm1YHh5eFX!L-N zbujpR_yizl+~21cPgf`b-L}vFP;*~EoWzAMc=V1g;-4IbB{18!p$x-|kSK|GtMmlE z8JxtZ_O==LqFTyqQqC!plyDT#|9#&F?IRcawe=P)em>j5nCIb7B=RSh^njPWy`JaML0%W{JMU1`(u5ong*R&-bUYEYr9!rZ zmewkP8-fpVFiB-;Adzo=apIdIwb9J%)A(ga_bx;RM1~l$og0>)?TZVe5=kyz61Ub; z4~sp({n?w4jes8z?uKAX(e5F)tAJ%pQeq6dUdARdbF0#*vd1)c#CoSpS)8~$V`JEZ zy`?8h&Pi(v%rzHt;YB*?^9+qHGw9)0wo;%}kammYaVaJEwsl}kldWGNN3Vw3#z-c& zlK&%Y@C8Y_+usxXH3hZ3$n^Wy~&!0 zyVsVy#FU>=ydQrcEO7?@pzh)Sl_eh4v;MCvkzY{QjL>8kU9G36=?|LxH43Et%>{_6 ziT^e{B?3%y*GGJPAg%hn|F1WHqAFFQjn$m_mPb&T1KRKQ5!U!iP3>fZMOgotL;m4N zB0T0E|B_h(JQqFw)p?=da8Nv>XYImBj6M}Jf zg*oU+M7jGNTsxysl_7Ow$HO^p!zV2-Q)49rP!Y#ZQwB~_b}75e9Wnq0QJS(kFaI1I ze{u{YX%=5EPrQidaUDMyCar#2BBuV>*~olAcVU$Be?zi(gue2Bp=dv`LC?tCGi6+7 zmp3>wd01!YwV{V_@PV%pY#ZuSQW^5)?8P{CUo!c&HYbv$`MRCpq5%$kk7GepK2 z(td9lO8YOa;VJgYqx}o(Qc4r=>`|GRba0fy4YWxs+W1(*?zy4u*@ zV}efkMM)1L7F<+J6wsLwP(zD>1C7Mh>{ORKT;aoDoQN7pq|N4L0~fvxri-d=5Kki9 z->Z{8kkpu+{!xYwrw@#NM|aNG|C-^gQa`$=@5NhFYVPKqf()F_#$ z*F{LwJ4r}jqhWKa+o*VQj#KY=*l^T{{Tc#J2-6zb1k_1_yS&0HGdo|0G2s{|S{7aR zlDWS0F;I;7QM=QDpiHK;iA@!Y7E#Y!OK<9ml)$?u6K8oVz;ZlJr2$qs2|1i-M)(i` zEJ2ZV<7J*CK#`Fw^YazG9?g6WfBt4Vhfdz@HDu>88Jcw9Cc1BJrE7rWvLroSmi)fi#Wq9YRp|C$)r{coz`o z2?vHt**-cnt=C!}u0Zm3?7+&se^;#_c~*0dD>3xmWX$J`D9~>*X90WVpp@5di37@Z zBP&nbieZNG$K@5-hyFn{{@f2l*ru->IFM=XV?JzML?EoUt!x=9*B=<3pi&FXQoHQn z!^hO&C}0l{pV4=)m3yP=rmZ&Wo$rhHmXYRXdw=g{r^a6W5h~x2rb`JPT0*Q*FIKwJ z{)CgKSfwuFFcT5=8>P9DGU7t-veYa6@bAHUY6UD?D?;oKhbMJ%$L%wy`i3#956VSMR%f zV@p|uZ+rjm3&BjAL+95LM3nk-*xjE&TUGx$^Y9H&^9D%I1*yv{P9sRf0%8MrA~5jl zwd|&YgOvP=bg^^eQN;a$;zD-|r_9|S&5BYc^>Rv=;$!vgV&Qh`29Afm@r+(wm&E_t z++ZicO~P625W7{g3hJA7HAuttXHHHjmi({M2Qk^I&QH6++E@^BhRer~$b4qLEj-4B z27_Payg6F&f^H#q5|O+o0%{7LNjy{GR4!z&DLATsD(MuCYu ztS6VQgwN(AisU$^rAXV~*T66OGY#w;whOWc7Pmi%FWTnpDgBqkd;C>zgRRy4%fOe6 z-wBQNXWt@oQ0X(OSNRKmhYynhCu&%TB{h2^X_v9T9uCMs+vAozCid;tG{RQ5tx}p< zM5Gz6l4BA zJt81QSl6tdh(;b>L{Edo8e#9q;v2>2tQQM_&*BTYs?4vI3zbXD(`zB$=?y4-aJs}s zifec7_M);izNp?MyqwcpCCW`enoOx&O9r2l1Qbkel1%$p-*->WreoqF{vATyd_rt& zMh|>Ad>z05)Xd#Jrf(~rOlLe4bDeO)6C9bT=Yo7tgDyLUyUCDMt97=|I@>T5)q6r)`OwPk~khsn;%uJ`ru420yn@4e(Dd*FpM zUK6AOx)yXh#)Eu?Qo5Hre<(FD-MxrIHNJ_*_EYWNwo-fDSqnt0$q=B#EzIP?4A0OS zXruH@jUSx7i=B?KMc)B~MP{Puu2rxTV*)kT`KD^- zFU9bEw(Xj@geN?k8Dzb07|Q29Pl>y)4rmh z)k5!siXk0s(sgt+?CY|v>!QzFFssFm?M|r0D>5Uzt%eSlW<7TJnKr`%W;6Z%BT54?s?6 z1poL~7~BzvpWu%%T#Pyp_-F-q{Y)MG=E>7qP|*y#?IYHNK_Ms_MmY5cw}ygp=PK1i zUsVD?gc3du_ur_uScSm#oXC)|>Ot$5cLg$8l=}q=^8haqhgeos1Z#Lns|GBkhS#Rv2AX_ploIJuSb93AR7lfU27H% z<`m$!8>f=HdQr5KKze;0$3)``K+yShCS+W|Aj8POK3kL|4q%0klxA#)gcl)@|FDTD-a>GBaS2Omi+bZmV^9N3 zoP|4zdhuuV$|IMWWA z$!l^HF97oG`fknqIs>A><&}fLRs1h^j&10DE&c}4jc0!8YJE^Q>J{mCE~z_^TqQKmqtysBbEABV7pR$oT2%< zz+O<(fv%!UFS>PO`B_bVE7Q=>LeEACdmf~5v~&MKr@|;0WbWaTth-EZ=9`+m$o{ew z_`|2%{jg##Xi331KSXO%Y$FN7mv9CJfDX#6MXwZo+;M=JZ&qOMSI1G+JO3cS(Ud4&T%J z*+%Txm}EGpbV?Dn?ZvjbDc&{)9+CbCC=+eWfXlxkLl!qkysxw#RZXwK12mm;$UN5J z`}QmS=4HWPzNYiaK=QY(tN9n~+r2 z)($Tp;RrZwK%05f$B-Od4Q9CXa`H1=oKc1|&JQvhgdP$6tO^6tJcQ=YWkDe-5$-p| z>=qXN@^Jy<2Q?i9m-904`?P#lKK+>W8y}X>*B7&guH5{&hQH<-ptZk6qAHYld865z zwHEg#(paK)z-%oemuQhi;#@!+3z)Nm6uV*-K0aG4XGS1L2c)m^D(1?fhF~|`ERTR2 zg9OR7)zQbcO&%@R3Ol2>09t;`A3UHL_S}2ysMUF?Fa}r6EESF*M2i;1<@)AFTdl~P zBIol8OG9KEG0>sNU1u*&kw>Drn!Vb?(J6fa?`6QYTUmGKEY=|T@;)hAij|x41=;(x z+kXLV@KKrjorN6vC2)qc6mW1l)NN;qvXm%*w}e9|wiFYzbC>~|PwYDIt~(lf(zFg@ zNkG$NOHyIJbwOIV4yj+DJ4TJA>cb;Kk7EBQn|E{0EIfcGQ{zaloQk98TX)rFJtk#` z0cW{^5|NEIBtUBvNgka#f2nv=Tp}3MC*hm)MzS=t08|@Nvr)7}-SoZUS zY7FhJmjT1@PEP^ZAg`O?CznMZJ_J*CDwM_r4ERl|q&9g${(WJu>w%E=kWj6-%sV%(W|R4h*uJeh1H!$F_&YfK zbEu>TF|z(jVPd)A8(IGEPePA4cTvk4&&w5ID^YGdm-`z$-t*xls%qIbdDR53{aypP zeoeIb`I*i0uI4i}!Bcu)jD;z}sFwxKQl(`xGh(vmgwE^Yei7*TLCN>^KLUNHh5_r$W?u}1a zf&F8PlW6Ls@z2Go=2Di|I>Mlkis2Y;vYE6d5~gnLb7Yx*k(YRWg1p*D)0eHz^U^pL zH8D4E@o0hc(38n87tNy;e9qnZz`;E+lGQEUjZcLEGKOvf@%(pH6_U17<6xz49B}?rnEuc{ zNS5jyIa~`N|K6L;^WU1?7a#6HPV@VAk4gS!rao!tiypO;-6!r!3`^NAKGa|qI_5#R zv@_PTBYeNH5)Z16s3Uuk*s6*fch#C?{mftY$*E=GP!YB{qaG@!M&vZt1UjGRrQB~k z)SZU|CHf9VQfI(?p?v?%dmA{p8M|jc$3kb8@SFOH-LnWII1dhyUeZ)4F~dKFEXiS^ zFjk{jLB>8?q*?5z0y&A>d3SsyIg`3}14mUG=YK)85Zdx897f>qwQLJYJn6llO=`Wd zbU&D9xD-`)&JlYSHAPN>3|{QA(fdiSQloN6ZP*LDEcmh8zxAV+yp(oYCt>_eUske| zchF<6f)4E;F4nF8BBLjMx-(OE;qwQgk8a_X-r)m><37e`_imOPc7Kuw!NAMgj-GFR zD?W2JDCsft({u8Pk5dCF&Aw|_$7Hce*TZY*Tg&$D4$yB#5H9VwiqR*yS(*|vS$mER|P2}j~S*k&8C}55r6x?1J@ch{urH}X5{#A5|B_bJ;RerIxb}>NG-(Wy`e17rN zMdi1sb+{}<`^(Cyi{`||o8F-hRU%PSIf^nfNZeq#-yj$&F4=rZDg9o=i}m}|)`$eR z$mW+PR&yL5EwSWdLdAGt1DX4KVwXJI#UyQVqno1jUBSvK4n+!+XmZwGgFOmAm6x2n zVn9=v^MQY>0Q;a8t{dDh*db#Cy??;8`pjb7uZIqZf)L#1*KMYxXD-PuNi28qJ5O() zHaYk(^Un0)j~COfj`s(m4FhE>gkJ`|B(F9Y4S|)dJg<5N_G1+WN@E%nD`exavq$dQ zd)813RiY41kP|q;5gQqvDOuku#J;o1|3u;TO1&XlrM=c5`Q+oMrNAF+bhCG4zW-&R zNuYC3u?cPsT9R)B`=4lMl?RvzeH5qa6-b*m_=3voGLeU9r#))2emwSARaz%SXG_$XIkStM8|r*79KMz}nU* zBkzJ?+VImSrGYi*>@k)Jv2d{SHHqSvOwS0Uql8T|ocoP_DV`)C`?p6Fhv$w>B>&;H znhOmcpN_%~*KQPD2*K|04fyn1InM-9bH-H9sk*w!5e5yDXhm!c>K35aZV#KDZIs>K z=;dak!Rwz@n@*HO!DnbHHKb(&v2i@f<)^*)SEsTfK`-as5jVAA(`y>luMMhOi0ZDP zHkNz$sU>L*lFk-}U9*jQYrYn)Dtow2f!QQh`}|c!Jz!P$`)jk#WOXsu_GRjHe&YYAA^^L;0f~G8&Vy5ZAoD zCGxsVEJ|LT+8kwK4{7bU=}R7PZi}+=uS*sCWAbzLXyS?KI3{*Ox?LLgLx;Au3zeK)1ihzW5(^IA3$1d7<2QIpbTXS-a62$DFea(UTHVFeh!Q@@{HBDdO?aZ`86p}xP z*}8OL?KM0Hu;j)@*KzURW%nZ5^}6rD7aaYw=j%?~b(kozhO3^-k~z;9E^AnZ{_0?k zb;zloB+=p}H5~~0Kk1lOXmX1loy)-O=(zGM$G)g=ph!s@+rob8m}{tmHTZQ9e$&Rupj=3C*>Ph zF4(`?JFz6$8sJ^==H|I-EngKW{{%tK&PX2x^7PRA0T1v3&GFkn+1E1lf!0z-orD_4 z;h@vHr^$&jYS{BSPj_CJXW&m(zte%_+}U3F+%fddIUUUY4(2pahCbAR>B0Fn|$PE9N@%mDE?<@f}RafM@glYQ()@9Ud87Kk^mhqSh~&Uo>SUd??Q@+uC4 z*!LVzhlAVR;T1IFj*wkA8gtQC`gc?b9ntrN65jM{%X@!kbI8f{_v(#pOF=m#jk-EC zSy}rXD5BOvY#_7tzS(5NpxzF9=!Q@gk09*;>+7zCnU~k*-npmSxTAKPVwdjc4tHz( zlbWotyCDCXNq`A9RDiEkOvZ7+B*;Ub@@nwnUdiptJN^KLoD;+Cg?UNVPSsRbRKyvQ zaUD;}X_~gBrKRP)KR=Kx_ejuoI?5KE7^JmYS~{toy`eP^Y!#8(TK$|N&t0PNU7Et0 zoP7z;4tvg>kt>k+xGMyt#xv|Y-l$RFNatEdb$JXnWJEc2-*7jqoX2hx%iIPYbUU$= z1D^U#Pr=zoGV^_of{}BCTWM;-9ppwps9{^$i0$EarP9$tNYm9Vxo(#c1oayi#_m0H zO&Mv71HAmqi%f89cs~mN7@ecOKKIGiEd~$7zz_h;$p;M1We$h^%uE=8CAxn zXP-1Rvu*SeWA5UZH0mJQC}Xwr^leIve+(>8JnB_ka}&l0MnH*g<_&oS>X+c-*c?35 zxZDn~Z@QfF;~rrrn2YCg*YW=J?zqO2f3VmzyWoc$D%}ES67n?Hb&Q&*5tqd^f&MIf z2uQDnWoO7(C)&Z;F}GCl@pu+wk46k7Ew*K)frS&Od(#-4V4i-O(?f}{ExdOeK8ejU za!Sj14;!_wDd~ie6ay@G|CP|uSA#cJhd;c^J6~$GhBqwvDs!Z$) z?@Co(j;nG#Icz)Okv#0Ld&WkPIGuQ!yC2F+xEb&@0Bfv6wY$q?qn@>mqv&QO=ZT2q zlqmvt)P${=nA?(Pt;mQ=v+<K3DEII)!Nv*i z9%zMT_IMbvmbrA+D91=9IT7zKL>Rret;|p65s&?3H3n;wnlLEgd3IS# z#>r7Uc13rGeb17WXE=qElz%8_+_-=j%IjCOzs`OTR)SfydCKi5ea(}HT^K-rDk7vx zTUO8Qnlnt|*=dX6&1HAlEA8>OL&26Q;RsqR6U_}8Jy3!lxr2}A1ZO?kb-{gTS3NaC zd~xbmN|u5vP!Z z_(ZO7Uv7i3PF7e`Rl=2qal$52R&XYElLlJ4>V-0Gmq} zb^#Dj)zFHNAk>mJ(h<`i8Xow%wKXs}@nB%&{`BONse7V}^`Fi^djTxGGzC49gA{u1 z{I*~D+7x4ij==*I9^PzYOF&dN+h%TIx!uaz#+K;f>gMhtaF#O>6q)<_PtwxW0TlqE zhE$!pV3a8jSngXt^|o#0odB^3`KIOE)yZgg1wp`&dYUtE-Pl`}Y<5f)T6su3(CGqj zaq;F>lrBui#DJDV*D8XPSBtjto~o_C-f?G`A<90QSy)~hvmCm(35`R`sQ8QSL)SL4 zba3+%9a69iiJ~!iB4#Wjr>MMoea^zaw!R-2Lbyqo4?tlw_TXUTE&5)Bt?j^|!ro-< z#0*i01Nb8&<~%{fRj@YdlSm7i3wS7-Obj@qBF0cj9!+hi``E1(iC02ALlOs{t{c7g z6g6}j;zv#vmVR%u_WGU4H;hyCu??{g3VN2OM4j}CNXVdB$3A!uGKPptM}216Bqpgd zKYu=0z1~5~IX3d^1{6v&x~z0~9;f`s!J!rR7J(%ZTf{J9wK>ycJVQ&Fcxe^d>-)>_ zXS5|1!ZKC<2u9GiK&5JgBZ8j^uPw_gK35I%a8>uW5UvJ z*!2$Wb*ytJGSRExlJi=ROOP|f?5q$F5&?AMb4k5QY$?&)16`mwQyK)t9&QycfTxJP zF+Ls!xUNIKv8~oo00|-C>j}66-ar800R*1dI$85V3)ltl0X&cbFqqJ_kyj9udlJ9{ zI1~I;mTWu@1EZlh>bJgF`1^4c^#C1teZW9=Hscy7$<#P?6NvrP_V%r{G8ITb&{cJK zK@Evk))aY!f2usIFnV3Bkrj#qg7b_i^2Y0@MtD>@Brf5Ka$Cc6l(M0;i9Q{a=*V17 zUp<&e2~O5$Rra+fF?p{!2;;3}6s7%Wf1fP-MI5ln#c(Ld^daM=XLN~ZSHTZ0Ok*yH zVIf0-SkYR7zr^0Y^-52pAIye%0EYx`PjP}TBY@x`$7@MVui^nXTSCl~agIAnY2xDi z_kje2JnO0SRqw+6>mQ56 zKzASH=QSj8@?nw5y(5sk$_D!fNT@v@$z&||Zif?8`Blgpi}hY(XL$s~Nxo`xLn4li z`6U3Aa-yw7sPTf%#oZoTJfp~l`GZh*+b<8p09;9Ip^(>;ju3cyTu47$+~uMbKl_+l zoY(&h$DUp3pZz(#17D~dMDr$aW292eR+3%M(P+bOBvB|rIL@STEHn2cQRQUg+|rA* zpVwWTW+MbQBV93erZicJ(|0%g7Q^j=!}<5;w8m{YFnQTk7i4S{f^CIKGj#p8&EoU~_NBZ|XQ1djTR-FO-VAHN#n`b=~HKY2(X zO*1z45}wvkcB-tB(Y!^lUhM8pI8W8V*iiMQEij-Q7iC56?dof~_FQ}YMRwIl1Trns zVq2qjfT6x;7eh-2r8u))m*RcwR-F4!z8ch?d!D}CSC$#{2mY+8rgF2~W^CZ;5d~)( z>0GX@3%MzEj4C&MJUJ6bP;Q~U%gv##@_t%(Z=cxY)0Jff;q_RnbD@j}`@7pEWiYAw zPWbjA&0-9dbx=oI+dl$+v@l(8&u*6f6GfRTVY&xUg#%K z(tj13T~eh4t@tAoRuWBmC2&I{M!V7_GVjzf5Q^1izW9Tlv+R1Pl}@j`DDJyKwxMOb zG})ExE5(omEnIXxiJ}6DAcXogjOw~!x;}Mw(webp%KJ)+NwL=0F2;!WB~pr-A(+s3 zmR{~2aJ~lDUcLoACxskah1{1M>_lPdbUHV%Qdis7TK+Zb*)?s+8%J~7dLrN&wpZ9a zmnU9QelO|2_d~{M)=T-jkyn^uzRk+%wY3_|V|ruAd=}-UG-b952=@+#1=>f%4E%ZyMiG;DKR`&5myF`IZFu^Z@<|>$$>21Qo zgPgV=`(%~)Dm`5GojiJ!ZW|+yv94@{|DcS2uUwSWB;ef+3*V?0XSduv?ATXE=_lzlNjjQS0u(jM;;_K{8aY3rVU8x6F|;X z$fyc>5{0`ySBBKg&blIwa4l&BUt;hM_M4vBos^U*rpDl%MylT6eilcqQPp#;P zN3jK5uTZ)@EO!Z^t$0bK1ZCa#uJh z6UN~1_!MRkpUz1OdY{zm2&ePRQ_`Ef`!Pfw&p(zgb>&gS&wOe3RQ2|$ALEeqfpK&R zS1t>!c_bvs0{7&^GLoLkb5q#qWf4vqbUWp|m(_B^4=Lq(lR-UcKOKIh@~MNY5d*_$ zW!-A}LCMoC>_;xD)zK5HFPTP7G>9YA2_;moPkTA_Ro!uaOCA>k6d?OKeb@}nKd#*J3BL*CI1(vTSalIIZRF?2?WD?E1VZES6 z7)tTI6rL^@(mZ~Z1;+$0pH?-x?@f~?C5t1?5?MqP!c;u{(3Li;^Vb9Tmn79A&cPst z7*{5{adNeddjWSPgxx9`cU5&#!A9&ZZpwJ5^Pq7^*LEt+)d22BWEpik1TeCFu9C{!XP&W+7o%j?8GQ> zAN>B&o*lcLXUL#BY#%eTWa&p8d#HZG3-q<7^{iuO6)tUH?NnKo zs?VuvGg6R!;@ z4VW(L<>1qtsrZpMhba4!6+`&iway+2EU10Qh;w0*3Gqaci!W`l`IMl@Q3EU5Ih#;S zJEwiv}8dQHJtBgxq?!_9{@(4GQHcTyX*UXhCno?A*6NnUZW;7*Gg}9I8?gtVBjJDK2DDH7FmK(E@*0dS52p%lE@HGU|1Ttayv`BaZyB2@vp?Ah!T=CqO0w#hpOox2^uXYUe-8!m~%V zL{S?>B8pOd7~u(;<|7K#vfpmvra3FE-);WJ;JQH5+*LmEF9Ytvw!!Q-5ROFmyqKtV z_PZ?}FaPe}?Fauu;p2(_q5s2Kb~iZlEAVk^EBhg+SjIH_>t+h30PG^_lsA8Uk-D|D zRaywn?t$hbviqUgi%`LP(1S%k5xpmWy=@W+00jt7qc;v9!Me~1#Q#u;D2Rc^b-xko z?!q3rqrV|sdINg*y)G<&^7)i#97aJvAp+UOb0~~~7U!5Ld;kHUk0epF@~so4qWp1@ zJFza_O#bI^uMZ8OTPMmzq{tkR56SL@Ei1`2f{P`{Z?p&b<1l0VginKrFzuNn=piV@$_KKW<|84Q#+l`87n?BI@ ze*B00)8B@uRG}XP%={1S;zi|a10cW;`XBE8HXeUE@DhRZ2nZ1SAMBDvc3uxb03Pz+ z`}_WQ??jI&8V}(&Q4%#R{BHTr{(t|0Cp-duAKL$rf7;E9>{3N`^?$R118#t5DGT@k zL{Sp0Wku);_=-ONwxR`G(0{7}bb-M@sVMzjMnrneKe#6%z3v~}Ymwgg5ALH#Z~X`N zZ{OcUJQ@N9R7B~!82p7cf1$@;81@(Xy6+5d_Y(yycJuQCD6|wxGUKo4#eW_r|4ZS1 zpIH5s=X2?tzp?<}$EMKy7_l4*CyfXIo^&3G!={RknRDn|E&#ZvGX6#UO96J$<3+Oz vE?xBZDC$`lg~OmE@m$%--?e|u+}u;?R6dU`as;?0P&fgiDb@G<|7Q7rIt#D- literal 0 HcmV?d00001 diff --git a/installer/MMS_Installer.cfg b/installer/MMS_Installer.cfg new file mode 100644 index 0000000..e9c1cc1 --- /dev/null +++ b/installer/MMS_Installer.cfg @@ -0,0 +1,38 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"c:\program files (x86)\borland\delphi7\Projects\Bpl" +-LN"c:\program files (x86)\borland\delphi7\Projects\Bpl" +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/installer/MMS_Installer.dpr b/installer/MMS_Installer.dpr new file mode 100644 index 0000000..09273ac --- /dev/null +++ b/installer/MMS_Installer.dpr @@ -0,0 +1,72 @@ +program MMS_Installer; + +{ + + Metamod:Source installer is published under the zlib/libpng license, as well + as Metamod:Source itself. You can find a copy of it below. + + --------- + + zLib/libpng License + + Copyright (c) 2007, Metamod:Source Development Team + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the + use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it freely, + subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be appreciated + but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + + --------- + + Used components: + + - Indy 9 (www.indyproject.org) + - FlatStyle Components (www.torry.net) + - FlatPack Component Pack (www.torry.net) + - JVCL Lib Pack 3.0 (jvcl.sourceforge.net) + + Half-Life 2 Icons by Vasili "vaksa" Vorotnikov, Thanks! + Visit www.vaksa.net for further information + +} + +uses + Forms, + UnitfrmMain in 'UnitfrmMain.pas' {frmMain}, + UnitFunctions in 'UnitFunctions.pas', + UnitfrmProxy in 'UnitfrmProxy.pas' {frmProxy}, + UnitInstall in 'UnitInstall.pas', + UnitSelectModPath in 'UnitSelectModPath.pas' {frmSelectModPath}, + UnitPackSystem in 'UnitPackSystem.pas'; + +{$R *.res} + +begin + Application.Initialize; + Application.Title := 'Metamod:Source Installer'; + Application.CreateForm(TfrmMain, frmMain); + UnitfrmMain.VERSION := GetVersion; + frmMain.lblWelcome.Caption := 'Welcome to the Metamod:Source ' + VERSION + ' Setup Wizard'; + frmMain.lblInfo1.Caption := 'This wizard will guide you through the installation of Metamod:Source ' + VERSION + '.'; + frmMain.lblSubTitle1.Caption := 'Please review the following license terms before installing Metamod:Source ' + VERSION + '.'; + frmMain.lblSelectModInfo.Caption := 'Please select the mod Metamod:Source ' + VERSION + ' shall be installed to.'; + frmMain.lblTitle3.Caption := 'Installing Metamod:Source ' + VERSION + ' via FTP'; + frmMain.lblTitle5.Caption := 'Installing Metamod:Source ' + VERSION; + frmMain.lblSubTitle5.Caption := 'Please wait while Metamod:Source ' + VERSION + ' is being installed.'; + Application.CreateForm(TfrmProxy, frmProxy); + Application.CreateForm(TfrmSelectModPath, frmSelectModPath); + Application.Run; +end. diff --git a/installer/MMS_Installer.exe b/installer/MMS_Installer.exe new file mode 100644 index 0000000000000000000000000000000000000000..35e42b1599d1299d2b7866328c0b2650fc6c96d5 GIT binary patch literal 637952 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%0A(jG>d~ z$HBNN*8N6@La#NJI{=>okwPTmM*w4mq3TMNx&6mNJ~E|W$s7`Fv?^Rwx*m`mSXJE5 zG7|ES;(@?V|7Yl||C-R^FuZ1i4K{L&+F*1I7!5iYougY)1SEA6Fh>j+IY0r$phH3F zG)99-38<))*BB~zQLrwTKjD1N`Qe=Nec$J~Zz-rom-4x??x2DFT0~6rrPj%SXD@G_ z*1UUAMQaO6wE@KPiwBddM2c&B(5``{(j;$m-~-^M;!z^@b`)Lt%%Nr94Dt~Bb&-b z??n=T4SBvHJkILb&F*p_6|yHo(Tu<{^PTkp=uv@vlQ=1tP&sBwi@2Bh57aH7>giUR zA5T=BgEY8(w+F--DEJTTRYMm434H;cMt66INI)6{Mzfay_1F^T=~?%=>r_#^G@l}n z{%vcYB9sOkWo?a=4PG}eNQ~EyAB>UKfTs5+ECK5=&Z0L?wAI0^+J8s4vR{N?eqo*{ zs1c4S+<{A~Qlr2ve<#Q`wo&T7JG-xVTA)-yb~ri;Q!*++V& zZR`O0gSRwB3tiQKUDTpv#{@_jfu(OBYCC0|+kIb+bZLK( zeMm7G5iEerf7$%W)3u=Rt8wifei@!e8l(LkvN%zp#~!6AQKGH)stE#8E}ci0V*XX9 zZzK1Qm?q-S39|6&* zSms@~fk|>#R}(v{dU+Wcs}A=0^HCJI z$$Q2pluhI_Y9yEz4qM+QKWd1EJ^Y7nM8&st$!V_m+O{z#{FXUp`mZ6l#tYWI>)JKM zp#|1ktmVBHAcHRsrlp9sh_1M#pBM4+Y;%nk_>%QCqWQWzj9@JlUgM!E)0t$7#!aa| zkidn%w>wG`m9xgT%RjhDY!B!VchzEG*U^;HFzmUyVVf14p-%?jY8z#onrzl0YOpy_ zzxE{ z02Fqf17ppuXKDjHW+Ma6R;X4r-|sd@sCPa>(w+Ua)5<9ty}pm0YNa4=Y>iK#v!>2LMKj-$8}vAO<7vyMGQZ}A z%L3C!Omdk@vUX>vwPVtLPu<3SI3F^`|3J&9X|Ax>fKe-uP3HTuY$0h3 zuRsshAu9xL6^$C$9`NboyC?phnCn(}|EA+ZSg&~AY3N>p$E{+9@(@X>zK!o>siD9u z+ha{4;GZT!0jz8{YGk%MBL34Ej&NoDr^;Jj4n_URe27&2;brt?Y_0ZtVV$2CKWgQ+ z^5uVexO^9c7P8O_J5_Q9ecn`leH;&1gllbx82B61B|S; zMJOR&Ms{61q1Mx4JKxjkC8)p)bWB*vbeclKiRC1es<`8JnFz6t65=&um>Gx@>W`2Q zc!U8m`PD2by`zH(UIt26R_6Xhk}VyzedFzgNl_zncDtNKdo)}IX$z4X>XUaMV!a_V z@ebvll6Z6}SLMkAYs&ASm_;92fe+k6aYene&r8ZM^TX&5Tj6ce!iE26G%odP0^D@$ zoc_Ixt`RBqFIXg)FSoN<`0G-lpZ5iyp7COV{(FwekY1$KC6@jp0}9eWsyCU0{cz}F zwn68KP{q{nfIj4H77Z@Bo2s&on;$v%%F}mCOSIbHuP`dLr>6A$fi#2uRf)iux{ zO94a7R(H_aGj5KT$KD-AmPiK>KLfhD9}$&H_1Gi{x7GsmmK+ahfdmU{xa zaqcPb6{i7sBJ-(v5W)FY2t(+?dAPM=M;5!P{D~~IUsxz7D79Vg_RT{`+cv@MyCb%| zOyndIxja%>c#zp5m%6Ge$}rr~xaY2KvaA(_2jNDxd6TGnrq(jMFI5ps9NM%oJMX`< z7}_*bdTKTV&rF~qx*rY>!66$Xi2+m30P@0m@0t{&E)_>F9$g|!mv>#BK0%-%^`Aq; zswe}o-xs^Yu_Hwdji}Zu61rKDB_`CGS1{hGF zS2W~e5;R`NZ~6*JsB1lCgLRXcvvU+un$}yJKYb3Etp=xveR1&U6-03LWeLs@&<#ig zN~^Thn(4R@)c&kM_8+zj=DENOidnVudXHQ3-vjasux@Fc>O3`Wi5n6F#U^Z8FvtMC z@G7`_O@s3h)rH*e!DnPeN+Fiyw4^HR6WDg)g3O6#!*ZDgGJ@gw! z?kSTl>UQ=8uZjyNj8@(sd1?on7>9nv5amD_L3Ke;S^Sz#d)ow)-?Pa=SS089`271@ z<@W9w(QjqQt%RijpR?uZ48rag^x*M2sltdm8R(p6sv#~PfpUD{z=cOh8Sqj(AVjQ^ zk70iEIu|JwGhe(qTVGRrr8B}g;J`+2Z_zTTk77gBKctqFyIfw!QPRy`T0*xP?ksh^ zhxHwhhmNORO`2CBvT_z54e3}|N!T|Xym+R@I=f~e7(FNpvn z*fKv^|HMS{CCqVR_oagEH%SYN=gUjz_!D>uQ}}ZdIo-aFDO%>;4n&q))XOhdb)}iy}4!C>33MeKbdB~Ub{QaI(fXkgn3CzcW?&KtCB7xR^4fM@yrj~ zvuTIFIb_7yoi;rWVKAx_sC)$xKVi#A9gF2^zB^evHT=iPyXVI~FWl1%toogB12 zmPqh@wUNReCP@*v@#(7i&}Tx6*;pFho9OObCzx?TVlaRz9@c<k#QDZ9H$w)FuqEBYg#E1lPvOh>syHTP15LZ@SmBS%l8=~QEH z!dY&Ypa5E1nFckdDO^ZQjJ;@-&2Z^@FZ25H?9yF(wb&FTdkM#fP9=%?@4_<9&2(0Z zM9bd*nB^p%;TMD?U;kqWp(~sjiO;ix9_k8^Xg(($G|38_g2%?%#SrE2bQ`;vF0VN2 z22Q%y1s%Ic?G&5o0s~Ra*pM+7p0A6T^p_mY6}0du|K#*I$E8$Vp+q1cOXZt6v-sk@ zD2Xx;4ivd`TF!QlAf23ojw1Hv&g(mlJ04l$oZfhWu4vrCn!;5o!2M0rl%AeJue;iI z^;WFkhaCbk(gJ!*S8Li%32}@gRCU?E&d4kZ1+UVi|`anJ07(cf4qx%QiiVPh-E!kl{hrqGxFy!bMTv&c+x2_-Qdy} zCo5)~rzZae8F9L%S_9u*E#G{(bF@oa{8L6{ml#r<+5DQr8I}$rP4|VM8H4E7=sr&J z#Y!ug?Z>bR4RE3@(xEe>WNLJ!$B;6fX?CIHq8*~ttbxcS6}LV~gfx(>F+^?yU4HWg5<1xdwZzX6q+xku z=Sf&fm3F9}2C#nF9P+d+zR)DOfwY2 z^>1S*gcdPnN(eN>F^mbv?aOT1_`f%$g9{NKuh}fxZMi&7^Lhk%-`xQ)d^!d>6c;qJ z(uWp@Ra@Aea=I)3E>lyIokLx(kEp`7@^e*8FOKI3JO+zU8Q+*o!Le3)nPzsraQ_cU zQ;R>cTK>z?V|y?Qzwi{84J&GvTj;+>&YK+Z88bK%Vf>b<-lQs?c2K!Af~NX^d~=P) zNXu7fRaO}Wpw%}vUzi{ty6L$baHl&>bvm^?03D{$~T z7Ncz@+hb{DM6@&V%8Za<8bYkY!hN2H!1ljvF8H!L>lDP0!@u}<4+$SV zp^A_vl(#J+h8<9jnE`Xh3|+TzX`gUc+-e=@7nGUi&J6#r`8S+Y9?hFB>3@V4^nqt? zVKWVou>h9Wv0=91;iZZOHL3+LTtYxHQ)?WtVvS^|w+LL}(;pAUe8n-#gqOaRIF5GD z$wus1{WF<%myu1$QSeX_KhYV<^u6m`weBitc2zeC>EzCN+HF;tJ1`EBu@PaZr}Gs> zCksT_VL=ue&&eT^gK*p9_X}EIZQfOF4h4RsniFDS>PeWq(T$^dBaM&RUZ0UQqrt`0 z*irYifS&_E5hYKiM|M80Zq7JN4(=H}uI;v}8{S!akbm;TiJi^ON^Gl0|Gl}g*Y4rU zh8eq_l}2Mx_sZ7&wi3PUPf8xz;Q*1Cy8=vE@2}xq;(P~LX-G$O)t1D%rh!i2iLJFQ z7T-YL_{&NfUtpFr!_UK!%d^vK9>6 z{1rT>ItY2pw#~&o81PsMKG!Vz`UQ4fxtVXt28J7mwB(B}%0F~JjQb+vgOEMs-8F=0 zKV4r+eKHFB><+*h%PQ zanZF0shL$$!&O@Dcv--$fr49vd;I7 z%&8Y&Z3Q?@J#VQFh}{?Eb-OR$tpl=p4BQa0{7j}c`k`cP&!rNPbxp2L`rF@|%aGNI zge7QS8!jHQ8V0dF^yQW~RsK9g{h1pkKpe#@&+_wej{)`=qL(C!37(04w=33Tp#aKWvibbwh43#&2k0jHb5FkQSQ_rL4sC{v2nLdZ8j)rg{pN zItKLZVpU`uQp%i6){s_)hAURtrtf74=042n2f$80<%zu6XHLpy3j*Zy;f-E$*+cR5 z3K@el8XLJ>oRRA7WNFCw4ZZ!tSMt|Q42`w=CEp7S`^wmlu*v-sz*lyU;Ez9+*$EnN z=ndN-y6PFF<7l)xZx3r zMAAoFp$FDTYgJ2rU69V;6VRcSw>$K>5Me8-3PuRAee^5X_>BrDH_JOGydg3AV=xFO zsWSH2tCoQduTwe`uGtyQ5WDLESZTlY)UNyk`RdsT<~_fo8TSH(S!}MO&GkqoKH*~C zVMSj;bMC=#cg)(-(AkOOIZ`Hljx$CYWqso23-h~$a+)mGMSEYe^|=AuaN*nzK>lU{ z%D>OHeoNZe))dEP9V$qpSPkpFQiFsmEH)};`;UKK_)K;7pGyS(2~9yu@qP0$Z6mvE zg8o=2FVQzBq9i0-fGavzk?6NoljMo{Z99w=fBmVRm$7#-zv%j@t1tPnef0#a{D4&*!ys z6Sdgtq*F8`6I~!GNO5}dALRPQm_|O?0MYB5GsLrEtAcJ7+8K*5I7#?*Cwd~$dFAdd zCZ`I@bY_~v4E*F7QM#^gtZMY&zvOTfv-FTy!*oHY{2kMNUyR|LkpPtd0Jl<>nEaMC z7i#jC7i#Z72Tq)67T1e<#@O*uwlJcbQWF`s1qKaCS^Im7azjVAKh z%Yj25ZT-*}i=$VEiRETkm}zqF$|*Hdtf0pX!Z@7~G{hPG?e%t4J2DE6VJe_E z)W>*H4*<{o!PD-hk5Plv0DBfzy*C^zDL(+*8linYxgL>;S?e)_{U#+cLoR@ihs0!` zveZ`p;6)3NLN?FIbHHO*?pB19svf2ScV15YxZOK&)G>S5iAS20Z9=qv1d=Lt*A$Ml z@+fjbYc?{wnW0Vt^2iQZ!3{udMTPB%7fOb!YckdLuP2DHZ4)6D27nip2MgS_1>t4z&Bux%N*{Tu{APt~PNsQd#dNZ|0@I29Jv?N~B zWBUBz2w-1c@=Lfl90T!`xm~qVbnoop{dIVsMiM1O#o$w)rVyf>-9<6D(GBuI2wXGI z0!<}K$Pz-i^U~T+JFT6L&mPg%XXe+OS8WsQcysF?LcU_8==ZnhI$@vL`YoSeN>ONV zr|Z)6LExpjD4ygHs*bkMvhNItCq%eDcG49kZrfYCc=kG3JY_qI`h@PbV%pH} zh0=jIWiKNO2QcAW4PA_Qulb<9vkZ+`uN$kax-#$9TOhsslGX{eSxKde^aX8v75EV4 zS9TP=DY}Jyige?rT(ZPx_iX6ee2KD)o_~o4{pRB;`)Lo|X6DVObx3dh#0&f=eSPmB ziwS!>@~YlTl2~ga*e6mhsFgQ7wtCI1xqA z6T3XD@?Aiw-m*`_M~(v!l(o$`BqifjY?;INP%DRhG{ZR07ViZ7nBE*Oj7aUh(3T)2 zC-{xKXF8ZqPn5p01i+cTy)&^EdOXg%bs8^zp3WfEpJH9b=t!@!tKAN)rO8syLLe+d zd)|C9D@Rj$V$ba`MkO?R5tsLH)OM+yc;!uks6grgl8lh8q=!E$E-oOnofr6MxbPn> zt(y_|GM`aFc93CP#h}+ArN8e%@jEVD3WkAghJvdXxX&{m#Yqkdr~E*C%Abu8WBW!` z81!eHq{%$09sxZZ#Bf4Ibf9WUu`lekBAlFf{E8v`3T}^|!7oy^S&#NTBL!Mq!?&Q* zzin{WJXu*#zmB%wms65IL#}c?!(@csHZ)YHylu;YVfpMUno}hT34IAerYX-{yNn=9 zfHp@ragd>PJ-t#jgZ~uB_w;rzPoHp^KVXR`>5i${1f_nL%4;_Hr2@&bsl7SU$umGt zjf-TX*E`kWa;CP7f7zV}D(N~4JKWVSWTQIcLBv=<2W~;JVY+g*!>2-5$u;kkoxN6O z!RQ|vf^X?{T~c|i$aU6p;y*qER%cht?=$_qyo)TmW}GCOz0>)h}Z;5 zu<3xo`%!8#H5WMeC#a8k^Gd82FWXw-+PC8*36HILcQIQKX327rY61yjh{{pO%0uIZ z3Y3J@SqmAF2_FnI?&Dv{La-f&@_mm@HidkVjvh5G9!D;!0Gelep(}(l(g%T9AMfRt zE{%9d%8dFZWl~?#^}3*#{7WkS^k&X=Z%$5G0}tN!U)MjW*HEcha(VVv8U1$ttq-0& zqbrzNSka@iKXy(OUUOvjuhU)he&Cjn(%*=Tm}}ZWaXD8~cgy*uzr*q%^*8}DBPpWE z*^oPlke*1)*~34Vg%!JQwsd)*)vVsUor|H?fB)x@ILi_2nuPWm&1DV!eU_3djP-QJ~J&#T>V(Nf(D5>3{Ei6qc4I|Qx~OidE)uj#dJ(S(1OB8lNGAYSu+3ZA!*Hajh~oITqRZjv$M?XvYUP;BJVpam zbF*^#MX+h^yDlw21$*Mw-qB8h$IgtW;ew`N&~gCUTTwtE`1$bjY%YVL8o8p&s;yqP zec}IVWWGTYvh_rDQ-??LBt<%1RNWF7;5*ap7|NuE_N}tUE*7_ZUvfS!zYDg-uylfW z`T%V)Rb-XC+)|Z|7{)0S-ICBBtaVg#D=%kcf=_wd5?2KfQnW;hW0Eh;w9EpdICp~7 zO@m_A@NX4wm1ulEra}ZhZoXny9Zl?ysb%w>!iA$N!Hl5vt&qLvq-`Z9qr}pTzv3}` zl2E5jN<+bnBp#s0<#%zcTa^H0VPSD>fmcEPr>(-RjAAXv%JPNa6Zci) zrSn9<+-QDea3b>>_?=i%whDqZ1^wEOzw0_=bJa(}NIoP(ax?X_d)HlbKT>RpDPdFr z4cXrlfb~;d^dPnmQ>_W4QR@c95lwVY07jnTzF4q@p%NKpF_&kO@>#X-yGRj_6Wg(`{vBcgRY~&l2IIRl4<&ApM&M#t~ z)uZWw%#f8piDhMrc_5!N1$w1MPX~6Lg!=&6)<)dpT;P3u5(Sw$1<}zRc-8f$$U#9Bje8mKsq6Itsz>x`lv?hD%_U&vu6R>%z4tHWNX*iaUVari0sGl;Sg|Bp z&Fzz@Uq#n@!X2kkBLMjdI*Brpb58Spc~26vld!fnV^`=0-n$?Wo+V4&&}7#?4G6z; zP8h@GHPyFUfD9AS53Z6RSDeG9J_uwywy~x;Um^)-MvFM(C16Wp+*8s|GJ54OX#T4V zBR|?fDy`W}-PcaFpnL4HVeU7i^wG>0`ZlI6D?CyfH<|{Hp3vzEH|v=siWG$Nr-s&5 za~~m{R{AtTCY>|EheBA!D&?Bn?m`M(7ygS%yMZ-yyEFXD7Shrnn(X=)II(^OD)@zah0KjFEFgt_>ytH%K%{n(eQs51n+5Zhz}oS z7U-OJ2;efpW9XExZ#i_o!|iwIdpJEbk!~c%m;s0{e82gu!o?w}3k=|Rp1aVZ))tK$jErPv4PrE>ckiwUyrEGTDtX#W?k-IAD za~}__ow)z0f(WeI{*79iv8t{%OYcMT9sVl~vuFQweYjEOj#a)t*w~k|T?REy%Sg$g z_2pP0%e`yDn#yG!wP|`c7+gy3VV*y06iih1{b>`Gh;q|9vS%#=UpCNDUy(N0$ildP zbFWZ+*sxe&5*H{D3Q?YOuvb6`-YWE%<%+&_i}T!s)NTqzP2l++bjgGK;#C-=xDy1i zpr%Gv`KbWH$4!}>AG6WW+w*^re7uV@^@d{R&h*prmL33gW}(C7m0)T^@>;XL-9R~>lNM@ zgcL-_^g5JOw96^Or)q-XW=vpG8IYn~0&lXW_zyAz|{5QD&E3&ma=<`D+^A z`O*hKp;ihhPkN5<^%W2Cd4nGIZP}(nbEJ2#z|gjQf+Lq77OCR%E^=yZ-;1xUSgUHL zBi_yd-sI=e-2rVJHkI1^)ZnRDwiq7ZL;ac(0&bqiC_Cf%w_G>oV{+*PkvU82q=ph)p);{p47r{zMb zNRY*=r-5eKImOzHb}obCpN*a5(mXWb&}NQk-@l8fkQm>hpisc&ia8f_Z78$R0}k=4 zxn%Hkyj#?QJX>Gtw(@7KJ9jx`zAsqo)*%TG?lp&h`Pps?y zMlMHT3&Bw@sYM`AC17I&VhQvHn6L#pO1!i&ZBzt)d9=mU(Fh+<+1t|eXq2#N25EYBCcUEY$rCp;*adDW+PzEKc2E*yX2wDLS9|` z-5^TzToKM;G*gH*C4S!!KX+argX|Fzu*cM1t{%v=~tMa$8Y9fT|-dbxq!>fj3+o1+hOZhc@I`LUk^{3-L0nw z>}J8McI!Wjr#%()USGF^wneTWt1L<-RX=|S6tKN1o@@DYlk#VUxi2Qq(@6WLuuj&w zuRe<96cri#iyfAe}od01)Hl(RX7pNnS;x_KW1fi&L_jXPQ3gz)-E)3=kBMgE zI=!!9V}Z@~AWPFmN?K0W(nst?u~3q|tjX>Eut8#qo?|6_4kYGI9wgRf4eMuF;C13n^Ics(=O09oKV+Cc%dx=ec-P7xZdhxEI#^ z+US@zT;1(!K;4a}hA$@wD&L`Kn%NQQ;b>H;@^8$>O=qnOD#4S~o& z#y|3d8zul|ic%CQJEbaeTCkXD7{5cg(vaEbeomgI49)XVA4kCVERfb{!$+my5-n^~ zsm5nKaQXW84>FvJ5;^7M;=ki#Re7OKn~?W6VpVzq<(L*?RjlgxrmFk|RtmBFZaqXS zCo==7yJ_tyL~|mcbSLrTv%bG9#Uch3@)lodI=oa>^s{x#%NuiQDPijLq*!7KC6p4C z@K45~&EY{~MKM79BGMK-vLNBCiwEmExw=`*1zryWDLziLU95Z z1Kw4sUN@*+$@yj(U{bKw^)!$3# zlB1OSdcT!z$$_7;&|?3YsRDhSRQW`LsiBmAQl47&^b|{M>7)BZyR*&UN0ddi6ndgU zK?sPJPO6#U?xysuzx?I}Sj^>;&3<2Yi|9<&a)nIPp0rss>+qMD-XW`w63UO-mzuGs zc4KM(EwVZnt^Qd#vE*tTc|axnP;kjgQdNJlO$>V##wViIG+-1rv{?4Vj3NFt>7}P7 z?yvI98%)K#TSgjWWM~eg9Q*@&GI!pveVigw+<}D6-6!FF$r+$ElYoI7fcZ%M0cvpZ zZ(un>6L7~=89pLQ4-^aR7EN-t*u*Dme#*amGVobS0!H1vGgb;eo7PlIew*qP!B5av z?Z2};oHh{YJSMQqf7a8q6T;BWFeieaJ@MDp%)vUIggBUcO5BK`+y}k!^pp+qzu=}f zmGNs|$j%-~w0hAC$V22Igb!Q>#U(h?RN<`iZ$IG}P}>7%tUCetmaa48udK0>A>?a% z(&||x`=kcA`0&pk4F73>@USsc|M@zjj zNzd#*pO}i%YrS|)o`}$c!UEWqTk}5E?gIOyb<~Ae50fnAE+4^KQ_+i006E%6h7w~Z zKdRXyS%O@PnV9n<3TF2Wl5Xgp$Kqp;4$luwFUArmL9!g4C_}wJOwx6Nl^~HIkM1Lo zm8UJ=aE@PN>Ijt$8^q;2BRa11^z?Lue08)P)Om%K&?d`qVqzxw*2U8cDSx(6ohrx~ z{(oPs{WeIW`b6&gj|iprRX@#9N45tA$Ql1&7T$!$N=c)x>I?f+{F%f;6W#{x|M$pA z-`R8*CPq|04*?2wx?5Qb-5BEK;a3i?J6M4ooD|BArG9-VbX8H>ltRH!Cf#TK?R-qv zsv36IpZR=pS_%1&v^OmIJ@pj)y*jB95e~wZ+u-z4_Gp+mMJ&Zg-$h ztAn2$LY=XtiiD#swH??lf8}bJPSDRsZoh=w?}sMS`$sjdEWA9kuA|AfEchArpDe#b ziBV>~C*FYYbxIQlMlw-Y!7>2-Ea zA}cO51=wUsUY080A3?rb3@AVxr9iyr5K%2@*z-lT0S)XIJEBKqUqG}%-W&s;IN33@ z=dEqacVd$8Rfg<`0f8YMAFoJ5zXzSqRQGfMFAj=#B77DTZy$^kC3D{L{1uIj6cuqh z*w=XbY|Rs!FD)vZO)oC(k~UM1ZIo4gE&XGl69Iq!E_AeR=dTZP4~~$K&lv2}LWGDQ z14s``y$5Kkvd5{niu0EmF<@G`4<9tk3~N@AMv|#6 zt`f9CpKG?jI?S^R(@1W}_k)0?L#t+YYnOz1s`_=$ou`TH)+#H7J!z83-(9mZbTu&% z{4zf#qI&ta6SDZ|6LWVJkxB>pNV$j{x1EHx_f|umQ9)L(c!l)jBeW&&lu|`JoM#Nq zq34i(jc!|CBKwZj7lj3mjT1eK=sG|Aq_xLU*Y z+OYgvMR6wjS{jz((>7<$@^+H{A)h8S?9dSIFp5qC^ajU>=j-4 z6zQXgvIbPB1M(WM%RNdoaRi}3)c6!tW!wi0tQ`#3zUIa~H+VKLgHnCbT~>U0*f9W3 zyRW&)4G+XCqlgitO(nR~t0z`Q&Usmu-;f<~dUiP#S{Dx(#nLd&_%l&6a6#viKwCkH z_NDr5(GRxO#23OA!=}tM#ZhF#3Z|7B@a4MU{EO=Os#dF5l#A!SKvzwGva^M~i#^rV zg_GHvq&x1r&bW0iGaCbTbzc27gkOvE^p09aN|b7f!0+>9ds9{-!t?1Fd6@oA&5L&k0YGdQlo^J3XQz z-@!Lh8@Omb%fSd&-tRv6i@X)x`D(~YWQRIDWoLKIBLeVM=XsfA>&XaQlwfM_t5B&Z zRIF7>$`(NNUq;9&FAD(fv}kgun^5MzPxm1#5tq_%(nB8Eey_r|mQG$vD-h{Tu`0Ai z7DsE?4X29pJm6bnKE*$v`6`u)9N0gAG1)f!tn;|4AhWO(c#*<5+tZ5<7mV)H-_ku!H{e`;1Z8dkRjxm%+(69x$&*Sh! zrfa(i#s-ZB|1#&u=TLmTNeJzAT00kZh>Q!P)@55IE%>=`xa~ zB;-=Ujo9qwIxA)#_t+umkzL}N*i5g`K58Lhvr%b>wX8yE+PARf=hw(d??B;94R7fx zujU*hXMTn3OAK4okltg^qPLTZx@U~;s(vN5CZB{#*?9;R-9E2;RuW51lM%lV6X6J7 z6Ek}wV0K3h0o#1?&Vuht%pDoa0donj1YseaQGrX+vS&B2@$P3H&Y zSR9%ouBPIknsGz_vNvySg2i6lidYDIgXhS(LvW5?6ef-wg?66PIX0wRcTD!tx0P$! z>AFB{IUDhzUriHHy7Bqmst^yitsCO9EvbjD8UI4-QoHM?69>O+*!SR4q4qTyF*?Z+ zd2G+`3gtBO!rla+q&afPPE;a#@qph)G#hS@P)h6Swma4g?~AB^<&BK9%zu1S(NcGC zWbIO5IRL8rZDE`01fg|@3yJxtW=jrT|}fUI&#ZE8>3+SAJ8jSy=K znAyt4IC-zgRSZ|R)t(tZ+_CNB^bsxn7b<+BV15GO$ma-@wZ9Eet0C=%re1BVy8#&_hVP zP1{KxJ@kj-%kUQ(yl~QHvk^4&)fcNyM-jm}HQG_0`A0=l6{L*XEorGYaDUgcJoFHc zFVC`T*k?qAUxD^VuDaT@`ogL3*y-6$7F|rwB%8o0e|z*q#wBlGKa=M9OXCy+W2CAI z8uvmFB`Wn*t^y-9f?T})zRwz7cRVxbgZ!X3IMb@j1+DDqJFiSPi=oU~y)-B#T3f*= zG1KTu;}=>Y>3*4gYeahBK#{;HB%W`?6K|s2 ztgCy{(fi}-wBd64R!*eci6+%RxVJglJK*FrztGCP`Z4=*(d)PvB?){CzBptB+v+R;L+7vewmfbNl-O!rOdgC)QIqc&lQAI=4+5Pt>ssqr7Sj;z_>e zPlb#ID_XaiAiZVsIz3yXo@~|m2sDX1N*xc6vPA<|5LG4uAcju3lp|F=Rzae2W)FCY zIbbdl-F?b)Axk8uQWYN}VR#47n8mc&7E0H0-!s@Uhl^$xGK8MUqa7GtTB=8OC-Q6! zBu$&HzFvhxw9XqIpm#abt(sZw4{!`f$j2y9L)l}}pMy6vPFv*4<5kOGe$S|wUtVG5 z7r(|Iofe`Jno{-n1_V5dq=xdrvhiDX8 zkn7{T=OGLSrZH~76{AQ63GUVj>1rMx#QZKgv3`Q%U-0*7Es z8DV-PN;?11{QZ}u7qV!M0Ng2^^dEpzGos^`$|qZlW6c!xowOydo(?`~C$Azldz8Z; z>JH|XVn&>`7hK>uK)NA>1w8Oh@!xB?jptduMIZlzVj1+nOJT=Bj3KJyMx%Mlc` zC;T6L(k{OSTO6cJ15T3&WzzH8#&ytX&7123B6jKF+y^2$u`tVT#E^Q-Eok>KSWXok z9nw`Z?>celuwK%ut z8IFDaclrxjj12#t`q}oHQT2y2KN&Ls@I$xu>f?_hxG0A^&9dNW`Glhsit@z4@!t?G zu^ad}2`ar2+uVS@tK($r78M6?5@|~-oyUJPvWqZICnOmi$kvDX{j|DT`e!cMe0;Qn z4X401Zo~=aBymSVECqiq?CtH3lCk5FiV#?p4q6iI?blv)k+m$h^I1oez!e)nILr(|1fiT30#$ixf29<-=juz9BmbwC}MT}-8s1;rxiv28_70KYw8r~s)*q4w1@Ge`TTjw z8R7-*sNkfz3oTV%T}QW2uxnGOw?5nYEPs?7g&T@nN)6sxM5j^4fxtW&VWjfY?vqh( z5H@4sU@^CvXTUyf^iMgSs!!kNsf?C8gOY9pPj+vZ-A~zJf}5j&Ve*E0uJ5nLXjfZD zOSB^HuwV=VL9GFNNzY`;sddw#68lQuB^xuK)typK%bq)eI4!rm7e>%w!Nd;z5+_W) z+_$uc!w6(2KZYoBLJa*=y{TCCe~QjKD#^Ev;~-N-#EpsyidzwJj|?}i+#|I@#k~zz z6Wm+ev(nt`|OjMo{wP zK5(r9rdX5j%uq2p^u|wa<#CoxGyWvXVc1VT>wu&KnZwSUYuW(I`18`QfquxhL<|qH%vrFm{lt<61MIHM`#uM z=(M`L}O!qfTO0B zXl`-2;PRrt6KmPEfH4(-J??7|{PP+bZcLdvYTsd*d>HfUO)LL~>Yv1_Os*%Q4k8D)krk~GcRXZc(~P58^AZ<%-Di|-> z4Ak76S2a^mknoRkj};ygygI*eG=-xcA%^Rcj~@pUEF3dmqk`K@XOb54Pz@-DDurH_H2y0TJY;_14|_B>SNQMKDAlGd!lAD%?-f7gyw{Qv+GB%0_Zespy>y2ciqE+{!mlec!vjj^pT63RJD9&VT@IpWO&N z=Y@m6t30ts&rJ1-`Y0~$5?5=M3#lc1G|2;xJ*Ce@T`PKNeTE{7NQ>*`$L~y z1te$AnZ_Q^TX70#jT!;+dal}}!W7vK-d$Bz*z-U}V9ADRaW11)b(=h!W%98A+)dAx ze|EZ%wfyz?mRjx!rv*Y3HP$JFC-_bgo#S(MSQ;AhU{Wp?s{Dm#dwl|CcDpw>0bmlB z5+L$4VdFv7PAdM}INycI+>+k&BXMlgbE%TbG5*56{5McB?QgSV9iq1P*;M%8C z&RegrBJGen1Rm-1d~GJ$B*a^6IA#U6A3B2$VtkMFIQ53EQF1MXSVSu&Dk!v-JHs7c z*q1x~7RWI1DE?@BpPwPsxWF&Ox)|McjYh$r{1&G2QCkkCe3jgU! z{4%P&QnuM_a>lNU$%kSJj4a&ud+{^nq?V#9B&Y~8T;9=(;xEC7CkEbjpz&P@vKz>i zh+%|9Z6ytgtCb*we5&x9kjpFxVRxE?Ubl5gsvNEP1hl%v_LFK;eC0YTE^g|QS_x-D z=+fphi%z*S`vNqc#)gyGsSXlLs$&Q7+DK#Ms4At*mw1+p zmpMB1Gp_}H7ANjD99tsCmQ-c2X?oYY0YkQ4C58R=kEO=PnUmu|*wfodTSa!WRY}w61!%WkCN`P>TcsH4hRki=s)OHUhvbY^{R&CSL&j?@DVo8Cvt-4>M{FAH3jAx5gUcnqe*$(X|L z(096qfjSw_O;LBO+CNh{iAREeukuk@{q8#Pbz0krYU)~N5;G3o^w3efBfviYSINyXmpNW?#jiN zZ~Pk2FVRngnyw#ZUthX8z$S!T2ZL!gcy02$@BGAjrG##-2 zUzCeMJc8p^JO_LynH**ar%S~9Od!%Wgc6VQoRxcukb7%=iTLa1^`m2OuOoEO;tXv-|wfP z7RNcBfJg@6I-EFOcXMKKfa5~@ynZlG!#$beav#~_Ew`|0bdBIs!9Fm>X-pZ8>aNwQ z`AYgCcYuuE!BK`$Pt?~V@nF*&#fIQ!tYpD0kGk4dDa1Dn;##2G0pWw2T$}!&Sev3Xp0|Z4uDnSQm z`TMtXb+R&7gAwk+rC1DkDp>AWk!HdIdM6E-@h47!|r(I@+13c4P>#plIl<)~b? zUh}jBTYKnkAzY`ToJ_S8J*{OqA88LHIw$~x&4mXzKc?^t1Ys#c&7U%SXsD8togAT` ze&i9Ao-e#nxZN}W-PV|Bvlh=X&jseys|B9vpAr@1Z5y3#?wmZlPpmSDLKWdK`c;2q)ZN^0Eq4Z_73S3Nroi*^X_p zWvGUMtSNJ1uM+il&MV1TTY&90yajy%BHe5^RP0yYfefw406AWcwM+8i{3c+aK`)mg z8Ng|0{85-ATR`-OpnKTo0f+WLZ1(sx;Gv?{Ss&jLr`je3JKr0Nqp=NED#X$7f@I3L z+t^&fI4FPIn_aca*Rcv-&_aj5SsgSp*7Y0$LvI?Zvr-(shckHuKkwZ#mcH7}$b*C7 zWu?TH06&vqY*8OyM`HN)A>x2a{dsX@!z-E z!;}P@UT9}yF@L{eY?7 zL}i$pP*u+!ON;K(autvUIP=P2ZETsA9`XdGXzoX?xPU5oL~0mJ=($8*Z+uV=*BsAt ztsGc+=+?(|xlRcI9wBT}Yh1d0rS$@D1$ot%c0AV>PwGxP16`bZ^o}#v2lVxXorMC& z6-J*=HlMg9-AqL?_yS|MrZm})TkPzMar65ds9W`Ge0(=-g<91UJ_{)8st(>~^f~cE zodnMV6O(T_lWYZS>}-zWPA_dKmFaiBT}7pg=H7}BzBa5u%MfK%iFk(#)cG4~-2=36 zlYxmTGNN*6^)>YvbgS4MyVeDpYkGiS3vtW{-UjIJJmEr;kd)FV{?Y?kD%tbo zo-8wYcn6_&LX&l*nBh8jlS_(B5qBHB)so09)r(EuP3xZfI9qm0#0T}Oj|%j z%tMkxzWX?g&ck2w-rPtrBae@lA8Mv>z)Iu_*w9IR-8UF7p7Gr2=sZEV{6`rll{blU zd0><}^shBL1BWcWaW)QoLoSA8D8{Rnp5f!_eIo3bJv=Ngj>G9&5_7ai22dU1GU~^T z8rfq)*(^_kvdktno$DqnuuH38B>ma|F#L61CQbFH0xrcaSX#)@EnGT`Un*5bwolk8 zjH+V`WWp-&FNC62u3Xp`6hauq&0*oeLV;oRr^Jf#nBiQZ>TjMh9i=)_Y>~&uXB7?QfZs4|EJ! zn-@26z0fjTwGB4bxb>wds1oaXS$y8(tKe@DgY&kRuS&!kn~CDw{|GlzePHV$A8+Xh zJ#%y!*=#^5nTX(C-{k3&*f%$js2A_eCy0fd+@H7pAZdNqJNcNBhm0084*4}`3_T5u zKrgk4>#~LEh?z`QBTs!NHC*`uZa3mnlj-Y%@xWG>Dzv-#Z>D@sw?ohu1cW7a_7!{n zI-5{Z4?7|EzoBs1Gbll@)d{&^1qDM1T452{!C}jF{l)`E88reoP)s;OzWYEY)|{3vKUw?#bm-W0l({mt z23NDDezq_U>%2h042+O(9c6>r?6Nz4PNu(-wQMTP&S#39ykZ^ZyF{+wcq?!uf8N9+ z=N|O3F+?;J9f(B_K!&N=?iH=bf#`vb)@Lyo_AI`+syX;3*vKsxHrFZe-jpugOpO9SqzlzXwgl3i=2W|JWL>MHMAbKI+LtP4v;q00OAxYaDKbAS3O$c`1J}};cy%5B6HVI4G&9U z8UiB=L87cXdwrrTP{rP-15iaFXz!p97BeB6^jjq<1d7!A?I^)lr2pwwe$f6mW3C{j zkoIE|94RV1b>QC;a@2)us#u>oxMHGhnnGZ25*Zoi6&bfq5W<83A~)j=H&X?!yH&+# z%BC-xrX|l3@)eU;D3ap{VzMDfbU`!TClUn^sVEFW@y*HUIX?fL(kHwLEx4drU*0cR z2#`!Mtj@I5%)E`0z5e{T3IhbO%{pG3aoc!HiVVYEQi51cYCU-uF4vp`n*`^gcWaI` zu!L=SUBVN5>yB*~^1Xv8`u>^|A<~LWAxQOrQ{|k`@8_9J%aMQiaL}XA!1t-$ngD2y z%8Gf?5O&k{ZqalMxQcb~Eh5ShXy^ahus{HWHKvzla=nNM5FaWirfd(K6!9t_$+WUx zyaFIOuyJu8SbN z_zik01E|{OHK8TfFl09;*C!OgagUEnFZ|P%wmK|P-YeM@F7DS5In6{7PSx*P-R7HW ziMY-YnruTEzQztwM$IOqL2 z*!;{rL1tEZ_Fc*rOu=3a^}H_8xjkn zqq9Jsj0&?i8wG{wF#pw(oCAU4-?`XAl{3nT8H(@0K$aQ&D;)VI6T}GsCVtFZgPs|? zyr6uWBl|T#4~S74KWA!ETH_FO8mS{Qim;S5wW+b}O|&I5%X%sto2O-pC^FWL!SkAW!ehMo$2!1M4{bk9<^5UiWKG_v{&V%j!<619C|6O zq{C%9@h$abe2MDIyhnn(3v%~_GU_$7ma^8}MPpe(5qA4q~gv!!~$I z{@W4Gz+P%t4C4Ba1$`7HU2#!%4;DMS72;kXZ@IkzG&&BFRLsKQpz2mC)U@kIii;w* z+35W*ix{9^?&-e~$Rgc?(c}?eRZ;L38rET%F&6?W1Z3gmlWiIU;^Y|yHL9O&L3v0) z$bjFA-q^qS5`*1AZ}Yk3iTt-hG^+X45%oo4##$cIHah*taltnexyJ>kazkM>iXbpA za=gHhg@)&$G2;x39)|3*FkXytAc)U?1od0Ho$p2hkEzDi0DFVOQ%>q~YQgwHByhSr z%d!D`G@%LGirpYX<6cJMHwskD8}aW%X$w}HA9z1*(OAaN?N6VNtmw|viz7>$o|!$e ztpDcb7mgO=#iiwc%*xBvf6S|a!GFxq@W?;r(dgLtKW5_blYh+Q(`Wyf=j>bmn9kc> z|Cl@7J-z>!yZ7$@WBMLE{Kxdy)c#|x*VX@H8XB9L|1m8$ZvJCh+uHvz9jtsaEE8fH+yjbuolkR;L%?Y=Dsjw?p z>BU8BQc)Sg@f;F4&uvz+5e_@b)N-{=o#@PyXNIX3zCW(eR&jYuyU3Z?p;56QA#+_Lk^6m}eUnL3O|SrruGPd@`#DfHGXb7+fa7Y$2UhSO@xrHiF_ zUL9~*M6V6dIUso z(w)qGl$tTX*J_hG<{%LY_)ynj>l62}^NyH*lS4Pu+eh-o6usUm5;j~ZX1u(oE9P*QDpX>R_cH1< zBps$X-4&WYXr|X+`BhV^punyXWLc)B7Wh}lB5z5sJZ(4X_g4>}cAo4;QeRJ^7YCxk zNdXMHE%Ap1>4=O4r84rryvn+SHeq|6Smj2Pa~<9R%W^ywOk@pD99Q^t*7Vh zeiMyeUBhpnk6fZg$yUS~VE5&nxyrYDb$y%2gl8*A@6fh8jf5#o-UzZjq8ADH9Bdcr z*?PjThCnWkfZNSfHf9uGAfTc=X4->GS7^E(?Wb)^kM15sMp88;XV(-O7aM~!Fb4~1 ze`%F(L#x2-*K*f+$5*#ig4^!QwXY$ojb@Qk566wnLfaM_`yAE-keaLYNYumob1Git zNbkiQ`q7;E(@S?kJ?WPiL3w|@pCKKNKElky6|=kxx~DxhBaWq{WPlCo|=P?;2rXuLD$Ie?_KcOef}n+bT4u=%d)2o#HOHKq12 zfw0gXd?_f*D1ush%|)k=I)m(`)Y==?su3&W2IG*I@Uxq5>Z-l#t;T^)9*wnw?N2?L>GLZ4f* zUmzYr%mMHoX>1R&X0ecEa+n7MH-s-5NvYQxM@WndbYUr ztv;QPCCze$H`b4}YK7~8HLrz1w|QrID7Ewbj$kUaexlcnx&>-+ol>{7Fa>;T4w!Br3e=g~BlS**Nx&~XnZoz7-*tbshw z<*c76TMB>1vY%4-Jop&cr5ScNhcLi= zj83S$Fo50Ebc6q|hEG8oimGbErTaqp% zYk;PU91vFcLDLp2QxB6L{8j}SHp6aS8fQWT$qwl?x_aO~rUnIYAJV-yfL#Os4CL58 ze3kv^J##lR&|HT36}a>CrqgL9xbBcj;&|CBsIkqxmA@#GOI-P+(UTDt7X!t0GBo6i zgrHXPfMG>c2yh5)?2I(E_+6C5@k@|5&o?9{hKjC*Mp9{hxhwPLsOvcU!z5y2vZZV`ot{cbKj+bN zQit)#G5oZuSHNPZNzP%0mvDHy3FpTJTUB@@7;f9+n7rBV|MA#%{dV?jFTRcy6?mH^iZb<}mVEsl!k zn)MHVi7?pOszfbS4I)-RpGeZz)WU8@S}iLRm9Pr02r5`2oEh#O{1eD%ZYLUUAes zHOyOCRXu(bvcGcm+L0wOm`O)=JUJyb?P$TKXJj7P!5BSFf1_l3PLPEp-G2s!B{}=~Hr+uo| z#@*xOKgQF``yX@a^qFRsvIdzDrX}q$aJEps*-2JjS4Z#C89AD+j=HM4hPkFb>FICH z4tXtI^|Lxziv;$|BlU^ov1s0rCC$#(E#@i`>tL@gH?TV>`iVv zUb=;EGb`QPvO6#gH87IZR+r{QYyvhFLU?v`^wlAxrWkyg;g=R&{BZ6D>Y#<**oUG_ z;O&py!0BO&49#wcqnrrPJ< zf}^Am|5&N#QS?;AxY?LCKVw!nNkm(AyYQwiDnIk48rdQSu4l-)325ASO(z(FD}q>y z4^(y{ptu|^2JTew_nWUWE^+-&S4%^kq)O8H`^~$yc7ym_-5)?}*CEn|Tl|`|gFHMP zs7hV$3x}xz?_q6bz1*TKyhm@`)`%6iEVAu?wQ@*zvqsTgc57mDGF47l|*G$DFpVX+ZOKAG|F)I$c}lO~i|`Tp$`%4w`= zR9HI;v_Ydpg^+-b&1Ks2K{>`+%qX+6@+f^Rz2oX-7TQenc7X#iY{7kpL!O*w?ktWE zsJSg+dvAw&#P74&nV`SW>8{u;MsYsS^uecU<`QLZAsCk9^1a!C@N&nTtCc{x_ox{t!gEbQyL zQOE*tzim*&?e!0^ISmtr>%I^n4~&_3Qyy5swxu9(mKind8?U-Q+RBGrOMtWQWymLx z(^6l3asb*zx3rBPHW`xJ?FtTWMY=2=$s()Va&f-zjf@=zS`BG=2Nid|q=norvcg&_ zI=xeof)bHIYhl}ZtoP)o13J?X^i}Y70)G4~_W1=(hM6JkD<;Jy zgLbrK=FnM3yYZCb;&R_%reS^cd7yqdxSg1*%@i8z2h1*6!y5#cv$iC)^W!EE*4YQz z@nVdZ6fJ3tMR3dyFf@)+>cn5E&r8}1I%-u;%Ffg9`uZ>>kAV(XfOuDUxJtNG>~TS= z2+7^O+rx8dA?Bjg#br+<6<~Q>Dui3q_qaO-pannYtyZh~*^NKF$L?YpX}|(5bv&Ud zc*5aAnO@hCyDsZN?iwFJZg@mT*3=w190@g^@@^wKft4r=rcKi!v`}7$sIFn4uC7ng z0NdCmK!{C5re)MnW8{T93qICT_HdUZ8~^kdL0rx{QD8T?utMYe``{(nGg#!_E41WO zPEEToRNphCN{47r={g{Y(7=nC^9(J0wHtMM6Z!k}n&i>0(rf{IdJ0LtG>){d(PLit ziyVjyBj^cU_U*2ZRr`kR;|lC+;6sWCqBj!m)E5Mc=V1K{<*Q937c;uc?=;`5{|aiJ zD$^zE>gWQ9(j5S63bAO5cHfRr^{^DKI{?$v2JqRAyp2M4 zp}VbSy#*K(%w0N1w_;+u8QBfVb*_Fd>6>4WiJ&h&!a@8RY4iaj@$8SQ&9xgSZFOCj z>%JG%^)D1GQUvZ4$xO3$M`<71;+0LlhXSk%6h6YFNH5A=Kdc}0$t!dlm`Y+t~HP1 zyt}Hf)!!e_wRPz>?A&ect+=t9yQJN`>T%6hGm`}1XvoQ!?b`1!5^~Emz(g$9e!t0o z*}Z(c;HBu*hJmjOS0kwu_>^^=T>7AsD)*??fzSNCIBl=>pOlbS@ zlMhEaYteYwKipt$OrrUA9r>m$>A9rB1vB22I*O3di6!x3NR)O{cbwnCL%p4DZ@^u^ zOU5yR{t4CBZC!FX%3XD&BIBI6EWW=Apas$m$^eQt9UAO;-m>RGRrhrO6oGC$@-*;7 zJ*$(IN3Wt1ld_Ai{4cpNxUu7dKzrvX#QUgwxD_ZurF}C3k%GduF7nZ3igNm-62dQ> zN|cGjsWL41QVRTOqQ^2cb3{*Clq$2Ni$zP1-YG{_!)l-`XL{t!!?zCl5MBBDwj0-l z@(hFx&31bgknl=oQ0bbWEfTrF?dJm|Z{K)cIp^to0@-Rbf@Bfc%}1kU=OU_+sMi@8 zOLPI$(@x4Nb+i4%Tvy|rtGan+c;qB1BD5{B3h}$;8hR7i{BRZ-RM}`&jYLvf9om8` z87EHUq|82xY7F)aMQ%UzmfWQ_yW4Gl z`;e%WAIP=hgmuUZ&8MZ3?68y*N8XKQ1l){ql_h|q2d zJWvnf*5kBO3dm2ST?5pd&=7T3?j@H7F;A9alX`@bo- zeFQDQyrc(|GfY|pb>OBFNe+@Q-J$vPLJci_4GlHDE~c3Tj6s$ooV`DprHhtUZ{qr2 zo8Tcy+x?75qOPiXrly+i1&wsC!#IDUPvr1@x(|F1o8N@9jG54TJiBJNLP3%r(;L@P zi7CbV@)dEZTU`PikDyojeh zwHI-j^vof>MSVvH1D>AI;pXrWvg1W>f${Lk{PI~-)GIp+<=OgT@d6A>3v~@)j}9r& z6>ODalcJP;W~Chc0gs4=0l>|lv3?3sC{Z&PG z5WJNl_uy(BE;l^bYDul?LmJj5$!qh^tzK77)A(`c*__ENc_;8u_lFMf6}i$%Th9F1 zg3*x(>Or4(ZQLJp>%AKgQ0~Ea0p_)c?Xv~kiqM#%^S#nH{I%xsSI8M)z@Uhzb7B7T zV-Gz-rBhn>Z)chzb_PowMwC4^T+{dkUbaTP%)oC&(J^PGxZzrew?lXLfR77tg9+H$ zJA+=DXm>as7# z9-U}E#F+_TK7KeS!q2WaRs?M&Nh55k4D!fVCoA@0Zp}4hxY4Pq2pJWt1Row+NozIF zMFTY*HSRroYSb2doo|Tf>5xG7uz8`Cq-1s6lmP1=A96QEd5+#b%{}CIJ4k2K>-1WA z?lFVMSTrkEJZd&h=D^EMP2f20QK85wy%*ob0LOgT6SPncakA|bQDroK{QfC7N3Q9J zMDe9xcBlOV(KC zd8qn?;^Qg7bAckxW55kAU(>wBaox?lUVs#jq}r&@Q-+9v(-%=_8nJFWnYGSwe?S|! z3H%j84gnKQaHnD%wvD>~XI}0MHf+BQn1Q5fd3DB}{bn$Lf$Q#j)o!z#x0!F=hRq1| zS~s3$spYv;Y}C)Jpb9N%Du3K>&g2Vt>e!|arAQ6%OH3hVpBwoAYE{c%(oF~vy#$56 z|6={#aNAw;3CzrrtH@*ajZAg}m~o=FRjDdC$vHwaTeP(Tw?cycJ!~2|K3g%I=%1H7 z=WE_^bJ{Rf?oFC~(2npF!SFI`9PQQJ7l*w}oD=E#PgwHiT4^SEOrDW3;IjM*{EBp= zCe!jV8pd+SSZO?|z4PWJ%usW+w+}`Rubf;#0V4ZBH6{Tqhs}pghcjJse;W@Q4(ku` z)B$ks4zR>Fww5AJfPnGv|=QoSYq>Bm26pBIw z8FWUEDW-Jyy6h5Od?s^#c;jWz=G3s=X2{0=Ql%J*r9Hqd?8|(+$GFXSqh0^|$)1a@ zuZ*A&-ifI9Bee05YnaYwjKxDa5&1SAAlf72s|yjh=!ICG>G065`Cw2U9Lp)0y53Mp zd!y$n!=V#)6cAY{R)1JG@IS7f^I$mv&I@!TBnFLk5%0(F<_P}vrJR9{wla-8Rg!F- zApS!GPAEyom&WXy{=bzR2`u-peMATcNJHw*0w^MSfF%vBxhESoa&V^TStIv=YF`u; z?+yTn{w8~vOQ)AI=4tzxHk=6Wuo%& zdZ1$oCH@rND1$FB_=+|5X){(3T(e!ThXTUg-xUTnMs6%xa;!R984Cf07*h>}NkT0i z6OK+o@E>8~%CHnLDs?URDhCkDAwL)#xKu9)uQx>L3Ka{74QWul7R z!p@O8W7Mkvys&_>`xu1#&nDe`#qAnrBsc6yvJ`@am|*cE;iZTP9{8nkD3k1`@R$;V z&nBrISK9b(I6KAR%0XCx-0C*c*FJ{j%}9`m?tCo0vQb35brVpNtwFuKs!UWXB5c*9fA)Ck26okH68KQX>)WMIS?jRc zPUQNUw$`ikIZNoVjmtI_VjN%XG-4{wavy-c1kK8}T?vD}e&Znwmy>!bz1jtPd!1Ov zw?msN@I6vxj~h=8t>jF71k_f)7rP#?t6B+jOWnAqyJ425_DS74XMJ^!=@2~g!L_K{ zPWrjYvEsQdW>E%K_T}S%*l}H$-jc8vF#qz&HiyEz{5IoD{k5ic$^BMbtbQl>^od)A zvm=H%H~N^EaMc!U=Y+?2!7Z7)!oGj}I+hB&+3f#rx8sgfob=jSn>mlxrpAnxaKJ@T zikxoQuUo)l4L_`}Zh-^n^|7L+*6nTGu}$^d=~xdHQDuBE)_vn+q0fRr&%!~-^--b4 zy=&XSThOn?Hg9?{?pYqdnQgU2K`3dnb-J{n!8nph@TVxU0%AtRhs>v zVnBtB+dOj&VFR$;xsk&Kp|Gv=S<~j}eZTHoy!nA6$BJihQ#RDn49o|)qZz#rDqpQ` zC;;Z>M?hp{NLC@moyW$U)t|_o!87|eg}xtN1`H?{$3-ZO*!553@$vNh0Jf7R?js_j zH#UHxg`k9u4Otk8-4eOUCShTu&Gl^vRVE1>xZjaz!3X?TBmq}+e1dzrOwr!sZTdX{I#ea5&tDcnd|LhbCM}R7} zt-OeA(?&?S3;x9H$Gb5bm5XwFGJ9-S>&D+@GPs#b*wmj#y>dW!%%@+PXTZTWY4yV8 z<)SK8KXzLuRX-#fL2d4Aj9H1r!O;rnE!B z01W$9=##kG*U#Zj#qiB6s_>~CepkLh7bHxsS@@=^_x{4&1rdcv!0xux3WI#QCP8QS zEt(5f&O1VH_z{Jk@_%*}rbs3jr$I)_lhToOw`7qwu@?lI810M7zaeZ z!=B%y5Ak$?vKp0idrGi1G!{lvU&kCtyg(Dznx{*img+jftfHx|bFZA{U zMd^vypYQOdg98CTzFdMh8qGD20tY~SpcD8{IySMZTe22=dpzVYzcc|(D)Vha)Bxku zh0!Knp(?R>*b@hza@!AMX=XkUId-mmih9SUDW|}EVz$Q z)%oa|S-v2Pk>q?1=-W+qnRie1&X^MSOjh6>@}_$*@JOiqHsvg5cObw!${K5OZ3LqM z++ae#zwKukPi#x>o7GJ4gity_TPUD9jY>+3o_4WvwAlDC7*c-L@=u zhnUYpMwVjp`rFKnvsv&xwkKtQ$Cy+0#lX9v_`_amgQrP_+E;M~K|r8^ z`?Is=XTcifkl&ztvN`CPS5#9(}jxmDfO$K^Eg#-d4Tw)S$!B8$Z_lp;} z9znXJBvpn-v@LVwXUfYoz30{71+S#5%(?ab%3O}3+uEQs-J}*!*>gI6 z1VhwHnsMl43Jr{z`!=SA8n*^|a#fvo3!F>|j?UJ95BX3I$wz@iODnUFhh$N!3&Mij z)yX5;qtDDz3vZ?-oiO^S51@pUiy8kqel?Oy&x@QKYj^>=K0*l?VG6FetEK%9Bnu}3 zDYpcZhwNX5s0yQcya=^9P*g|Mf;kPKhp5N;{!3||{hNdB4zW12;d zlMuDW1--F(FKpefc^Lb4km(9Iwpesi622JK>3JG_WEA*vX{($`OjTQ!tdSKybe`X#xO=!}umAx%-! z5^=DxW~mnXtc?NRaIs!Z=?Djtx&T)Q{1xcjfA+LNSgf1DRWqak;{1&U*#3wFqWlV6 zTY~cHfS@%>tbg0EjRC6Yj-E;jUmzP}uYLHmAa3h-YCYDa1!w0$jL+}5C}AX*{KvHJ zzeihq!nkgL$tA?raEj~1!d6G?_~(?fINw*dIPa<7z0gPj&a(21ze&QeD-B+aN(R>w zJh7cJiq5heRgKHO;tf%KE(s;To0?ZCHQ?==)E*c znJ*L$c?mzU6QE0l<|doifwtpA@<@EZP_oPxkA*udG!#@?LKVGbjk|M4wnP1s+#XJZ zBJ~*_J%e=k-|p}Z9l@t$J}$je=g#i_=}f=i`GrftoHzZVSU3A^caMf(CF(SB-;Vle z`_zG+fT@90XI^`Oz|*as%TO?1HqJtKe>j}s{g?#dASN)4Er#f*n8HfD?-sW3?09Qu8U4vicZljB`P(xSZS8eV!k+Vj z$87U#o?Z?EJVD9ICh@+3;Xwg0CeGzs?i3Y9zk4|q&sqTRGy&-J_p1|>m^7d z1ONdU)*XWmwhm`%O8KOiE<)cBY;;C?2Jeyb6{*@O-3aFUP@&o>Ps3#X{yi4Sa_haq znWvq>OIWCPGf`2OTp6&a8I+i-Z|3$r|8_{ng0Gbz8l*Z z+Zcvn7>2pet)b0^x!*4pq1+QIw~_nYW>#*YJ0(<+cl__P$K-jw5`Ice}o1{$k zm+ke1PY7}DC__{~En{*JGDj^}h|;pSYzzie9B|%alwgtZU7-D5oo$U+D638lrG%D} z=KxTJ@uQK{b{4fOqtEs*^M4e<&~RQ zETLPaH9+icplVJ91F@=>PDa}1h0QExxx9kp5wFT4d(?U>_yo6s#UnY1>i?b1Gvvk? zE7}aBG&HF>CK;bdczU0uoR%UK57pK=0gevqw9O{DpVY--H5d***=lBRtv+;wD55S@IXoexk*eR7DEcuu)f4Zb zxIA1{KWt@XujAPBT<65U`Ufx>3~y~$#Au~5wSZ%;t89pF;R^~#o^x@_e~TQmD! z)t3$GqKZD)lMBf=`DaxW$`_x!Ut@I9wnQF^zieAQlUx0 zr!l<2z(_Q0bgJj5H|YzIv{7aT1(-;hcYRTw5y*D!U|97c$ZyPqC+R!z)@33RC>{*j zXFp3kwNLYnlxRS>oio;*6K#8x9>Y5#6vwM zj-gMhY@6k47)MX?6HGB*02-&sJifF3t=F+o#`j%sv8eCwb4%%;(HEb@(ghD5K{SWC z90t;XphJrEV|8DT#NqN*#h@!nH#mPWFN7n-1ClcDqUzucXqX7b%2>bzrsoUn@5(Rm zJtd-aupO0sLU#?;`d_1iR|IG@!K4&-$RD`sAK7T9y5A)$lVGn0z-ls`BAJTtLN!t;0WbtRv%o9oy>#cP-J=n{w{*;2fr@xq8S|C>Z6O@Gs7 zT(Fx3?#g(XO*#^M0cLsx+q#<{R$5QVQ4xTAplQAM0b8|OczM%0P%^Gccu48okh89A zkJVTLR`+_xan8td&rA(3AVZwr4W}X2Vc02_zyz6cIFJ_Xqtp z??nAp!&a5G053rHWyH7i!n6RfrHZc_wgLFu5v466{t_yTh9`=wyDeN~yCm@Prd=_G zjuOBNp@oue*T%&Y14Qr>X^O;UBLDYY{P8}Yr7Iyp+ZvJh0}(2=lB$UV*v7_)rQ(N@ zs`d3+ho&rN&X~@sh!07i>au-L4%Jmx52=V#R;|xeRx0f+T)fz#5{(AS6hU} z{XIy0QF`*-u5uI|`@ASQ5Zj_|x_j{vR2&hIk$|3L9O>1Y6wI;q-_*0n7;8I}ce!zW z<001oCf%|MMLYBqj}-!tMLxwoHB_r3E@x=PKOg8^h%@+3Oz#W|qbhj!=A?r>3Gz1K z!56>d#u-Y_w~Y&na*6fZ8cdd|*r@2BWi`3zd40U!E5>sJZc)@LFxx$BYf>}0Rw!#} zn!ar9%NjHp^zcUy3fdj74b)wQ2!Uq;pM=j?-EdwM?pLyrm)<^_>mHpZ9vHjco3H`~ z7U2}i1N{jNp}3b-(N5^Iw1{r&L@I(Eg42IP;-T*t-)z-gZ#-wrke)_~YV~Fo`kK#G*k-E; zDijcb3_=WZtq|UvL2v@zr|Ld|h;jVq7XK1S*;4y12er6%4SkaYqTwO?(`PBBt3lE# zC;g!PM%UalUD4{LOm|!7NajvTPj-oo#@EJZw=MABCI&k^l zVDVnyk)@u7DuK%qAMU=0DCO?=SM{2dLp@aFdI~$*_(`kMtIn`it*f|Az*}cDyaMji z936|9_E!6&38Jt)SPjD`E9?3HJ5d1(AlM-yv`V+U_C&M1t2+dZ7S~+xh|mm|VMJ== z?c70EagAmUB~%-cGUsxOmb&CR@o`F*;D;?+vpo_JVp{R%Z&Bk(6)?1LcO!_LLZW~Rzq@ATkQ zGgC_;7hl5Af65538_+hv|8C;Zb>`gyjVC`S!pDbgY?7V4>@{_G3# zj*2m+pQ+y+b=Vknw^5b0+oox&v$cR-aFXv6?P|B`_tAcAfw&6EMm#)}OBX2@u)<-7 zKR|A`?4PwFh<#Xi^wk9mfSa2Rdt}W5W?l;c8^H+Q2j3u{Zm(#4*g7822!zUnEh{_O zMK)mqJ(!@EwgH}Dxh9JO;Fq0b+OD+~KoJ4c-pm)=>-GK3v)P|-4HPy9S%QQ2oRJm~ zssN2)IdaUJE(|pT?t^uwIh*v0rF(L&xp_j;Gp=%G0nT|Ipe`0FR3}^C5JWTMdSv!Q zOAm3=`x}(b$x@~n~S*%$M_r` z@P-~qm!S_?B6k>o?G{NIpD%vAg@a;#c8S8Si4_vdp=Is*0JS`j_6yKyb+fCA->+AV z27km)v$3#fSqstDF}Ft+&H63^mG(xJ_YDSXq*h`+)$2yaRa6j9U%DDn-ldW{Fnajl zN#K167g+aP33jgDwq5#+ydgF{S~BGB#~=CjbTOTIRPWWbHI;C}*m(t2=c*4dpm|xu z%KZ%1IKe^|p`;S`^m5KU8FLwcwBO3YQ|u+n{VMUzcW1|v-$cEuE^F6D*-Xp|;RX7f z6bDZO`Hjw~j77WIrs21q>(hk?UKj;27_Jzo@}Bkxss2-}%Lyc%wE`6S0aLsfhWO5W z$kyAlNQb$_^3UR06}y0xoc4##3VNt>(9*tI4M2_E=G$ zcQi;sS;T*3v@Y32eD(G0LRA=8U{K9RU#B^6$v^BWWgKr$<9Co8JBPX@Z76u5*4P6o zxIEjPiveTCKIc~iWX=sPBq|=X@XrMh&JzGNmx*8DjR#!lA>G!^)DBBa$BU7Jj&qsg z{Hv;UauKU65kp#vst<|zH27HdDQnl`!mI@n?xShT_P7d6ZIVV(H0#VpRVW61w?qwP zwRiDssdxi)JPR?-&<_z85>R`}OukD@4sXdb$a5hH*ocB1?+M=BtW^{V+P6NWzF&sj z(X7H5)>u1@oys}ZE+cZ>;fTRU8kMm@S+6QGqotkuUR~lq6>ILj7U?NooqJbdSkolP z7w(Z71CGir3YhG-fDXdhzMxM|2hK){!GsY%lm`HZVD$IVw*_oPCyv2i>fls9|8VAH z9mgM6xk1?0%?2_ulQ*0;Z9o1uPXV5swVb31B^X~fR%|<2*CaV*3BB6(aK)vYxxN1` z2-BsTZTtXvhzd(QV~ou&6@DoX_bD|b-}Lk(c&llgdT9&@E4&Fm_V{S9*oC$p7g%*P zsLA+lOXFmR?8b#reRUg2o)l6j=_xcEP(=`0m}{| z99ftRIi=Y9h+*YtPKEgkw#ATSAqnLmv950ZldA0Wy=iy4;t&ApJ_CaJ>i0iFZ4%ff ze-3bO%G(*7f;<`JK|T{uhs5`=cG1%RnB5ETcM~b3`@frZUOKsx(E0y4VjxVQBxDJ? zEy^cj+C(imU1bBHq8gD-nOl-z=eHg@FQhIYv)_zXc8>s2*z2x?5n{}%{Il30!TAjH zE{7a*Z1Z&yZ`tE&=e=HN=p|VwcJ(xEb~u2H&*UR0FYkeAt0HoO1^wD}6zd;wVzf(= zC1)e);iVd|!Pt&EVE@$5z8n1WC$YsQ_-Y`&%k>+PwRpzGM8S?2h;&oGUvsulzoh*| zj+%5SS)c{RVrcbh4yBKL+tiHP-Wj-gyf;gy=n@V=M)Euj0|0Y}@yc(`YQEfgAdF1z zZUj55@p=TVBm_>F`_;vgGb(R~cXW~Vt3YZOCs_)|i9Y@Pnr_S%C7|hTfR2y-DwZ>{ z0%MIu*n3ZB)L)D*4lRA<=pbR371>v!_1T$_jge0D7aR-xCy8VC%&N7dcVNB62D6h< z0D)TpizexVhJ*5fFs(SQPnH7<^4H7S3&p9A*>bzuFp?8J=@EG6xpn!mg8ehQ85(;v+1wVclL%M;}6(YjR zm8u{jslw5!Knws5T(#LK*p5}`gJ8_u&lpYESc%<o?~w zEKOMEa4Nb=iEDC4F{)g(e7GNq@a0dosobJluOU{2W@0#sZZPGih2AoS@KzE^S45tj z`MT>CLI(aol@Rb)nmEO9CFT2iV$xYq13F7^pms|EQGSF=JnU4I57uV1^T z7BoQu{xpMtuaVtAxW}}GV&em`yIAk+d+=et@U;k`>n?>tlmrv#5TtUz|2>U{&Gn{iZrpZzJO%woWbkY#TroiR`f;+zfX$|Rqq^^4?fy;& zMLNFU6`))VqyW|`n9lHNH-H<{{!Qiy7X{R5@xY%&cK$;M!qEe#N31K#TxZ;|Y(LXY zF_&5W!)o_kseq_&&Bpa8&W)@Sn$2FwzpiA-GwZ)Bcwfz%QxOf|K`Q2?2-f-zTZRb4 z9mx3Sf`6{sOOsHdv8X%ZRU@YmVT4KhPsjRTa#>Pb1JAkuLiN-M$%eQjm}TsZOJyb1 zk&7Ka+U*q-sE>ZvU6WZz{w`;rIWpv7p-vT@s|z&vQm6|&^AWF6yEQ7p9BRb`+}CZk z@dGaRB2k8fP2J7}!UJF7x9O#3XO6 zaqBSpapJA2Zg_8`wtHPqj52Cxo$Kw#B}==VMP8qroSPY0}s z93>quvGW6>><?4`6;dlTi{J0<9NE0r>PT45VS^8pQ>dG){vQUqX3z_Zv?u#CI&GDmR|g<_(7S!% zsR+2YdNR~}A~k0r8pgZIqhXGRK54S8p`xCR#y;P7B|Kb7?(W7WH4tl@Fe8*MD`v$yh`B=1=FYuKFS zUMyDt=>yI8LK%tfsJl*KPkU)!zf_nj{xw$Y7jSlK_&lY|rty&?4cIG6USAh04;sWOuWDyK(AR6 zcv6ENa2Nj|tPuZT^YJ6Xd+xj6`Y{WSKzCFNyrWm2e}{psY53235X5g~K`_}k5mheC zNG18)>TaBfIAO7>h>=eg{c%i}-~~1XvLNx6d#?H(39ozFl?op%hQG70fxHwqaQ~4O zvX>OV^LZfiL;sN^`p`(Qefbqg8tM^EnYiuTb*g*GeD0^ov*DO)BPp!5StW%4x^^4>z5p1Ii-_h zDOrj8h*w@ob}xDUl=02V+L;b{@KNt$b2rK%i>+xT@#V|wlmqbs_H0iD3N4M*CODdP ze0(d;KioUyX%5KREiia-!3gOB)b*ud#dkjU<&`D)zJHW_eTaMrgHfLei&zG5B%no^WbdM z@{y}>!6D`4Pc9RTlluV0k>mmo@4F&F>3CrJgf1%L5mwDrbh-B4i?;Xte+ilc6gnpL z4SW?PN8OlBgT5KZX+EKJClk;;vXHX@9g66lMj>jV@GLi(6?|0Vxm2Y$jJDZP+ljbW zaQKvFLE^C=2uW81Fz0W|j%K5YmM$Se86~^ zmAEY z>5wGJiah`^F!shdRQ(C-IGKRF1xYe}3=C$7gyZ+Jh$qn}x3=Ps_{36)XZVv4CtiHv z=WKF6U45pTeI+m%Dh5&{&7h1eg&jl)W(OIE?5M!-!!HJ}32Mt?Vny?ak?&8A>oZPX ze}@JnwoQ039GRPw)1N=(|2%E>rU>!WA_mRtPmsx`*xMf@2VNGHP1sJLtP z?$m(B?hP`Jmytz)G1ri>9-tqRaUx=C+MLbR*9^3ML@4?kM;n$oAWLF~9 zEqU`+x2{Y@*Bk&G8QLy#P zB6G*ohzvEv5w&aOQF^3n-80coBPp2<$O0?h+pZJlS2(#;9@C!gqp~`(Ghb!zs#zg; zy!PZr+jil!tvF+=(^6+#53#Q7RPQK;a2(ulRlctH_NvogxFrDr=V;R+Chb!36(|>1 z8daJh@?w9*jT4BSZC(%Qq+Z`8xWR`*L5qD|!bM?z)<18}c+9KK9}!4Z*bue7-BP0c z17e*6u@{}e8AGWp!nXq+@K#;}IiU-jGQ;<4f;?L8dm*d2Gh9yhvhW>#Gx?`{*5({{ zR(U5pvpGQb^r1~&qU=s~2I;x%pgIF@GKKG6U@9ED8)H1gO14TRJQrD&d$TwTf$rLH zn|R+&a0WFA@W;EHv=!@E%Kh|f7I{ok@Q6s4M|ir;&qQC#fkl2v^5yWUyVcNpdIvp8 zfBmJCl98NUNQw}r9e7Umf-r~7+8>f4+?o{{2HEu#7U-Ita~K&F$qIMzJbh6wV9_Yb z;T&~~>3Y3@0v{Z6t;(7krIepH7qyBNu_boG6zPYaK(yGGO2Ap!X=8t{Rvb7rqXPt$iK+W|b|iRvsDfAMl_3Tkv%X9=0WJo5~U!Fdx}^UMl}%H+znkfK8QJg=@}? z+RkM>?h&QTq-_G_)h_^{4-8ubEtEb!5l}#P473t|`^ey0E=$i~6I!Ean+!EEP02U- zi=&sFQ4A>N0A2)DSP*FOTo$vrjcqryGt@;{*zT@kY@VNZ@F4ei}B39P!H7W20cM5isSLGL<*2cL4X?CSR@i|q6LsF{$&CoAa7r4++*Y2CI zhBb`D(Co&$uEfGl!4d>c-FHhlDsx#`62khfH#S+*f!Z1DQ$QbD8|N_UphDh?I#yhM^q06Ocje#$ z1g*-BLEgDf`4Nx2A>}W31?uopGtU)qO@?LnbrlAbK-Qif^6aX89?ZV(lEE*K=Z#;O ze%buqZMKjgjZ7D|vCC-gA%;B450$aS{MH{rqmW}`GiG?q$-U2- zT6HhIa5_W$F)FqV@aB9EnF7h2iIG&-$GiF(A?-$kBjw1SEE-aQ>k~BzX832vojL zP*6tFog1$)Fl)~;(bi$|)INuD*sCBg7?z@MAb*7VYymtWh~Fr>n#3DVlh#8l^(hRQ zqz-be2}=WM15NiEOagbJ2s_7cE7@4(rBen7?1jQ$ya|cF0~<^0uqWBZir8K{iGl@0 zz?e%FwQ@(J^|2^0(uv9x?-l$e<@Zw^Ddk9F0i|U(_cPiX0Gk_{Rn*A_-5y3 z3yfbTGyvK)NlM-dOZPC|j^dogxpFl90vQ<{eJ;t3UUS&m2+v)y`_OQN*iucvkE?Zb z7Uy{oOfTohV{3V_PSMNNUvP`Gws<(@p~cRlz4_LR`Y2W?y>K@0MvrXu(BtEIpRN%Ud*g)Y;>7M*Qp}jm?Vl2p2%HA`^2K^c zN+2w&9ES0$4}esp?O7@9*Y8!Hi4{J|$GF*n_Wsow`AGpQH&Br4)F+7{bQ4}?Vl}@a ztmV1D->N;B0%14K-)_C}sIt~;@{jI}$@GQuVY}!&U*?<~uCXrn$Y}wH`#&k0<8cIrKXBKvACvqO|w?FhRat`)b<)2 zr8`~WH6UahzHJ%#KG8m01R_MKNxhFs?$oM=97REVf~Y+&#qLS2HKnJ!ywQ*#lA3#?%-zf+Fp z?ugoXUIf@9+YD? zw^k4X3^3&>S%UtFK8uBRzlVW!QnI_b_4$c;ZYGsjqxU zXJr7zCrs&*AU{hk#pIGnQz9ET$KzaHLaW*esz4~=sqMP}7@}!RmssE%o~T#iMv#;D z{?m4~XK40xkAf^@F_c+^!bSAgm^Mi2)I~xokLSenViSh>R;%^^6u)io?(ECe zOD&G6U?jKaqKzX4-p;5_P}#e?ajH+-xu0nSsTZJamD+x~;~tHLzrchS+;<}#O2cZ7 z-?7H78ui@$Hf+h=*c2N#KDpT=(p@P)I+0;{8piSdEYIb@n}V~q#vZ9D^zzPLT~hefE^SuG$;JE_>=uIERsOBQ-C6`B@tefG3$uO&pE=1 zTG$AAtjTvF7Ha1mm0zm_#4VwDBUdk|fPUb$#mWsY;12ZT&iP%Bokqw5sVR_cxW%!o zvv?PbzHJdn*O#_G53`Y?Cqsl;l;F?6LRi_Z6_2h;y(Bg1Iv{^|sMV2Bp*hyy zysAE>obuS@_fcM_D!NlNzh9Syz&Y~wkviGClgoC>Jru~LF?5RX%S&Qu zjYL%&njWTvtky3AtvzWRXmXpMh&cup>QSP|a}M~Y6QO+$emd@ogo3Ba{hybMb|O_X zaxO=f(;B*BXB~dBgEL*_yOK_wn3tZ>yybh&RE@oOv|c#vE)8Se{{}Oh3^U4MEDVA8ChsrfBbc<}ZPuAQ2!tOEYeP{Siq0sR8L^Uo7issq z65y;CMajI=nMRRazIPm;o$V?kF+5$qeScfip9bBNJd);XJn~^XXhQyUOo~=#0?x&& zhnPy(I2!eHFon0%{ZAn6syzC`iP#gsSmy6$8v%t}Z#~U7bw4KmIjr)>c+bO`${{Nz zo$oqwJEj{32j5Qfex>? zAj5T2B9-zzRo+W{Q^?w7B|KrX-_*H9N9doX@*r=MjR{*7+nqWR?hy1|>NG?mbfpeM z#o-BT?%Uhay88|im9D9^3<9A_w|4D_QrDY%ipdHJ^MR$|u?ZYRqIMyiCG(Sap{=8^ z=pBUJ>sRXZ<)aBdm0pCxeBw^@`nDI*P&aX+8V-!FHa5%Br$ke3rf{kn8gLsfMIve9 zQn`MopEBS5n%woyDec=Ce6~bl<7<*2A#hWxfqj(MWm_=)le-&n|S_UwdDO0$-LMlCwSCAMFm=#F~~7C#+{5S$iNsrVzjJ4CfI=; zp)NSYv{!gu zQ2Fe$jqC!Mk2vcPL{gWwz3Spkg zNg9nndwsLI7{RHfH_l%q=vI~lJ>BVq`T3gH+8$nBkU$7CQGH1oCmL<#com~velff$i5 zxFwoQWPAidBk7=8t2t+v#WY!=Rj?ylYPTj1B2#7}QGPnIKUprU79gyH!-eUl$JL)6 zSVuvkKVZczqoQ-F9&sCm&b>J!gFuO{|aeiDU=m z=fLx#m~~6C$zDHGk%a|W39PSb$`B`r)1{Uhq4t3la$SFT0XPTvta-VsBL#eseZ$BU z>yVM*TltduR>VZNyd+={gbmh}M((%j;@f=~H=UkIJMz|^(7hxWdfwhO{%qv)%IT)= zj<4RUwJCK$R6NND^7$*Rpmf4(=Fg*SMBpp4s4u3d=#+T+}lB$ou znfLf{Pt%v=9{zzfG1ra2VySJsB02M?-B}xL5z86cXwoe3L025`MRqv&Hw!31Hagnei|81?j&+e$m!Z&=F$Faoj?Qv zP#S0v_;DjongB#zIRH%gLq%fvmWky&Wzj1myiwQ=RHjO3u`O!om)wXqm8ncKw%iw~3V? z9J=`^>t3JTi`R0JOOgaoT!f!|o++laP?KIk6Jhl@goOhuVYALXozVOOMeSlAQWD<> z!Bs3Q0K1E>D%z6l|7QF`*-$-_Q}{?2BmVgtW#?EsE+4(@e^MP#7rmUJZpUy8myTO&mxy^B909WbW zFv&mGe<)vLH+Z8!N^hF@S0&-gFj?@NH9o!F7CtHuyfJ#}&1&Wj!^L5Bagk30ZkG%x z(!XdH%pLa_a&r?B{r2T11E`{_*=N_nx$;T&i{s)TtwqIZ5n@ffna&)$-&XUNF<`Rk zCi`qiVELh{8=(9CE@UpmbPG6WWfGi?5Hx5y z(x%hRvfB%uHrY=m^?7KMmR<=q*Kcar_$ z&JBdHrULKc+~escH0AQA4Q8Z0@ZWPEr-y8INsd_=^E*G^cfo*B{Akq9hWWvDBV+;p zQTs6-pdMR>AQ+K9<*5+@(V1g)x2}v_3(_Y%XTK%iFc}=^FLXemoSSAY(?V`&p~$^- z<-})on}aD;uHEn6xhi@|CsO5qtd69QK5%JJ&?vz@DEubwGMmN%bTNS7*eohnu}80I_ooD-T_)kBODilRBkiMiI}q^xJM|?q(jxOuTqkZ8|K80vybOX}uJN=`{F{tkU z9w2hmulAeHZ5Cp*ZFOU?QtxYPP_Nc;HkJfx{~cyQM%6$ji)y}TBpqATJN~G!&1TIJ zVuorq;#C~{OuP&Lo*~eQA@DDxHT9+M?Yde zz6a18qKw8!e@)0-;7N^XDa6CoG9i=tIX={BcRZMZQ;96UI-;ob;B9^%C)#H66;Mw- zh9np#&;k!<8I-@7Ih&4do^{ZbyeN6U%GA>7lj{dwq|3xkfD5q_wO7#!m+rWBK09) z^SAg>Fu6^5ru!d!muJ==j7eBqO8Lph!SZpSgRizJc?Ur#K0?v}2)&E^i_S+#=QV@9 zcl{SlAhcZnq1bI23m6L#)^0h3wt+j^&;l|g_C?TmGFgk@?)|wMdg22Nx zCZ?rkd9^$8UxZ@rja0Xad{pK>o%zr=-C!JjFVBkdf#}M;k>d)iTn7mo!u+v<)zTX; zb-k^RU=F-p^bq_9_%;a6N*!1VUDDb0Vj=H%og#8N8#O1nmo$?+MBTF~`djs`<3n$JhZq?zhhS%YhtDEV2t0HM149U$ z9L_>v2#M9)?WZ-ODZ~OElhv0uTPq>SvV`3z-O3EFL2)t38>pIFQn{8t+tZDW%ym%r z^FZ4)uU{4DujIyE?aF;}w|hA7bD?2HUixzGuXz2Fh40?Ru&zyw-P?B==l%5Y3ZEPz z|L@D$P~{m~3ej*LjO)Dg&OEC7H_C_#T&%t+J4t!G!+MI?zi+Mn&B?-M7?Nvw)lTeI zy2N0aTVIC{VFxqB09*aCJ4QO9G!nc;FwEI!WbnGH;+NN`1OQAi{_#&?FfU#tADbsn zmHYE`b6x94!uQ=BM@Vq;Gupv>4~~EPoOt)`YoB~#7rov6bG^8=$%AooCje3``?2Vs zRT1MzAFUo--f0@|`&rhB>KhBU@{ecGSgY7CMl&|nswek)P919#&lCFg;0Kt;D~mw} z`ug)TQwa%r!BoKQJr}Fg8TbO?qbSF1zR&PuMVCOaYw7X|k|RwVm1p48zYg`EaS~nZ zbOFE8{N5&A$m`a7{(EZ1VgPe)|353hJd>Rq4aVGWBWu1wvi+H%-Ix0E#gO3P!E0s4 zus*FJQ(u`(xlESMk#bbAkTWqoBUTiP&m6eDzid#jF!vyx_*0@n7f~h;(_OV1lIY8o z1;%>NgN3TKz;!wU5 zPWN1LR;}3(V`g%9k?K#1JuwcMSBM)?cSfeQZHamajVJpbV{`43&4#6dP+lK-E^J0u z4B-+i;Pw0@JCjWh7X@ed5Ev;!ejm@1J85Fc+jYxckYrnNP>Q6J*oruIq{^i6dAy+5 z+X?i@R3h$imCd!e@3e3D0)eNTuU7+`_lMo$Va9Gd^t!N}_e~fBU_LSjW<_+jsCaTk z#IOBuXZJgWnDdq|?M&F`dSGeirJ{^nesAtV&X=Mht4A7H?$VgAC5bSZhN~O7imTRt z%G|pbVOJ+LySJlKddGX3e;?X=dG_cV&kr))?QFokryjW;t37SAF_tN;U$FXAFi%qS z7Pp6y=v&x@{-u`{7iaTJ45mtz-)udeF1mKn1tLyBC@%-Wh;Mj?g*8{F4!_I@$`MOi z#dH0Y?lM4C^vx*6#&e3h?I`OgU>nRGRuT_S=mz5cI>8&aKXuEHii=S>?QXPWMa!cB zo26enJZc&Hv}aVGD4MA?K74>p3DRf*&%L*EyZ8vR_AlwOyYr*fpCNYy4~+q>ENdZ@ zC{^U{=R>uUo2gtG@GN+SI{7BqdGWEIT%I2w?F;yvUGl4z7v6{zZ1P1b9X-=xyPS8V zoWc`xTXt+O6!J`I09~l(%W%i}YF_U|uA?pzD|KUeG1$T<)`XID1@n)X|5!NcYO5B~ z8FT(84Hw8Vha<)-&pCB1qQ3x!w{DCjcjWZ;-K6gB;>(&6XSC*1ZiQTXfC|oY z>JjyF^LL`1es=@XVlCa$9R79t9od%|KMiSZiTdr5+5?}H&9w*gPS8~ODKWbB-QUzs%7c?EvbPG8=; zA&*Am^NT|AP}Ia38<_O&H8Jc*3Y(2Az{5?BKRNr-+P=N8D)yCsLk%FcSFHTcYWF*M zM!$xxSplSOF=EV0Mt+pu^&|=guLy8_d}#*FvT2C|cRi{YqrJUyU93{$PWR55%cI;G z&R=+FH>w>_qf|t{lKhmp-_nX70Hf+-yTp6cZ+t~4OPeVCyu7In&hDG2Ev6)x+3mF0p_ns0DiooY^HSp?H*Cm zqi5TA(Ij8G&Jy_$rvU!0k^GrMu$VlZ2l~{}H+wQXVFa}ZfvyY)KcOY1C0{u)3|S4` zzY=q`n7o;5QJ8A!AcKt-BtiKo)qiVFn=6$KqxU{;_F_QLOoe41p|()G^{4=ew2DuvE$@Ch3222xOvV}QjnBc+lt3S4eO1cnwl68PO$Nd z-v_AOGEYSkSL_5dW0Cw(W8z|6mXi$CFGTmXcavc(i%%mkPYT3^K8nTyaJO)}nJ_3CR_iBuUYcy7nti z=N|=Kc38QhueRCi)++_Mz%$_X_mV#!N;h=-s(I+(=9K=t_)h-gS7=i~$cdWG&aR9l z(^u%HGBx`Cy^Al(Y{}irjl?x=Taz1f=|s#&vs|1yBqE87o{{^=sG`5iulH#%xqFq5 zKof8!Eyj$)O9*N7M}O5%2ukbr$fn*3s^jl=?lRIePtqd7%~I-#*cMYYT5osY zg!X(=k*7BAnuD!zqm_l&v6}hbA$#vWo3h}A#W|d2&RB>Yc*5A}?qB;5@C=MA zT`Kl#s!}VOwx!G)>W zdJxxB?BsWs`~+0w2Jfd>qapxLf{v!vJ!b%a+xu`nvGIY~`l_}rSs#A4=gjojMV`sp zmi#I$74-Dbb(F){sT6k~faD0cb0tyGWD0I`ki&Nex(abRrddd3k8H zo2)o9I2p%SnaZomx#0Ew{+p&2f$%>sCiNjn5dN3dTe^0)n8(sI@WZ+9UoZA-kZf1`j4qg@Yx8s*+g`QBlLYXQQqq-|iLf+h-%w_G=vW=!1O; z3rBe^`f1TtoXt&*Zz#Oo^O_bvp7!C4Xh>Oxw>Z{*{Q;}cvGz_2La|SgmVQ^w?tpxd z&_1Cf5JdQuuz@C&5n>;v=IbRid*2C60QXG)pm(fCVDy~zBBUsYKuJ&Y=lQaW!mRZw zhyGA-g_pnXrtSX+>x#?r!Tju3kiW4Wj65JqG37iBw#)6d!3+fhAPDTX^Wu(LdCEI_ za%#7w_I%jol=jrB*S{U&d;=_(6t{+ z*~vsDzp(z(nNkU|7Yb=+q#m1i9EgI6;g9F&idcQr9i|mNFZk#Ko6$WkaiY5ocm?`N zRl4{Y29-=EQ>}BT7{uAHvO#3~u9Pd3;PSZT@T(N5BKjSz<^LEYeVnq_U&ilDyLuB3vrp6HP< zkB=-#CdnV^!NnxgaIQi(p&^X%m%D4vsC37~Xl|fa*7?vM5fdJ;7;e*;V7KONsm-%x zAdK#?UK>@G-hU=>G33kayd+w0XA?)lkpSCnj<_?Jq@iI>XbzIyXpgA~wpECzZ4q?f zp;lTv1fmDInK#cU%viPYAqm7KwrpsW+nYw|?NvAU)jT#d8jWGDT?;g!o~Gm_Y@z5P(T-GYVb7ff8FR@t-jkd^y#3TIE)pqkox zfvMI4W?XM`204Cmp>^^x!HvoJ-<5IZ_67gx=!2PV^yXXGbzaIpC8XxOXn~OarpoY6 zr3ULurft$5a4^~F-okj79nPlK1>;RIo*i(tOE-p(zXxWl%NwbA((#-xk_m|Py+rY~ z!`>&cXU=DcZzaM?4;a>H>;wrtF1Hi3zEpIj`QWtt{eC1a+LK+gGF*_CYs+alKFO0O zU(zS<{w%pXT-QHL8Tebs5IXvr&MrE{XQtRu6=mO^L zPr^%SmQJW~K%tTA-wD!uSVua)<{`Y)ZL>~oZJl%)5L z@Mmw*oMzKt`DLBL`@*^h8IC}Kd$>836lS_k$-9#D$>F~rkHt$>N(73E@G@pzXxK~^hsp;8f&SY+=Zh*M0c|CpceKED4r9Ggxn{ML z4n=U9T#0^zt0tK=Uxa=fAJO1`Bl4v&3}BLVScMO^gWuc5k)Asx#W6n`f1CjWJPQG# zw6>WWLuoRMl21|NV*W1PEnW_3M7LhJ+4JWd9?OCpe5ImOTd+M@k>l98Rtrt}R3uHl zx#4*C{C+AUPXP3-<5k2HG~vi_J@rHCl=!JB9)OA>x|A#L0g!Ed9hc3MGK5I8ER}Y^ z2hyom5Z}l`FGn!$%jem_t*jle^I02hbFs7Mx4NCR{iQ5(=&65zFm~i%ha(IQWaA+0 z$pPh|z{aYK$V+^<7r7U{D z{eXb00AG^jYlN8y9Qb4AU3Drr!{~Jo7b#ccExd}4L*5B>W8Wx{CRYvAJKEKc$7=~i zq&%NM^P#|YE&Y!PbCOw=_ugOSl?xr;T>E6Enl6lkV#Pd{R=rQb;4Yred&Li-%-q{? zu2bt4_*Xsep`9mV@%ilf^dn$CivC-07W2&)qHg8M$Wcg*&?J#%35x|`}CE8bR? zP^Nr-|9!*v#(ZdH(huSH49t!A+bJKj4T(t=jIH?3mCP6DS^1L0WrGX#-X8{RgAQ}| zR@z*Ri~=)X5XI)ZH`!ejtvo2k0)%6j(r&_MK<(9rYVzY=;neX_;G;i>llNP>m#VbYF|UipgO0cybb;L8rbc$-v*G+;&;nmG{RA-7qRMF$ z63O+C*eSD%MICE(@t_Xu{>~Q=YL+^uI}_I5R3_$|jlFF>c%o^)BAeyN4p!H^Hnm?} zz>ZdM!r5zJEQzmFwiq*G02*=MDS}pU`?%hA4sh}I($DV|B&q z>V8}vVzU^PuF?#B9Pd6CTV*!~+B1FYz(TXV$JA+mnU}+9$o9Kb|II^Bn_1A@>$!lO z9;ga~m*bDcb4{)0sT%-c)WEHR0+4p>%-^Z5>e7LNc23sZ=TXxOSIi$SX|q}8n|=C9 zb4E_J2Yv^1Zs0>|N-lTSczC_Fv37uU{eg*PBhU@Z0-VOf=dmeNddQmj$cav&1TTBR z-obLg(ZL6r*27!R261~}vR?kzA_8^c{*z-?xl~bgrDZjC6@z8~n;mQjzH$!vl=;LY zWzi)r4c{V}J?nXUo#_#jbi#IzLwp#?ZIAOWY&8SFy_Q|&oUM3v40c@~k6>`Fs4NHD z)V1Lx6mPt%xS-p7#h@ue61>A^_Z$aO}y}&iw+#cv( zH2`PSt?Q#F$I!YTXI^M_gj}Sc0k8Du@_+yY`KaQsoa~S`$|6*hAI0yL4FcbHfIPoT1Lo7_P=NPz@uM^yQG-zwLV@N z;9NIYWtH`ThKU%V6K=P{ewyzHI!P3#N1E$Dluh2dlTFQ=G{T?3psmi3h}RH144@3S z+gM@sF7~Iki}_7hvbQ8W^?X?=tyB$uqKUV{T?z$-z<*z!pS?u7h|>uL6m;Y+!Ty+N zza1AUs2l=Kh%(Z#?&2#@s4oYaF5AZQyrj$PWU9mF=s{*P?R~jcOil-%eWJNYLU~bK z2sSm3qQ(JJGi7d%d_l9JAZH`BvSM1^r}K+#2Ak>4rhcqkItcyHQw!vJdT{i_qJ<&R zT?7G$Jm$)Do&)nY3fQW#)9!J1KXU1$TSH~a&dkuE;D<&w8KV(W4w}&-Ddq85+%AHG z+#%)u_$r0lMik4L2e&iq%Z86I{(3*CZaiT^HMQPZ@!~5iZf$XqbMm1)=J8ju@ZdMB${&N{e1Sqzi%l+DFXOS+W8Yb=-L-@fetN|iH(Sc>2-^Y0E=!> zPU;gmjx@(oW|BRvZ4VcY%rJt#LDhi*-XESZssHoTcp=rt$#Lz!Wlyq-qo*}lg)0+d zra7HO=l|o+h-KOQR-pO&F_~r5{E#>8Tk8&Y;d#D7U+lNL0`FM#lVP=+{>cGPq>tggzyb;YFtvy(u{cmBQk zD6(AQv(&+NBr6j^>c1C*2VLabEJeB}`v1t@{*xBdCS=|OJ)NKCYJ-H5tGxm_a;8B= zTD)g;M$s_hHsu zi+h&c&3pS2B2Rs+%QDq|(=q-^`hb&ZE~;u>{AJAft4WqI(Ppf^rc7$DmQ^uTVXa*D z4$3AJfkaP&o(r50nG2$9y4b_`#9)l$i@9aUD z6S~1Kua!618#j`i@wG zSi)f;`r!O4{!W-z-MJFmpA_Ol4xnRJL{_EYZ!U8Y2cq^1rhc%<(3BAHgh$gzB&BcB z-g<-QdZ!$UtKII!zTUhnzoLMoqKv6#-etmpo=%u>x&;MI(|ul>YVtFWSJwnFIVgK* zhT|SG^rQf*JnC+w3>Ba@2S2ne3EJj7DY|FFa<&P7<^xtXQL3W~YtfFuHV*x(jWD`j z_iFfeD;#g;o#{xSo@|;Tjjis(J zRghs0iEfy`!&1#Z<(v5l${lpjAD{j zn-xpvw8dY7B%;-F_u!4JIXt5eg8lRuN+Rk6O&6`sAe@(-M)XO>zuvi59hz9`Wz^WI zw#13$IGXi&&lPWvfcMySXSBDtzt+}L}ZuiSA<_*V?NsHULC#r}Zi$nenUl$#>ToVhXn_d1v+?e-o8DVQ z7R7~@eta=MA!&e7Z`K(Df9^CiKICLpsjpESjR<5e%2xTd$-V#4%>Y3LrWp)QPeY1g zP^~Dzcj@I@C8vNv#bOh%Ia#!{22_O6tWZOQhNL?7sk7f3T})iq6xe^oWIvC3!*e21 zbH*8XfLwsXlm13|5~4T}3?M<(?h8g9^BRY5svk|cYbzq^AZi{RKLCtK=d6+MEOzgqS5oP$hmS^lv_17M@8js;>bkUUlphVX1q0le}pt4qM=2eJ3FpUvH6E?WO3o5tRJWx8GJyO>rGMfqQTj?#`vJeVFMOnFkRBVr*j)l&> z`Gj9`9zE|!M>a2n04&;Vr9NHw+3sy}>}0C*?CmgcHxE{_@#{5Waih^cRp@e<`36YK zWRsL$UXu{V6RPCToKH2;ohyyxG+~-%w|oLux1<^0awifpgGva9wPD_CDC9 z1ZM_(?xFYV!i@~h4Sz%3wlL$d!3J)&;0xYepSu;hsrnWgqk|I`HThw2h-`M-(17Pr zYRLP~`I(8>r*UmjL{?=8&t*xWIVwb7YHAFNw&>a;+an9@Uh^+TZL*k}{V|iXXp^BE z?Bui&?9hsW=i;B+jp-&k+kqVJ$g%dfCqREf<1J$-&7xzs(r4o&J#P7L1!qhC3zm3AgsJQ;A%4qF!dOvrsNX<&;XsW@PSENG985h0t{pMQeiR_6K zg-0Gy9$%jBJ#n?6e_XtX8j!eWF0NwnR(s_vch{z$dWmTci3=H2mLYpE7pPYQ?_2RN zsc6nc#gMYtb;r2N55iuJoB9*Yvy}Y(62-dmOq?Y$XlI^*tdm&O@S;pxf~vJ z3$oYg?}#z-I` zSnYn6CAgsUDE*-gSK*Hv{=a8MJMd&Y>m}K61o+YK^w4{!0}=)l`iwdp!wmK~^KPsr z{Yz&DC1xMcZ{yR^ojnG9`5=@0US$uygr*r$q#M;C5`Y^a?3IUdMkdAXaIk|ui(S7q zxSZd>MroI=j%k!$Xk!yx5@f+e95X0JRL#Ba3ddDuC8+cQdE)(6c+tk!uxZyiWUL$M z9*=l@zgt;hZZ(}HW{-6-JuG~39bxuiT+>3CoN!}~tT1nSY{G~MO4&(w;Rp>}#kYOI z2$(s(XkJ#jjwU?aJC1^z#dtt8H)E{|duB?2;Ld@d1Rgc9ipY9?kLG!;QCCX$iBma- zAM9G2A$LbFXFYAxoSj+^Kh#VOxrzoCE75nQ-v)ol)0~qHmmJxI;~}_s?^`%H%&(fW zaK`t(nLu_1e$c#&ZkJu=`JR3u3WsQ+A4{Wci#TjUJUz@Fylor4WcXtUE#H>DssyY5 z$YL((Q_^T8StM#QvI13j(y{leM5XGJG@eUxcp$O)I!?xUi6`Zt9elkDMPyAgZb-Y)J@V$e>@?BZMgh_{%~4%o&wE;O42jO?WP|YyK?93h z823QBVg)b7MrO?Z$pGX4(fHSPdM@{F449$-!mer`hX>^1+undM##X1^;#YrWSZkn(1d z)z-pL%GGOk%A6kWi2Ruw-AHEhc8=jUd4oLuJ8&54-)>?W1A*W+MKp}VTtDHajSV_} z)}{zey#y+pj7(iX%f$xrm7@SK8vr*9`%796jn|G9ldM%}xaO*QeI^Mg-YcssVM^Iz z^~mA`L|fP`gtOrnT%ieBIjaN-3O`Ge!nU;6c{~reNT~y0^O$x6O|JdKL*v%Cr>~tF z54^Bj|K8-AiL_eR(qKVu5y_dgUtV{aIxLWYsd+C#KXwy(Z!HR>@h9C6obgWk^=>nT z+D{~1{MH?r{(%M#)le4bZz zle(AuA>~7*1k=!DA-r9neUrWCtI&GG^H1Bx0&|Fz>J{X+@o zO?9G6D5m@4&}@u;SrX?yL|gJB)zd_-j4%aEAt0qrxSlK3uca@@JGf5ivU6JL_lKeM zcr>nkt-D(p{x-z>kUdt`G8%;Q!b&>ARZObf4&p3f9=82&$3fep*vqABn_G58bK|U8 z@6Ty@OPYJ%44_GHC_}0tF7@)Zr0KCjh)s4nywVx6-DIn}9%pkK;O7ZP5SI_jbPq@R z8}-9Jx8p}+A7tUvn$y|t7!2xe6``q2B5GP*LdAM6)DH{blIA3en+rog|1gd-pT(#M zyLgOx1J8q#%~;dU#BYR2GZQoc%;_$=zV%@yHkV%+R7Klr7198a9PMZQ01t=7gHIbd zYFhbCga>ZyhY#_bFqNTUfi47uU;0D8;>{$oo5*#fc@)R|Lh{=CJft3&JH~LCNw2oM zyUa8^;%j2se_iZMb4IKk*E_WC)m=ahfT<5_Bw9)pfMMnr4;XXtl<=r|W`yS6(mZ}) z39DNK=6>JFe3$U*m(rUx}__E zd};}HXRfNEBoURQM8@uI!=vosCY;h*x_7qq|Bfo(JUD>!)L+R1Y{!Adba|6xjY?sY zSM?5_I;&h8X3~WhdmFGoO#)CXx4rR7&C8g?s`+9^%i|D#3m*V@UXXjQ& z`#(NdG;{C#_#;(-_0tMqpb&X~w#AYt04=3`8(fA; zt*hA7niug$V|cwwjSipnMP9Ads9En5uD9{)gM9mgWs0sL_@vjxh>d@lmZ#_ib~d%K zNoZnCqiapHTo^gP23*zXdd}M!U1yST%jQGQ+}1IEA#C0=sGWv_n-fv~ag*a@?}F#p zx?XP<^#R8F<&zyJVBgV=>heDy$iz7_GWIYa(a)1Scf|F>yZ80G(t*AC^K&EErAha5 z-vj1^5BIQB0TrLL_xI+Q!RE?SvrFy^*PJkagi_{a`=oaNJBtaJ?ZSK{Vz=ZXY$`gu z->=)aajm&7*GW;V;u&id@3bP;vAqG~!dr~6#Q(lyhXV$LhkIQEGA8K5+`Xpbxq!mn z0Y3Okf$?vBnI@LP0WbNMFuifmq4B1h_7bzVXN6$wg=>y$*VZ%QCTDiG{_wIGT-9aS z?$bw`yAv@USG^I)o$r1>+{qaKtM>v*4p`hJx46;+%m|Vr?%piP5oUAydRGiB(G7m; zCy6@tK_R;CI`W{{1OAjuxCgf%rdc0O!ee`F(Kn|2@ZVE$FV0`@Kx2FT#)ZKImp6Nf z*kM1yjV!Ay@A8U0j<4r^BV^hSuL#)cr+bsCI(a+mMQ&y!sjrr+5F1lPSUD`bqCKi4bX`D%XyG)>ZZy%xg#rM;Iga(Bi$g)8J& z=;wcM&@t~1=Y!0SCj@$C}m=8o=M%(m*h!)4A5WkL;bW=1}SyvTmMv%7K-#j^)nBREla=+R! z{Uez40Rj9+Z~U>t4$s6MgJy&NBG0r|6zDA(y#jq;Je%24z5&)CVY!VNAye%SMnPX` zcotF>a(wZkaZwNLH0+nOEIL4Ke3lEE7bTybymlg3#IG4Mm^n%HI%pK>_{4HJGj(_r zIr8L~W$&+sLhTur;gYKZ6k@NNS43a6DTYEyw%DNmdx zO+y|*s4FemSb4sTWj9 zi=yC5^+5R}b7_fQ+#?#+2J?a@V347F=dlR^ebRkm{0SJP5$#?!+JLJ##%7FgfE6mv?cq% zkpJG*16-1I&_uP0z>o?#d7Crd!s7Iq(+|Y1QIyZjXuygt6Enld{{Nyl$M{uG-aT}R z*WwbGBn#iTd;JVjqWII+KE3-{V$+Hp0=UXjgvLQYulgGf`gi^vET8sv^v~J{o}h!I z;8au7S072!hXm-ptoK!W%IAB`q97;1AI3GMdZU}d*Oy|%&_Bs%5E3sP>3vT3A*IfreH4eCzcEzIi59W#CA+dXdTka8i zZ{sXDxBjE1NB>K1WPnp332@eUiHk?+dw)Rt`*40VP3|8XXojCe@i_!Nr_xy(x?T$Y zHX)M8R`;zMetue8x@*|rx^%X7ZO_Q2WGNn^AS`VE%6b2@zp3RGul(AfC<(l2_VBBQ=9UUZtuU4QYS?)YHws}KmfpzZge zFglWDN6^=EEb~Xj3oRU{#Pdg5T<9$@mrr9N^#=&L!y#Mc!8I=!;>kt5OOoQ`dck>& za;WoWlY&cly|%a)8!5v#-%sjU3)N|1=a)0iB*r!mBN4c{YS>N z+t)+B@2vA&>^r4W+X&vMTU6z(`~L7)X4ilu=jAPG^v?KnA%XZ0LnMPh>`a;0?ktK72k;_ZkD6Ev&lZk?nPEhOOp6tW z9vQbYU=4T|SisPi0LOHCZIw&m-L0;hUs@ylVCLiBEtX&`_z(#gp;t~yLUwF_(u*MP z0wvJg=+OYFG3)3@ETtmu`gj{3%P?M^Kl0ffsEgSrb)~ruu=%3(5iLQ=pSpY3i2mthO-Icca3=+2N(`DUb1kZq27nJA|`Kair z9f0FA0$w1?gOIrmpK%#5DA^^j)dYFgVP17-xXZ=-2QQ;7Gj(vG0sg?1VfD3Du)4*9%OIgM`HiY1#Z zrho0bu44?Qv(pi6iQ(fFR1YW~k?*>0H3Ju@n|Q9N@Cw5sKSM)~Gh@;)OHEvq-}m;v zlF(O~n>_TTI7--Lx zDIo&jZ0Tz37UjP(1EK|qx)i?=*gdOe31S@?fU?k}3Z+{ALaIZN$0$1&e8LgZ2_h)p z->#_wMZvdNi?;2)7DEtofE;7bawCMfaKRmzO&KLnQI{_%Cg58~fY~@gJl_m!j z@H~e$oDIVTX=!C7vca+#S(baLq-0|3<0~ticu7`p7DNgEv3DRPOi4SJJpsv;pX^Bx zVM^8qN4lgF9$j9HxfI=dH*6xY@GW7mN*$h$2C!fjEKB$v4P7hfgxaDJYw!|NuaMU{ z?A)g);`T|fh4G-eP;hnyyjEzk;1I`#y{}^&&%MmF{|SKK;P5n99y_uB`KDj)@^a&E z6LBk7OuD*;#;-#kvHfGQIDn&mrd0Xfgqo$6c5(E(nrh&~`B<0@ywjgNHmY4H@j922 zf1$_;F}DfhK09)sYV(IxM{z@Kekm5)&s4KJb!(8n5#lCC+kL;`2-~>3QnlR^h z)W#L;UkdW72@}u(Yww@)8S@L{1gaP=rFa;D=7d%DodCSgMMp`~1%-qOQR9LlqGHD5 zg1O=nRB$*2Af}Rr=)QlxKJg}(>P{j#EB{?2w!MzN{NQ$wDA7E>xJkc*2O!+_|AL;Zf(>10_pPn~$|O)acU$ zTZTR(!BfV2ev#iu8Jn+)9=BbVn+ZXt*(&wF`>_umw;V~#93pn)9&fUn3XFWB*t@Fr zUK3>zC}l4ByG5a832HNA2SQgqU9%!v)B$m`KlQ89y*(|h^(Ev>L^K;SD&_6Qo!-wG z$uyAWHc4GZDwxrM8<+$d!FJdW$O;R4$#s!-o-NMszhGcWcs#QxQSi~cL`&ZrXFk>r zb}ocDkc}>NZ=Km51LuLB4)EWvXQ&`~am6)(YRWt;M+KgL!|I>n%9$Mic0*^p~_Z#O&BIfCwkVj_n zA*MB%4&JuxV8@cDGH~#ACmX_Ub6Cvp@f2jctiX^AP}A?aR&svW4lqK?Zf|3t@&st{ z?+hh?E%96?AL9>G|A10kP%Nw&2R%90Z8TfFFv$QT_7J1xQb(YvxH(AoyZ$c6Yj#!T zu^cbPl+JLzJ|r(k@5mmSSHZ`4_9YEBlWz{oE9Rfjh07y+7XfvHfvY)0$Elw74}WD* z^c9KmVxi7HgVQz3D;N|E1s@=%;(II3%;F9^D|z#aJ8ee4&vDMZf*StPCAbzJf3A47 z-Sy2&ZH!?fbQFno{>A!K@TveBsm~lE`ZrT*y4p?0GN4H)?+NqISmuhKkCy`vHZpf1 zWX<0TdcTVA)_C@F5R{EDRK)Z#lO11r zST%-;K~$9 zp+yIoztI(wRGz8-S~PU){MEl*Oal0`R{$dleGbQ?K)xB^fY_AgaSNprcRfhH85Cqy zE;R|R5r)AJ8|5BpA&|6x-;`8?qfn)P4u5bVix^= zR@2}2cpg(cBFwl|@apryI?AqMNcR zv+vGOHyAE}56mJ7JezVxwnZmw6l2cWwt0t5)n|43$v7L?#m?9%J-GRU4FjfzvQ7?K z)1t1gE>N|RVYzw%ET#Sz8$)zfC9d6Tgw~-nR^n5P+f{>g{G za?UXZwg182nR%D&N!Mp&;KD9SbZ;zA+@9CKm^4dq^&g7t)9|@wrq7Db;bxM8=z+a8>w*I8PW!k+NX*qXh z{zx%0XmM+Mli#mXr=n45Pw-InQ3wXK>$2!_WSg-%!3W&X9@BnN1(;w_YK(1u9Mg*V%detR98WAohFsoE zJ_4b_T9!df1jU<5cs3i$UsCF2&qB^pdNUx+|-Ri`=;!dhw*zzr;M#zQA9(EbQEb<5i1)0 z{d2-4HbdD`?-I_aHDxiysFWqhMpCD@% z|4kRQ4nA8TP`6I8&WOCBUmldkA@EtAx-o>aG)GRp;GdIq);xme>;+F6tv#E&5&7%8 z36sE2*ykTyfa(J+UMh5Z(V;YZygXnnSCJX0@uMbg`W)mJ?8Z3{EnkHwZ~LX&tR{#v zdvzFA7AqIB8*{3&_bOW7{Dp{OK#^_5jglu#qLc2jbGaj;@@osqVHvkXRUV$VRgU~D zgDO|Nr9~_f;?#<~P+q&LW|}?e()of$<4%9!n850oom?1pbEJ%xd3NAx@vSgcrj2Lp z-?V`DZe%G(Lq*xZ0jdjzUcIo zTJyk4T=5u^G>+vX8SLd}=W)hV z3Lq#`j|cw2=$00|g28-xvdv1nDRAj`7wg1274~h53;`jK88rm)fxtbcVx4_o?`ofIeKZ+ zI0oE0;L;<0`tl`d5p2`T4EO#;0PibMxRR>9`SbeAzHTb9JytyT5rWEb?4 zFY9jqkc?vMs`i{Xxy&7$=00)73~c&}DmNfNm+ph_=-Ev6jDA3uvP8qWqGZH(#FBd^ zWzo@sU1*-ZE!P;h?pyI47D(SRw;f`r20y(RNfx+Sp=zGOz3WC(f5?8Ty~nq(oKmtj zlSS?`Xur@VykqNN;b@8(gFmJvnT8fpFoc~J2e0m;O^L!z0|0+|Sm!l1O%Dq2?Z+YIB8$fc z(L9Pw_QykB(AC=!(8dMVgYX9f3jJ^pZMqf~m(wPP71YkR{~)r%gAMNEL(`YBGT}y2if}3rb;f9I)4 z`d?)CSD5e2Id_-suJiG_i}NZnFhMHT)$*s zRzS>QUMRL1F!Mv6Q_^-oFrDUOJgK+RxL5rfG#`2KyB&o==74AOiE$pkDQEJ;ezL!w z&U@TyiM1(jDXgsq)SnfvIZ+M=Q_~!|60{qDutPdS~s{}K}TKrW1d+Oq%a3= z%@f4Y@99R#yRa1YfU(B#oTG+(xIUm64w*3UUqx`JrBt+{qEo?Thu|6Bcti%vBn@+P zQI)a%435{+%ubm!^Ogp?7wH(!Ez19W0rtHD(Qg!3wM36IlT1pWGoPnhA`$vGpC^r3T zzzgJ;rUXJd3TRgjm*8Pmfo7)@vSp`$A0uotFH%^(CM{l6n}s?-mt`>pC!knXL#?vq zOv`q#$m%9R9GnE1<$5>?nn0ubQAj5J2?jo0;j4>vANj3UL7BxbO`J%o^nZJ)@_fvY z0)joHC+G!`nk;yqc3rPjso^a_r?C3x*4dbX>&Pwb<`d|ryd>F%@h@zbOEZ+HhedL= zjN9K`3g(()BoHw`abj%~-?txUbO4oQh&Te1Jm3;$p}GtTB!x#nXmpenfRtSla`%Hg zV9W`8`|)Oc7m1)^5)N@BIXIi~;tCzDHwJ(h;}bYoPOjFSJ47z>FecfTElAdYbkv6T zkytG;S;FKwcVSz-F4VD#PO}_VzMPvum>h!eD!mJ!VKBB$UvX+6>ITu)Plz|Fl za}5u&SdGhgyk1QI3?fcM8+bW@OMT}C;y#!_ed{V?X3d(`Vq)Z{)bw`BE!WAyIZz(! zT9j^OE0pK9y+i4&!a4IcertY>Cxt|25lx<8^yOTqWZ4Z&y^!KrD6JyB^OL6=Zs^MI zO-0QzoROiO;<)?O&2ro>hTC!=%*JG7xkF3lGUYG;7#J(wAWzl^P$Jrm@_o1h-%R8T ziiuvOhGhKp5d5{NIX>;$xy%0Eb1QRI>89=d%wO6Q97A{`&BxwR&wd^>U?E+!Dk&fA zol+OHD6&){YgTV8Hibu8Xfbv^mQAeU17=C&>NS8P`v8QEvHSAED=%w)#aDRJB4t>JCHqo%TI zPjg@hkes$6hEj26O5B)vYfI4%WxvBOSjgP zae1(dSEJMbRJ%`hQ9b`rjy;;OS~_CwXv{wS2rg~ji4<((yZxinO_)9DLRgLg`12s! z`FN$aJ(T2=IK>n2K+n~efmF5ZIIcH$IcD?~j>&wP&oo2_c(bLu7qxSePw~@2MOe3l z)U(CWc75sA0s1N!R1FiN_i%iG`~2b0=~FsQm$IltczVM^VnV6jFP^$>z#Vyu67Ymp zeI}%Jc7T7KJkqCwliuk*rmi@0OlN+TlH;Grj49)GP!rLoeEF)7*`GRLzlV858&=%z z5fCAq`8%UO0opLyy8?y%EplWZs~Dbpxy3{ zbplQZcX%gGgxKwsL}a%jckPKC?1a2a4s&XnlhNcdd~&-zr@Km6J7s6%u>eMqDz1P< zsHMzW=+c|x8y1QRozQ}h_Jp7>48FS02~Teq^)x*^?QAUzR1G+LOyeEi%i&{%u`|)A z87%`2^3%w>v-eiT1T9u7p2Gq^7>Bw{H5$fh-aRFJj`O;kBj0grUHF*6Th>w@T#_H- zPui7Xd=s(e#c;KDn|X8_Z9nk_naUPop(+Z>`Qv=k$4YB@Gqm#AFC!OB-Fe>Ld{P3a z&IsCJQD_5j>-uw@a)yW?-vBQ#EjR8Pw!mDAlX#`=$xfm7mAXM&Nj$hRaG%FrM2jV# zmHN+{sH!KEi1L>lyk1b`1bnTS*3vZ~Bg^`@d)h=u(aCj?kQhYUSA5wOaiSzJhZ{`? zt;et5qzuKr!y31X zAoFa^YtcDprI+4m;HiFVg;T9*qKN~_$U;ozDFf5YVk;gC$$O~z`tykOf0NlBM3*^? zDIS0@=)0acgp4Y8E!LS67`Gtmu9G- zH+x=$=@#JOZ6mu%t$0gTB{gpS^_$qSRyz?J8S&m1og5wtf*GP8<0b@go(emQg1Cb6 zCc&?96P-9gTxH>h;_#~X;k1ijW~a(R-Z*iGt5TCb)U|4Ju&DEFwh0a>a|0bQLZ9)n(ZohG;6ig=0F ziBTEL*;oqsn|;Sa#6*z;-TR1tWel`21Xj6kDCGw_QLl$Z@M;>7RyPaM2S#Qq7`8?7 zF+z9QP~8@t7=(+Pg`L&buI#F6%O?D`kqn;Az3RPf3Mc}G1{XmOYT&JHO22Op-i5fl zj7aL*$A-$=(z6X0~S|%)ESS{Ft@q%q7D3{Zj$`kqKz- z1J*ZfN?4OA^;$yzMZxp9B5;p$nu8r-OdrhkQBze|lhiWz>n1gG6(7^cWm#XOVqA6x zEZNs~u@xfoP~~*gU@deUOyzyKH!2{3(}_jV5}5)RE*#&D)oe3XQ$lKqCyJxf^4;nR ztm99bUUpWBTwW%<9PR2a*3&wuQ7huqoV2Sh8(4ASml~0t;Gbc>>Dn1e0$yUC-}DS7 z<^W~_yLf|R<%3i7*!}_)=7Uex1lDV*@0rHQu>LCYxW;JT=E}Joh_j&B%`+ z;*q)Put)ZT#Ah#mIDi8poSOim1_6(M3bI!Se`IW5I

q>V;SLLUVYGOZEyP6|93`E5_VA!byak48~;Tu8Z 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�rj3YS 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%0D6ZzdNr+coo02`JJy3$pE%!QU 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 Q*L$F!r!VeaUhy3Ge|jS@Z2$lO literal 0 HcmV?d00001 diff --git a/installer/MMS_Installer.res b/installer/MMS_Installer.res new file mode 100644 index 0000000000000000000000000000000000000000..ace3317386baf91cfcde64e0f3db13dbbe283fb3 GIT binary patch literal 171456 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
    iSEi@7TPRPDST6;k%@geks-j4Ea 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 0) then begin + eOld := eNew - eOld; + //eOld := eOld *2; // this is only used for faster updates... + Result := 'Metamod:Source - Uploading with ' + FloatToStr(RoundTo(eOld / 1024, -2)) + ' kb/s'; + end; +end; + +function GetAllFiles(Mask: String; Attr: Integer; Recursive: Boolean; ShowDirs: Boolean; ShowPath: Boolean = True): TStringList; +var eSearch: TSearchRec; +begin + Result := TStringList.Create; + + // Find all files + if FindFirst(Mask, Attr, eSearch) = 0 then + begin + repeat + if eSearch.Name[1] <> '.' then begin + if ShowPath then begin + if ((eSearch.Attr and Attr) = eSearch.Attr) and ((eSearch.Attr and faDirectory) <> eSearch.Attr) then + Result.Add(ExtractFilePath(Mask) + eSearch.Name) + else if (ShowDirs) and ((eSearch.Attr and faDirectory) = eSearch.Attr) then + Result.Add(ExtractFilePath(Mask) + eSearch.Name); + end + else begin + if ((eSearch.Attr and Attr) = eSearch.Attr) and ((eSearch.Attr and faDirectory) <> eSearch.Attr) then + Result.Add(eSearch.Name) + else if (ShowDirs) and ((eSearch.Attr and faDirectory) = eSearch.Attr) then + Result.Add(eSearch.Name); + end; + + if ((eSearch.Attr and faDirectory) = eSearch.Attr) and (Recursive) then begin + with GetAllFiles(ExtractFilePath(Mask) + eSearch.Name + '\' + ExtractFileName(Mask), Attr, True, ShowDirs, ShowPath) do begin + Result.Text := Result.Text + Text; + Free; + end; + end; + end; + until FindNext(eSearch) <> 0; + end; +end; + +function GetAllDirs: TStringList; +var eList: TStringList; + i: integer; +begin + eList := TStringList.Create; + frmMain.IdFTP.List(eList); + frmMain.IdFTP.DirectoryListing.LoadList(eList); + eList.Clear; + for i := 0 to frmMain.IdFTP.DirectoryListing.Count -1 do begin + if frmMain.IdFTP.DirectoryListing.Items[i].ItemType = ditDirectory then + eList.Add(frmMain.IdFTP.DirectoryListing.Items[i].FileName); + end; + Result := eList; +end; + +{ This is another possibility I coded because I couldn't find another bug... + +function GetAllDirs: TStringList; +var eList: TStringList; + i, eStart: integer; +begin + eList := TStringList.Create; + frmMain.IdFTP.List(eList, '', True); + eStart := 0; + + + // +----------------------------------------------------------------+ + // | drwxr-xr-x 5 web3 ftponly 2048 Jun 25 19:43 files | + // | drwxr-xr-x 2 web3 ftponly 2048 Jun 25 19:57 html | + // | drwxr-xr-x 3 root root 2048 Jun 20 05:03 log | + // | drwxrwxrwx 2 web3 ftponly 2048 Jun 19 2004 phptmp | + // +----------------------------------------------------------------+ + + + // at first remove all non-directories from the list + for i := eList.Count -1 downto 0 do begin + if Pos('d', eList[i]) <> 1 then + eList.Delete(i); + end; + // then we have to find the position where ALL filenames start... + for i := 0 to eList.Count -1 do begin + if (eStart = 0) and (Pos(':', eList[i]) <> 0) then + eStart := Pos(':', eList[i]); + end; + + if eStart = 0 then + eList.Clear + else begin + // find the position + for i := 0 to eList.Count -1 do begin + if Pos(':', eList[i]) <> 0 then begin + while (eStart <> Length(eList[i])) and (eList[i][eStart] <> #32) do + Inc(eStart, 1); + end; + end; + // remove the detail stuff... + for i := 0 to eList.Count -1 do + eList[i] := Copy(eList[i], eStart +1, Length(eList[i])); + end; + + Result := eList; +end; } + +end. + + diff --git a/installer/UnitInstall.pas b/installer/UnitInstall.pas new file mode 100644 index 0000000..66e7b1e --- /dev/null +++ b/installer/UnitInstall.pas @@ -0,0 +1,561 @@ +unit UnitInstall; + +interface + +uses SysUtils, Classes, Windows, Graphics, Forms, ShellAPI, Controls, Messages, + TlHelp32, IdFTPCommon, ComCtrls; + +type TOS = (osWindows, osLinux); + +procedure AddStatus(Text: String; Color: TColor; ShowTime: Boolean = True); +procedure AddDone(Additional: String = ''); +procedure AddSkipped; +procedure AddNotFound; +procedure DownloadFile(eFile: String; eDestination: String); + +procedure BasicInstallation(ePath: String; SteamInstall, ListenInstall: Boolean; OS: TOS); +procedure InstallDedicated(eModPath: String; UseSteam: Boolean); +procedure InstallListen(ePath: String); +procedure InstallCustom(ePath: String; eOS: TOS); +procedure InstallFTP(OS: TOS); + +var StartTime: TDateTime; + SteamPath: String; + StandaloneServer: String; + Cancel: Boolean = False; + +implementation + +uses UnitfrmMain, UnitfrmProxy, UnitFunctions, UnitPackSystem; + +// useful stuff + +function InstallTime: String; +begin + Result := FormatDateTime('HH:MM:SS', Now - StartTime); +end; + +procedure AddStatus(Text: String; Color: TColor; ShowTime: Boolean = True); +begin + frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); + if ShowTime then begin + frmMain.rtfDetails.SelAttributes.Color := clBlack; + if frmMain.rtfDetails.Text = '' then + frmMain.rtfDetails.SelText := '[' + InstallTime + '] ' + else + frmMain.rtfDetails.SelText := #13#10 + '[' + InstallTime + '] '; + frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); + end + else + frmMain.rtfDetails.SelText := #13#10; + + frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); + frmMain.rtfDetails.SelAttributes.Color := Color; + frmMain.rtfDetails.SelText := Text; + frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); + + frmMain.Repaint; + Application.ProcessMessages; +end; + +procedure AddDone(Additional: String = ''); +begin + frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); + frmMain.rtfDetails.SelAttributes.Color := clGreen; + if Additional = '' then + frmMain.rtfDetails.SelText := ' Done.' + else + frmMain.rtfDetails.SelText := ' Done, ' + Additional + '.'; + frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); + + frmMain.Repaint; + Application.ProcessMessages; +end; + +procedure AddSkipped; +begin + frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); + frmMain.rtfDetails.SelAttributes.Color := $004080FF; // orange + frmMain.rtfDetails.SelText := ' Skipped.'; + frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); + + frmMain.Repaint; + Application.ProcessMessages; +end; + +procedure AddNotFound; +begin + frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); + frmMain.rtfDetails.SelAttributes.Color := clRed; + frmMain.rtfDetails.SelText := ' Not found.'; + frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); + + frmMain.Repaint; + Application.ProcessMessages; +end; + +procedure FileCopy(Source, Destination: String; CopyConfig: Boolean; AddStatus: Boolean = True); +begin + if (not CopyConfig) and (Pos('config', Source) <> 0) then begin + if AddStatus then + AddSkipped; + exit; + end; + + if not FileExists(Source) then begin + if AddStatus then + AddNotFound; + exit; + end; + + try + if FileExists(Destination) then + DeleteFile(PChar(Destination)); + CopyFile(PChar(Source), PChar(Destination), False); + except + Application.ProcessMessages; + end; + + if AddStatus then + AddDone; +end; + +procedure DownloadFile(eFile: String; eDestination: String); +var TransferType: TIdFTPTransferType; +begin + // There's only one file to download and it's ASCII :] + TransferType := ftASCII; + if frmMain.IdFTP.TransferType <> TransferType then + frmMain.IdFTP.TransferType := TransferType; + // download the file + frmMain.IdFTP.Get(eFile, eDestination, True); +end; + +procedure UploadFile(eFile: String; eDestination: String; CopyConfig: Boolean = True); +var TransferType: TIdFTPTransferType; +begin + if (Pos('config', eFile) > 0) and (not CopyConfig) then begin + AddSkipped; + exit; + end; + + eDestination := StringReplace(eDestination, '\', '/', [rfReplaceAll]); + + // the same as in DownloadFile() + TransferType := ftBinary; + if ExtractFileExt(LowerCase(eFile)) = '.txt' then TransferType := ftASCII; + if frmMain.IdFTP.TransferType <> TransferType then + frmMain.IdFTP.TransferType := TransferType; + // upload the file + frmMain.IdFTP.Put(eFile, eDestination); + AddDone; +end; + +procedure FTPMakeDir(eDir: String); +begin + eDir := StringReplace(eDir, '\', '/', [rfReplaceAll]); + try + frmMain.IdFTP.MakeDir(eDir); + except + Application.ProcessMessages; + end; +end; + +function FSize(eFile: String): Cardinal; +var eRec: TSearchRec; +begin + if FindFirst(eFile, faAnyFile, eRec) = 0 then + Result := eRec.Size + else + Result := 0; +end; + +// stuff for killing processes + +function GetProcessID(sProcName: String): Integer; +var + hProcSnap: THandle; + pe32: TProcessEntry32; +begin + result := -1; + hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); + if hProcSnap = INVALID_HANDLE_VALUE then + exit; + + pe32.dwSize := SizeOf(ProcessEntry32); + if Process32First(hProcSnap, pe32) = true then begin + while Process32Next(hProcSnap, pe32) = true do begin + if pos(sProcName, pe32.szExeFile) <> 0then + result := pe32.th32ProcessID; + end; + end; + CloseHandle(hProcSnap); +end; + +procedure KillProcess(dwProcID: DWORD); +var + hProcess : Cardinal; + dw : DWORD; +begin + hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID); + TerminateProcess(hProcess, 0); + dw := WaitForSingleObject(hProcess, 5000); + case dw of + WAIT_TIMEOUT: begin + CloseHandle(hProcess); + exit; + end; + WAIT_FAILED: begin + RaiseLastOSError; + CloseHandle(hProcess); + exit; + end; + end; + CloseHandle(hProcess); +end; + +// Installation here + +{ Basic Installation } + +procedure BasicInstallation(ePath: String; SteamInstall, ListenInstall: Boolean; OS: TOS); +var eStr: TStringList; + i: integer; + CopyConfig: Boolean; + eFound: Boolean; +begin + frmMain.ggeAll.MaxValue := 8; + frmMain.ggeAll.Progress := 0; + frmMain.ggeItem.MaxValue := 1; + frmMain.ggeItem.Progress := 0; + + if (GetProcessID('Steam.exe') <> -1) and (SteamInstall) then begin + if MessageBox(frmMain.Handle, 'Steam is still running. It is necersarry to shut it down before you install Metamod:Source. Shut it down now?', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNO) = mrYes then begin + AddStatus('Shutting down Steam...', clBlack, False); + if GetProcessID('Steam.exe') = -1 then + AddDone + else + KillProcess(GetProcessID('Steam.exe')); + + while GetProcessID('Steam.exe') <> -1 do begin // sure is sure... + Sleep(50); + Application.ProcessMessages; + end; + AddDone; + end + else begin + Application.Terminate; + exit; + end; + end; + frmMain.ggeAll.Progress := 1; + frmMain.ggeItem.Progress := 1; + { Unpack } + frmMain.ggeItem.Progress := 0; + AddStatus('Unpacking files...', clBlack); + if not Unpack() then begin + AddStatus('No files attached!', clRed); + Screen.Cursor := crDefault; + exit; + end; + AddDone; + frmMain.ggeAll.Progress := 2; + frmMain.ggeItem.Progress := 1; + { Check for installation / Create directories } + CopyConfig := True; + AddStatus('Creating directories...', clBlack); + if DirectoryExists(ePath + 'addons\metamod\bin') then begin + case MessageBox(frmMain.Handle, 'A Metamod:Source installation was already detected. If you choose to reinstall, your configuration files will be erased. Click Yes to continue, No to Upgrade, or Cancel to abort the install.', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNOCANCEL) of + mrNo: CopyConfig := False; + mrCancel: begin + Application.Terminate; + exit; + end; + end; + AddSkipped; + end + else begin + frmMain.ggeItem.Progress := 0; + ForceDirectories(ePath + 'addons\metamod\bin'); + AddDone; + end; + frmMain.ggeItem.Progress := 1; + frmMain.ggeAll.Progress := 3; + + { gameinfo.txt } + if not FileExists(ePath + 'gameinfo.txt') then begin + if MessageBox(frmMain.Handle, 'The file "gameinfo.txt" couldn''t be found. Continue installation?', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNO) = mrNo then begin + AddStatus('Installation canceled by user!', clRed, False); + Screen.Cursor := crDefault; + Cancel := True; + exit; + end; + end + else begin + eStr := TStringList.Create; + { Metaplugins.ini } + frmMain.ggeItem.Progress := 0; + AddStatus('Creating metaplugins.ini...', clBlack); + if CopyConfig then begin + eStr.SaveToFile(ePath + 'addons\metamod\metaplugins.ini'); + AddDone; + end + else + AddSkipped; + frmMain.ggeItem.Progress := 1; + frmMain.ggeAll.Progress := 4; + { Gameinfo.txt } + frmMain.ggeItem.Progress := 0; + eFound := False; + AddStatus('Editing gameinfo.txt...', clBlack); + eStr.LoadFromFile(ePath + 'gameinfo.txt'); + for i := 0 to eStr.Count -1 do begin + if Trim(LowerCase(eStr[i])) = 'gamebin |gameinfo_path|addons/metamod/bin' then begin + eFound := True; + break; + end; + end; + + if not eFound then begin + for i := 0 to eStr.Count -1 do begin + if Trim(eStr[i]) = 'SearchPaths' then begin + eStr.Insert(i +2, ' GameBin |gameinfo_path|addons/metamod/bin'); + AddDone; + break; + end; + end; + SetFileAttributes(PChar(ePath + 'gameinfo.txt'), 0); + eStr.SaveToFile(ePath + 'gameinfo.txt'); + SetFileAttributes(PChar(ePath + 'gameinfo.txt'), faReadOnly); // important for listen servers + AddDone; + end + else + AddSkipped; + eStr.Free; + frmMain.ggeItem.Progress := 1; + frmMain.ggeAll.Progress := 5; + end; + { Copy files } + frmMain.ggeItem.Progress := 0; + AddStatus('Copying server.dll...', clBlack); + CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'server.dll'), PChar(ePath + 'addons\metamod\bin\server.dll'), False); + AddDone; + frmMain.ggeItem.Progress := 1; + frmMain.ggeAll.Progress := 6; + if ListenInstall then begin + ePath := ExtractFilePath(Copy(ePath, 1, Length(ePath)-1)); + AddStatus('Copying hl2launch.exe...', clBlack); + CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'hl2launch.exe'), PChar(ePath + 'hl2launch.exe'), False); + AddDone; + end; + { Remove files } + frmMain.ggeItem.Progress := 0; + AddStatus('Removing temporary files...', clBlack); + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'hl2launch.exe')); + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server.dll')); + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server_i486.so')); + AddDone; + frmMain.ggeItem.Progress := 1; + frmMain.ggeAll.Progress := 8; + { Finish } + AddStatus('', clBlack, False); + AddStatus('Finished installation!', clBlack, False); + frmMain.cmdNext.Enabled := True; + frmMain.cmdCancel.Hide; + Screen.Cursor := crDefault; + + if ListenInstall then + MessageBox(frmMain.Handle, PChar('hl2launch.exe has been copied to ' + ePath + '. You can use it if you want to start your Source game with Metamod:Source enabled.'), PChar(Application.Title), MB_ICONINFORMATION); +end; + +{ Dedicated Server } + +procedure InstallDedicated(eModPath: String; UseSteam: Boolean); +begin + StartTime := Now; + Screen.Cursor := crHourGlass; + AddStatus('Starting Metamod:Source installation on dedicated server...', clBlack, False); + BasicInstallation(eModPath, UseSteam, False, osWindows); +end; + +{ Listen Server } + +procedure InstallListen(ePath: String); +begin + StartTime := Now; + Screen.Cursor := crHourGlass; + AddStatus('Starting Metamod:Source installation on the listen server...', clBlack); + BasicInstallation(ePath, True, True, osWindows); +end; + +{ Custom mod } + +procedure InstallCustom(ePath: String; eOS: TOS); +begin + StartTime := Now; + Screen.Cursor := crHourGlass; + AddStatus('Starting Metamod:Source installation...', clBlack); + BasicInstallation(ePath, False, False, eOS); +end; + +{ FTP } + +procedure InstallFTP(OS: TOS); +function DoReconnect: Boolean; +begin + Result := False; + if MessageBox(frmMain.Handle, 'You have been disconnected due to an error. Try to reconnect?', PChar(Application.Title), MB_ICONQUESTION + MB_YESNO) = mrYes then begin + try + frmMain.IdFTP.Connect; + Result := True; + except + MessageBox(frmMain.Handle, 'Failed to reconnect. Installation aborted.', PChar(Application.Title), MB_ICONSTOP); + end; + end; +end; + +label CreateAgain; +label UploadAgain; +var eStr: TStringList; + i: integer; + CopyConfig, eFound: Boolean; +begin + frmMain.cmdCancel.Show; + frmMain.cmdNext.Hide; + Screen.Cursor := crHourGlass; + + frmMain.ggeAll.MaxValue := 6; + frmMain.ggeAll.Progress := 0; + frmMain.ggeItem.MaxValue := 1; + frmMain.ggeItem.Progress := 0; + + { Unpack } + frmMain.ggeItem.Progress := 0; + AddStatus('Unpacking files...', clBlack); + if not Unpack() then begin + AddStatus('No files attached!', clRed); + Screen.Cursor := crDefault; + exit; + end; + AddDone; + frmMain.ggeAll.Progress := 2; + frmMain.ggeItem.Progress := 1; + { Check for installation } + AddStatus('Editing gameinfo.txt...', clBlack); + eStr := TStringList.Create; + DownloadFile('gameinfo.txt', ExtractFilePath(ParamStr(0)) + 'gameinfo.txt'); + eStr.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'gameinfo.txt'); + + CopyConfig := True; + eFound := False; + for i := 0 to eStr.Count -1 do begin + if Trim(LowerCase(eStr[i])) = 'gamebin |gameinfo_path|addons/metamod/bin' then begin + eFound := True; + case MessageBox(frmMain.Handle, 'A Metamod:Source installation was already detected. If you choose to reinstall, your configuration files will be erased. Click Yes to continue, No to Upgrade, or Cancel to abort the install.', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNOCANCEL) of + mrNo: CopyConfig := False; + mrCancel: begin + Application.Terminate; + eStr.Free; + exit; + end; + end; + break; + end; + end; + + if not eFound then begin + for i := 0 to eStr.Count -1 do begin + if Trim(eStr[i]) = 'SearchPaths' then begin + eStr.Insert(i +2, ' GameBin |gameinfo_path|addons/metamod/bin'); + AddDone; + break; + end; + end; + eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'gameinfo.txt'); + UploadFile(ExtractFilePath(ParamStr(0)) + 'gameinfo.txt', 'gameinfo.txt'); + try + AddStatus('Trying to set gameinfo.txt to read-only...', clBlack); + frmMain.IdFTP.Site('CHMOD 744 gameinfo.txt'); + AddDone; + except + AddStatus('Warning: CHMOD not supported.', clMaroon); + end; + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'gameinfo.txt')); + end + else + AddSkipped; + frmMain.ggeAll.Progress := 3; + frmMain.ggeItem.Progress := 1; + + { Create directories } + frmMain.ggeItem.Progress := 0; + frmMain.ggeItem.MaxValue := 3; + AddStatus('Creating directories...', clBlack); + if not eFound then begin + FTPMakeDir('addons'); + frmMain.IdFTP.ChangeDir('addons'); + frmMain.ggeItem.Progress := 1; + FTPMakeDir('metamod'); + frmMain.IdFTP.ChangeDir('metamod'); + frmMain.ggeItem.Progress := 2; + FTPMakeDir('bin'); + frmMain.ggeItem.Progress := 3; + AddDone; + end + else + AddSkipped; + frmMain.ggeAll.Progress := 4; + frmMain.ggeItem.Progress := 3; + { Upload metaplugins.ini } + frmMain.ggeAll.Progress := 4; + frmMain.ggeItem.MaxValue := 1; + frmMain.ggeItem.Progress := 0; + AddStatus('Uploading metaplugins.ini...', clBlack); + if CopyConfig then begin + eStr.Clear; + eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini'); + UploadFile(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini', 'metaplugins.ini'); + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini')); + end + else + AddSkipped; + frmMain.ggeAll.Progress := 5; + frmMain.ggeItem.Progress := 1; + { Upload server.dll / server_i486.so } + frmMain.tmrSpeed.Enabled := True; + frmMain.ggeItem.Progress := 0; + frmMain.IdFTP.ChangeDir('bin'); + if OS = osWindows then begin + AddStatus('Uploading server.dll...', clBlack); + frmMain.ggeItem.MaxValue := FSize(ExtractFilePath(ParamStr(0)) + 'server.dll'); + UploadFile(ExtractFilePath(ParamStr(0)) + 'server.dll', 'server.dll'); + end + else begin + AddStatus('Uploading server_i486.so...', clBlack); + frmMain.ggeItem.MaxValue := FSize(ExtractFilePath(ParamStr(0)) + 'server_i486.so'); + UploadFile(ExtractFilePath(ParamStr(0)) + 'server_i486.so', 'server_i486.so'); + end; + { Remove created files } + AddStatus('Removing temporary files...', clBlack); + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'hl2launch.exe')); + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server.dll')); + DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server_i486.so')); + AddDone; + { End } + frmMain.IdFTP.Disconnect; + frmMain.ggeAll.Progress := frmMain.ggeAll.MaxValue; + frmMain.ggeItem.Progress := frmMain.ggeItem.MaxValue; + AddStatus('', clBlack, False); + AddStatus('Finished installation!', clBlack, False); + frmMain.tmrSpeed.Enabled := False; + eStr.Free; + + Screen.Cursor := crDefault; + frmMain.cmdNext.Enabled := True; + frmMain.cmdCancel.Hide; + frmMain.cmdNext.Show; + frmMain.tmrSpeed.Enabled := False; + frmMain.Caption := Application.Title; +end; + +end. diff --git a/installer/UnitPackSystem.pas b/installer/UnitPackSystem.pas new file mode 100644 index 0000000..077808a --- /dev/null +++ b/installer/UnitPackSystem.pas @@ -0,0 +1,211 @@ +unit UnitPackSystem; + +interface + +uses SysUtils, Classes, Zlib; + +procedure CompressFiles(Files : TStrings; const Filename : String); +function DecompressStream(Stream : TMemoryStream; DestDirectory : String): Boolean; +function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream; Version: String): Boolean; +function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean; +function Unpack: Boolean; +function GetVersion: String; + +implementation + +uses UnitfrmMain; + +procedure CompressFiles(Files : TStrings; const Filename : String); +var + infile, outfile, tmpFile : TFileStream; + compr : TCompressionStream; + i,l : Integer; + s : String; + +begin + if Files.Count > 0 then + begin + outFile := TFileStream.Create(Filename,fmCreate); + try + { the number of files } + l := Files.Count; + outfile.Write(l,SizeOf(l)); + for i := 0 to Files.Count-1 do + begin + infile := TFileStream.Create(Files[i],fmOpenRead); + try + { the original filename } + s := ExtractFilename(Files[i]); + l := Length(s); + outfile.Write(l,SizeOf(l)); + outfile.Write(s[1],l); + { the original filesize } + l := infile.Size; + outfile.Write(l,SizeOf(l)); + { compress and store the file temporary} + tmpFile := TFileStream.Create('tmp',fmCreate); + compr := TCompressionStream.Create(clMax,tmpfile); + try + compr.CopyFrom(infile,l); + finally + compr.Free; + tmpFile.Free; + end; + { append the compressed file to the destination file } + tmpFile := TFileStream.Create('tmp',fmOpenRead); + try + outfile.CopyFrom(tmpFile,0); + finally + tmpFile.Free; + end; + finally + infile.Free; + end; + end; + finally + outfile.Free; + end; + DeleteFile('tmp'); + end; +end; +function DecompressStream(Stream : TMemoryStream; DestDirectory : String): Boolean; +var + dest,s : String; + decompr : TDecompressionStream; + outfile : TFilestream; + i,l,c : Integer; +begin + // IncludeTrailingPathDelimiter (D6/D7 only) + dest := IncludeTrailingPathDelimiter(DestDirectory); + + Result := False; + try + { number of files } + Stream.Read(c,SizeOf(c)); + for i := 1 to c do + begin + { read filename } + Stream.Read(l,SizeOf(l)); + SetLength(s,l); + Stream.Read(s[1],l); + { read filesize } + Stream.Read(l,SizeOf(l)); + { decompress the files and store it } + s := dest+s; //include the path + outfile := TFileStream.Create(s,fmCreate); + decompr := TDecompressionStream.Create(Stream); + try + outfile.CopyFrom(decompr,l); + finally + outfile.Free; + decompr.Free; + end; + end; + finally + Result := True; + end; +end; + +function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream; Version: String): Boolean; +var + aStream: TFileStream; + iSize: Integer; +begin + Result := False; + if not FileExists(AFileName) then + Exit; + try + aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite); + MemoryStream.Seek(0, soFromBeginning); + // seek to end of File + // ans Ende der Datei Seeken + aStream.Seek(0, soFromEnd); + // copy data from MemoryStream + // Daten vom MemoryStream kopieren + aStream.CopyFrom(MemoryStream, 0); + // save Stream-Size + // die Streamgröße speichern + iSize := MemoryStream.Size + SizeOf(Integer); + aStream.Write(iSize, SizeOf(iSize)); + // save version number+length + iSize := aStream.Position; + aStream.Write(Version[1], Length(Version)); + aStream.Write(iSize, SizeOf(iSize)); + finally + aStream.Free; + end; + Result := True; +end; + +function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean; +var + aStream: TMemoryStream; + iSize: Integer; + EndPos: Integer; +begin + Result := False; + if not FileExists(AFileName) then + Exit; + + try + aStream := TMemoryStream.Create; + aStream.LoadFromFile(AFileName); + // drop version part + aStream.Seek(-SizeOf(Integer), soFromEnd); + aStream.Read(EndPos, SizeOf(Integer)); + aStream.SetSize(EndPos); + // seek to position where Stream-Size is saved + // zur Position seeken wo Streamgröße gespeichert + aStream.Seek(-SizeOf(Integer), soFromEnd); + aStream.Read(iSize, SizeOf(iSize)); + if iSize > aStream.Size then + begin + aStream.Free; + Exit; + end; + // seek to position where data is saved + // zur Position seeken an der die Daten abgelegt sind + aStream.Seek(-iSize, soFromEnd); + MemoryStream.SetSize(iSize - SizeOf(Integer)); + MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize)); + MemoryStream.Seek(0, soFromBeginning); + finally + aStream.Free; + end; + Result := True; +end; + +{ Unpack function } + +function Unpack: Boolean; +var eStream: TMemoryStream; +begin + eStream := TMemoryStream.Create; + try + // Get ZIP + LoadFromFile(ParamStr(0), eStream); + DecompressStream(eStream, ExtractFilePath(ParamStr(0))); // Unpack files + + Result := True; + except + Result := False; + end; + eStream.Free; +end; + +function GetVersion: String; +var FileStream: TFileStream; + EndPos, Size: Integer; + Version: String; +begin + FileStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite); + FileStream.Seek(-SizeOf(Integer), soFromEnd); + FileStream.Read(EndPos, SizeOf(EndPos)); + FileStream.Position := EndPos; + Size := FileStream.Size - EndPos - SizeOf(Integer); + SetString(Result, nil, Size); + FileStream.Read(Pointer(Result)^, Size); // YAMS + FileStream.Free; +end; + +end. diff --git a/installer/UnitSelectModPath.dfm b/installer/UnitSelectModPath.dfm new file mode 100644 index 0000000000000000000000000000000000000000..436262ce6c27b2c60427026c017b384104e95075 GIT binary patch literal 1148 zcmc&z%Z}496m^nL9!;kdA+bP08a6D^u!U8dHnf@!i5d^H1UI>D!nk(jxb5_B=115e zu|fO;OFm%44se{#qe!gT<@(z9JnqTwCc@$5G#QKs0X~iTaTgEKafdVz!f|-~5YNOS z0Sc)+lv?p0eQfP&o$rnLRLw`| zvoU@j47-zLfSYw!ziFlPykHsMV7QdNZqz8|wWq7MWC6B~NzNCfeyCads2$NP5I`hE zl@`~Hd0ABSo%WI^sQ_Ss;tb+2E-rzVF^CaMbMr&9g4%%`A{)nq0ri%Q_Mt51Oj~6( zDyPiGK`rqb**op8jb;zlK%#0LL#K4aX1pF~?+v`V z8E78fy8bMtK$PpH-sI7iuf)-UXLnn8g-{zOIZ%p~x_1R^T2ie0H%q#Y^LR)6#|@74 z)bOL}N3~A8T|()5T!x$~-%8Y&a4v06%#{8M$(QZ35;V$aLFQ0;es?AL1ZD!t+_gt6 zQ?8ni{Fn&!p*Qb#CRH$0DAJ2Mhn}0{d{Yf}?>mE#k3&jiZzUyX2k9b2!G`Oa|jNgb}n*Ds$?OQVH6U6qhEzJ33RJblvV8>UNNmvy)uU&k@YiAq;nH-?Jk zxMI53s~^?(_8PaFv7SdKdwTCQnZEkv2%SK=qS7?>1$s(gKv)X2-c9%~jsHuSU9-EB LW9-RMSw?>V>;-uw literal 0 HcmV?d00001 diff --git a/installer/UnitSelectModPath.pas b/installer/UnitSelectModPath.pas new file mode 100644 index 0000000..368d478 --- /dev/null +++ b/installer/UnitSelectModPath.pas @@ -0,0 +1,26 @@ +unit UnitSelectModPath; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, FileCtrl, ComCtrls, ShellCtrls, + TFlatComboBoxUnit, TFlatButtonUnit; + +type + TfrmSelectModPath = class(TForm) + pnlDesign: TPanel; + lblInfo: TLabel; + trvDirectory: TShellTreeView; + cmdOK: TFlatButton; + cmdCancel: TFlatButton; + end; + +var + frmSelectModPath: TfrmSelectModPath; + +implementation + +{$R *.DFM} + +end. diff --git a/installer/UnitfrmMain.dfm b/installer/UnitfrmMain.dfm new file mode 100644 index 0000000..14b183c --- /dev/null +++ b/installer/UnitfrmMain.dfm @@ -0,0 +1,11577 @@ +object frmMain: TfrmMain + Left = 333 + Top = 271 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsSingle + Caption = 'Metamod:Source Installer' + ClientHeight = 355 + ClientWidth = 527 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Icon.Data = { + 000001000C003030000001000800A80E0000C60000002020000001000800A808 + 00006E0F00001818000001000800C80600001618000010100000010008006805 + 0000DE1E0000808000000100200028080100462400006060000001002000A894 + 00006E2C010048480000010020008854000016C1010040400000010020002842 + 00009E1502003030000001002000A8250000C65702002020000001002000A810 + 00006E7D0200181800000100200088090000168E020010100000010020006804 + 00009E9702002800000030000000600000000100080000000000000900000000 + 0000000000000001000000010000000000003535360031393E003B3B3B00403E + 3E001D3642001E3C4C002A3B4400323B4100264150002C465400274C5F003E52 + 5D00214C62003A5A6B00205A7700205D7C00365E73002B627F00454343004846 + 46004647490048474800464A4D004A4848004C4A4A004D4D4D00504E4E004F4F + 50004F5050004351590053535300585656005457590055585800595858005C5B + 5B00595D5D005E5D5D00605F5F00595F600045616F005C6364005E696B004364 + 7500496A7B00596B72005B737B00636363006463630060656500666464006167 + 6B00636B6C006C6B6B00706E6E00606C70006370720068747600627479006979 + 7C007170700074737300767575007877770070777900797979007C7B7B007D7C + 7C0019668E0015699300336680002D6F91002C72970029729800337699003D7D + 9D001674A400327CA200476E820042728A005A79850051778B00567D8D005B7E + 8B00637D8500697D8200717C82001380B7002182B3002A82B000398CB7003E95 + BD005F8493006D8287006681890071808500788284007C888E00638C9B00688E + 9A0069919E0079959F00438CAE00488DAB00548CA300588FA600518FA9004B90 + AE005B91A6005594AF005993AA00408EB2004C93B2004C97B9004699BE004D99 + BA005496B100559AB7005E99B000539EBD00599DB800648FA6006397AA007098 + A8006A9CB300729EB50075A6BC007EA9BA001287C3001A8BC500118CCA00188E + CA000D95DB000D98DF001495D6001995D3001E98D5001195D800159ADD001C9B + DB00298EC2002596CD002A95CA003395C3003895C0003D9AC500329ACB00399B + CB002196D000239AD6002B9BD200239BD900319DD00024A0DF002CA1DC0032A0 + D70030A2DD000D9BE3000D9EE800119CE2001A9DE0000DA2EE001EA2E50013A4 + ED0019A5ED001DA8EF001AA7F0001CA8F00022A2E4002BA6E50021A7EB0028A7 + E80023A9ED002BABED0031A6E10034A9E50039ABE50033ACEA0039AEEA0037B0 + EE003CB2EE0024ABF0002BAEF00031AFF00033B1F1003CB4F100429AC3004C9E + C200529FC70070BADD0040B0E9004CB6EC0041B6F10047B8F2004CBAF30053BD + F3005BBEF10062BEED005BC0F40068C1EE007AC0E4007ACAEF0067C4F50069C5 + F50074C7F20078C7F00077CBF60078CBF5008281810086868600888787008B8A + 8A0086979D0090909100979B9F0099989800959DA2008FA0A60093A4AC0080AB + BE009AAEB500A5A4A400A3ADAD00AEBABA0084AFC60093B5C7009EB7C2009DBB + CA00A7BBC500AABCC30093C1D50099C2D700B1C3CA00A6C9DA00B1CAD40084CD + F1008ACFF20087D1F7008AD0F30094D5F6009ED7F5009ED8F60095D6F800A7D2 + E600B4DBED00A3DAF600ABDDF700A4DCF800AFE0F800BFE5F600B2E1F900BBE4 + F900CBE6F300CCE8F500C0E6FA00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + D13F3F3F42D10000000000000000000000000000000000000000000000000000 + 00000000000000000000000042231814141413141418181B3100000000000000 + 0000000000000000000000000000000000000000000000000000311814141414 + 141414141414141414141F420000000000000000000000000000000000000000 + 00000000000000003F14141414181F2A2F5154542F2B2218181414141F000000 + 00000000000000000000000000000000000000000000001F1314141F3969BB9C + 9CB0AFAFAF9D9471511F181414143F0000000000000000000000000000000000 + 000000000000181814183B729DAFB2B5B5B5B5C1B5B5B3B09D94531F18141331 + 000000000000000000000000000000000000000000181814236F9BAFAEB4B5B5 + B5B5B5B5B5B5B5B5B4B2AF912B18161323000000000000000000000000000000 + 000000001818182BBB9AAAAEB4B9B9B9B9B9B9B9B5B9BAB9B5B9B2AF96511818 + 183100000000000000000000000000000000002018182B929AACB7B7B7B7B7B7 + B8B8B8B8B7B9B7B9B9B8B7B7AF9A531818183F00000000000000000000000000 + 00003F14142ABBA1ABB6B6B6B6B6B6B6B6B6B7B7B7B7B7AFAFB7B7B7B69A962F + 18161800000000000000000000000000000018141F6E8BA3A84A2C2D2D8FB6B6 + B6B6A8A8B6B6B650214F5BACB6ACA38F2A161423000000000000000000000000 + 00311814558CA0A7A38804181F29A3A8A7A8A8A8B6A7A11F1F201F21508DA3A3 + 671818180000000000000000000000000014142292A0A4A7A2A710131B185AA7 + A7A7A7A7A2A74B1F1B1B1B1B1812A8A4872F1814230000000000000000000000 + 4218145F8A9FA4A2A7A28B0218180CA4A2A2A2A2A7A20C19160301130484A7A4 + A07018181800000000000000000000001F141F7286A2A2A2A2A2A24504181449 + A2A4A2A2A25916191410460506A4A2A486882A18183F00000000000000000000 + 14142A9B86A2A2A2A2A2A286071314178AA2A2A2A21116140383A2A285A2A2A2 + A28553181418000000000000000000001414568A9FA2A2A2A2A2A2A24D041314 + 47A2A2A28B1616140BA2A2A2A2A2A2A2A28670181818D10000000000000000D1 + 18186385A2A2A2A2A2A2A2A2A20913141684A7A24A1614044DA2A2A2A2A2A2A2 + A286901F14182300000000000000003F14186E86A2A2A2A2A2A2A2A2A2580114 + 160EA2A20C14140886A2A2A2A2A2A2A2A29F8F2216141800000000000000003F + 13187586A2A2A2A2A2A2A2A2A2A20D131414598413141310A2A2A2A2A2A2A2A2 + A29F952318141431000000000000003718187586A2A2A2A2A2A2A2A2A2A28401 + 13181E4814140481A2A2A2A2A2A2A2A2A29F952816141418000000000000003F + 13187785A2A2A2A2A2A2A2A2A2A2A21013181F181B180AA2A2A2A2A2A2A2A2A2 + A29F8F22141414143F000000000000D418186385A2A2A2A2A2A2A2A2A7A8B79A + 1723232723204EB6A8A2A2A2A2A2A2A2A286911F141414141B00000000000000 + 1418568786A2A2A2A2A2A7B7B8B9B9B94C2731313122B0B9B9B8A8A2A2A2A2A2 + A28667181614141414D300000000000014182A999FA2A2A2A2A7B8BABAC1C1C1 + B52B37373752C1B5C1B5BAB6A2A2A2A2A2855416141414141423000000000000 + 1F141D7586A2A2A2A2C1C3C3C3C3C3C3C37A403F37BDC3C3C3C4C3C3A8A2A2A2 + 9F952A14141414141414000000000000D118185E8B86A2A2B8C7C7C7C7C7C7C7 + C762D1D157C5C7C7C7C7C7C7C3A2A2A2866C1818141414141414330000000000 + 00141422BC86A2A2C1CCCCCCCCCCCCCCBED4D4D47ECCCCCCCCCCCCCCCCA7A286 + 893B141818181B18181418000000000000401414568986A2C7CFCFCFCFE1DBD9 + D9D8D8D6C9CFCFCFCFCFCFCFCFA7A2866B181D7D7F7F7F7F5616184000000000 + 000018141F7B869FC1EEEEEEEEE2DEDEDEDEDEDBEEEEEEEEEEEEEEEECFA28690 + 2A1618BEEE807C7C3B16141F000000000000DF1314237886A3EEF3F3F3E4DEDE + DEDEDEE8F3F3F3F3F3F3F3F3C286963B1318182ECA7F23141414141400000000 + 00000037131832BC86B4F8F8F8EAE6E6E6E6E5F6F8F8F8F8F8F8F8CDA0965518 + 181618185DEE661B1414141433000000000000001F16182A798AB0F2FBFBFBFB + FBFBFBFBFBFBFBFBFBF9CC8B8F3B181414141414187DED60181414141F000000 + 000000000018181822659B8BC6F9FFFFFFFFFFFFFFFFFFFCECB0877135181814 + 14141414181FE7F4311814141B0000000000000000001F141418397B9B8AB0CC + EDF2F6F6F3CAC08C8973551F141414141414181F1F1735FBD518141420000000 + 0000000000000034141814183564789389878B87879B736D3C1D181414141414 + 14141DF5DD182AFADA181414420000000000000000000000E018181814181C23 + 3A3C56563A2A1F181818131414141414141418E3FEDDEBFE4114141B00000000 + 00000000000000000000D1181814181818181414141414181418181414141414 + 1416181FDBE9E661181814000000000000000000000000000000000000371814 + 1414141414141414141414141414141414141418181818181823000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF + FFFFFFFF0000FFFFFFFFFFFF0000FFFFC0FFFFFF0000FFFC001FFFFF0000FFF0 + 0003FFFF0000FFC00001FFFF0000FF8000007FFF0000FF0000003FFF0000FE00 + 00001FFF0000FC0000000FFF0000F800000007FF0000F000000007FF0000F000 + 000003FF0000E000000003FF0000E000000001FF0000C000000001FF0000C000 + 000000FF0000C000000000FF0000C0000000007F000080000000007F00008000 + 0000007F000080000000003F000080000000003F000080000000001F00008000 + 0000001F0000C0000000000F0000C0000000000F0000C0000000000F0000C000 + 000000070000E000000000070000E000000000030000F000000000030000F000 + 000000030000F800000000010000FC00000000010000FE00000000010000FF00 + 000000010000FF80000000010000FFC0000000030000FFF0000000070000FFFE + 0000000F0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF + FFFFFFFF0000FFFFFFFFFFFF0000280000002000000040000000010008000000 + 00000004000000000000000000000001000000010000000000003E3D3D003042 + 4C0034444D003D464B002A495A00384B55002C51650024536C003C5968003B5B + 6D0034637B004240400045434300474545004846460046484900454B4F004A48 + 48004C4A4A004C4B4C004D4D4D00504E4E004D4E50004F50500041515B004555 + 5E005050500054525200535455005654540055595900555B5D00565C5E005A59 + 59005D5B5B00595C5D005F5E5E00605F5F00505B6000565F6100585F62005C61 + 61005A6064005261680056676D005C65690057696F005B686B005C6A6E004068 + 7D004E6A790052687100586B71005C6D7100596F7700526D780051717E006261 + 610064636300666464006B6A6A006C6B6B006E6D6D006C75780069767C007170 + 70007473730075747400787777007E7E7E00176288001F678D001D6E98001670 + 9E003B6E890029769E00397D9F001874A3001678AA00247AA700357DA2003C7F + A1004D758700497588005B7B8600507B8E00457A9500647E8900757F82001385 + BF001F88BE002981AE003E82A2003989AF003D88AE002183B500358CB6003C8D + B3003A95BF004D839A004D849C005F82910056879B0051879E005A879E006788 + 9700688997004083A1004583A0004C87A0004D88A3004888A5004488A800468C + AC00498DAB00508EA9004892B5004093B9007699A60071A1B6001E91CB001192 + D4001297DB001698D900199ADA001A9BDD001E9EDE002491C8002999CF002E99 + CE003D97C1003798C6003A98C4003399C900369AC900379BCC003A9AC8002498 + D400239CD700269CD6002E9DD2002B9DD500239EDD0026A1DF0033A2DA000D9A + E2000D9BE4000D9DE6000D9EE900129AE000179DE200149FE600189EE1000EA2 + EE001FA2E50014A1E90010A2EE0012A4EF0015A5EE001CA4EA0019A6EE0019A7 + F0001BA8F00027A6E60029A3E1002BA4E2002BA8E70025A8EB0026ABEF002EAE + EF0033A6E00031A8E40034ABE7003CACE60037AEEB0032AFEF0035AFED003AAF + EA0039B0ED003DB3EE0022AAF00024ABF00027ACF0002AADF0002DAEF10030B0 + F10035B1F10038B2F1003DB4F000439AC300429FCB0040A2D10040A3D40069AD + D00062B0D8007EBAD5004DB0E30049B1E60045B8F20049B9F3004FBAF10058BF + F30059BFF4005EC1F4006DC2ED007DCAEE0074CAF5007FCAF0007CCDF5008281 + 810085848400879396008B94940088969E0096959500989797008F9FA80087AB + BA0088ABBE0099ACB4009EAFB6009BB0BC00A5A4A400A6B3BA00A6B4BA0080B3 + CD0091B9CD00A4BFCC00ADCBD800B1CCD800B9CFD80081CCF2008AD1F60097D4 + F4009FD9F800A3CDE100A1D6F100A1D9F500ADDEF700A0DAF800B5E2F9000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 3F1E161616162244000000000000000000000000000000000000000000001E12 + 12161216160F121212220000000000000000000000000000000000003A12161F + 5675BFC1C1BE7038161612440000000000000000000000000000001E121E7091 + ADB1B4B4B4B4B2AD8439160F3A000000000000000000000000001E123488A7B1 + BBBBBBBBBBBCBBBCB1A57116163A00000000000000000000003A162D8EA8B7B7 + B7B7B7B7BBB9B9BBB7B1A461160F4600000000000000000000121F82A0804D52 + A5B6B6B6B6B6A5395FA5A89B6D16120000000000000000001E1672989F990416 + 4BA2A2A2A2A3511E1B1E327F7E34123F0000000000000000122E7C9F9D9F490F + 16799F9F9F9F1A16010F069F9F61121600000000000000440F70939D9D9D9502 + 0F0A9D9D9D5B120F4A474A9F957B280FD20000000000001E1684959D9D9D9D4F + 0C0F609D9D0B0F039D9D9D9D9D93540F1E000000000000121E8B9D9D9D9D9A9D + 050F199593100F489D9D9D9D9D935D120F0000000000000F2A7C9D9D9A9A9A9D + 5A010F4C5012017A9D9D9A9A9A9A5E0F122200000000000F2A7C9D9D9D9A9A9A + 9A080F11090F079D9D9A9A9A9A955E0F161600000000000F1F8B9D9D9A9A9A9D + 9F8B161F221E5C9F9D9A9A9A9A945D0F0F0F3F000000001E1684959D9A9AA3BB + BBBB573A3D29B1BBB99D9A9A9A94540F0F0F1600000000441268939D9AA3C8C8 + C8C8C5444469C8C8C8C89D9D9A7A28100F0F12D200000000122A7E9A9DCACCCC + CCCCC2D2D2C3CCCCCCCCBD9A9561160F12120F1E00000000221674939FCFCFCF + E2DBD9D7D6CFCFCFCFCFCA9D7B2D276A6A6A2A1000000000000F1F8893D1E9E9 + DEDFDFDFE3E9E9E9E9E9C89264102CCE77581F0F3A00000000D50F318EB4EEF0 + E4E1E1E1EDF0F0F0F0E99871150F1066C41E11121200000000002E102A84AEEE + F1F1F1F1F1F1F1F1E88F6E150F0F0F0F78DA160F120000000000002E161D688E + C5D0EEEFEFEACDAB633716120F0F16151DEC40121200000000000000D40F121F + 5574638884766537160F0F0F0F0F41E61FE55912160000000000000000003A0F + 0F0F1616160F12121212120F0F0F16DCE7DC1B12000000000000000000000000 + D83F1E0F0F1212120F120F0F0F0F0F0F16163D00000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF + FFFFFFC03FFFFF000FFFFC0003FFF80001FFF00000FFE000007FE000007FC000 + 003FC000003F8000001F8000001F8000001F8000000F8000000F800000078000 + 000780000003C0000003C0000003E0000001E0000001F0000001F8000001FC00 + 0001FF000003FFC00007FFFFFFFFFFFFFFFFFFFFFFFF28000000180000003000 + 0000010008000000000040020000000000000000000000010000000100000000 + 00003E41430039424800384851002C5B73002B5C7600345E7300464444004846 + 460045494C004A4848004C4A4A004E4D4D00454B50004D51530041525C004656 + 5F004F595D005151510054535300535455005554540058565600525859005559 + 5A00525B5E00545A5C00525C5F005B5A5A005C5B5B00595E5F005E5D5D00605F + 5F0043576200455862004F5F6800535B6000525D6100585F62004D616A005061 + 67005461670059606300596264005262690056676D00516872004F707E006065 + 670061676A006A6969006E6D6D00706F6F006972760064747D00727171007473 + 73001D6F9A002164860033658000226A900029779F003E7894001478AC00436B + 8100466F82004A7183004C74850048758A004D7A8E005D7C8B0042779300497A + 90004F7F9400467F9900497F9800607C8B001682B9003882A8002686B800348B + B500398EB5003D8EB400318CB9006E8089004583A0004A87A2004789A800428B + AD00438EB0004590B5005499BC00729FB20075A3BB001386C1001D8AC1001192 + D4001694D5001E95D1001799DB00129ADF001D9AD9001F9FDF002D95CA003296 + C6002FA0DA0037A1D6003CA1D30031A2DB0039A6DC000F9AE0000D9CE6000D9E + E900109AE0000DA0EB000DA2EE0018A1E70010A0E90011A3EE0011A4EF0014A4 + EE001CA8EF001EA9F00022A1E10027A5E5002DA7E50023A7EA002EABEB002EAC + EC0036AAE50035AFEE0039ADE80022AAF00026ACF00029ADF0002CAEF00036B2 + F10038B3F1003FB5F20042A0CC0049A9D7006AA7C70076B2CD007AB1C80046AE + E30054B3E30056B5E5005BB8E70045B7F10046B8F2004DBAF30062C2F40066C4 + F4007FCEF60081818100868686008A8989009897970099989800989C9E009E9D + 9E009CA0A3008BA5B000A2AEAE00A7B1B600B2B1B1008DB9CC00A9BDC500A2BF + CD0085C0DE009FCDE50080CBF20086CEF20091D4F6009CD7F6009CD8F800B8E3 + F900B9E4FA000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000331F1F1F370000000000 + 00000000000000000000009C0C08122528190C08120000000000000000000000 + 0000200C2E5A6D8183816B55190833000000000000000000001F0C557D828889 + 898989826C420C320000000000000000370C5284858686868686827F867C4408 + 9B000000000000000C4B74621040797A85794E25476766270C00000000000033 + 19657676050C4F767676220A080676500A9B00000000000C4470737360011070 + 765F08053F5E7671190C00000000000851737373733A083D733B084D73737370 + 400C00000000000C68737373736E020D60090373737373733E081F0000000008 + 6873737373733908220C3C73737373703E080800000000085173737376867F23 + 201F69847673736E410A08340000000C456E737A9595955B374C949589767371 + 2508080C00000037196673969797975D9B8D9797978873500C080C089B000000 + 08496E9799A9A1A0A0ABAB99999463284C8F5C2512000000A30C5983AFAAA4A4 + A8AFAFAFAD7B420C0E8E26080800000000360C5690AEB1B1B1B1B1996B2F0808 + 0828A612089C00000000540C28598C9293928B4B190808083530A23508000000 + 0000000016080C262B190C080808080831A7A71220000000000000000000A5A0 + 9D9D9D9D9D9D9D9D9DA0A0A50000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FF07FF00F801FF00F0007F00E0003F00C0001F00C0001F008000 + 0F0080000F0080000F008000070080000700800003008000030080000100C000 + 0100C0000100E0000000F0000100FC000100FF000300FFFFFF00FFFFFF002800 + 0000100000002000000001000800000000000001000000000000000000000001 + 000000010000000000003D525D00315467002E5F79004345470048464600434A + 4E004A4949004D4D4E00514F4F004F5050004D5357004A585E004C585E005152 + 52005253540053545500555758005E5D5D00475C67004A5A6200525D62004F60 + 67004B606B0058686F00436677004D6671004A6774004B68760042667800466C + 7E00496A7900486D7D0069686800647077007171710031698600306B8A003B7C + 9B003C7C9A00187FB4002F7CA3002B7DA700437085004372880047758B004777 + 8E005E7D8C001E87BC002D8AB8002D8CBB005B8094006B899600718793007A9A + A80078A4BB001386C2001C8CC6001196DA003B97C5003295C800359BCF002199 + D500249EDC002E9FD8002AA0DB0037A0D40031A2DC000F9DE600139BE0000DA0 + EA000EA2EE0014A3EB0015A5EF0027AAEC003CADE60036AFEC0027ACF00029AD + F0002CAEF00035B1F1003AB3F0003DB5F1004E9BC10058AAD20071B8DD0040B5 + F10069C5F500818080008B8A8A008D8D8D00808E95008599A40097A9B100A6AC + AF00A9AEAF00AEB5B500A3B2BA00B4B4B40097CFEB0083CBF0008DD0F20090D4 + F70095D6F70095D6F800ABDEF800AFDFF8000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000058580000 + 000000000000000000580A1B2E2E17085900000000000000211C424C51514C3B + 14230000000000591F3F3C4A4D4E3D43410C00000000000F3E48012948491708 + 293209000000001E46462806453904383A440C00000062264647470225240346 + 47461D1200006226464747390A0B304747461D050000001F4649525233225650 + 47460B08210000113E5257555C3757574F3215180F0000601F4B68615E636868 + 410C2F3408590000351B54656A6A64530C0508360F230000005F0F1B2E2B1408 + 05055B5D11000000000000000000000000000000000000000000000000000000 + 000000000000FFFF0000FCFF0000E01F0000C00F0000800F0000800700008007 + 00000003000000030000800100008001000080000000C0000000E0010000FFFF + 0000FFFF00002800000080000000000100000100200000000000000801000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F + 7F01000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000100000002000000040000000500000007000000080000000A0000 + 000C0000000D0000000D0000000E0000000E0000000E0000000D0000000D0000 + 000C0000000A0000000800000007000000050000000300000002000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000100000003000000050000 + 00090000000C0000001000000014000000180000001C0000001F000000230000 + 0025000000270000002800000028000000280000002800000028000000270000 + 0025000000220000001F0000001C00000017000000130000000F0000000B0000 + 0007000000040000000200000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000100000003000000070000000C00000012000000180000 + 001F000000250000002C00000032000000370000003B0000003E000000410000 + 0043000000450000004500000046000000460000004600000045000000450000 + 0043000000410000003E0000003B00000036000000310000002B000000240000 + 001D00000016000000100000000A000000060000000300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0003000000070000000C000000130000001B000000250000002E000000360000 + 003D00000043000000480000004B0000004E0000005100000052000000540000 + 0055000000550000005500000056000000560000005600000055000000550000 + 00540000005400000052000000500000004E0000004B00000047000000420000 + 003B000000340000002B0000002200000019000000110000000A000000050000 + 0001000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001211110100000004000000090000 + 00100000001A00000025000000300000003A00000042000000490000004E0000 + 005203030357161616761F1E1E91242323A9343333BE3D3C3CD0403E3ED84543 + 43EA454343EA454343EA454343EA454343EA454343EA454343EA403E3ED83C3A + 3ACD323131BB232222A71E1D1D8C141414720000005700000056000000540000 + 00510000004C0000004700000040000000370000002C00000020000000160000 + 000E000000070000000300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000012111101000000040000000A000000130000001F0000 + 002B00000037000000410000004A000000500908085E1F1E1E902D2C2CB54240 + 40E0484646FC494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF474545F73F3D3DD5292828AC1A1A + 1A820505055D00000056000000530000004E000000470000003E000000330000 + 00260000001A0000001000000008000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000012111101000000040000000A00000014000000210000002F0000003B0000 + 00460000004E0F0F0F69262525A5403E3ED7494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF474545F7393737C8201F1F940707076000000055000000510000004B0000 + 0043000000370000002A0000001B000000100000000700000002000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00030000000800000012000000200000002F0000003D0000004805050555201F + 1F94403E3ED7494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF474545F7343232C01817177D000000570000 + 00540000004E0000004400000038000000290000001A0000000E000000061211 + 1101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000012111101000000050000 + 000F0000001C0000002C0000003B000000480B0B0B612E2D2DB2474545F44947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF413F3FE02221 + 21970302025A000000540000004E000000440000003600000026000000160000 + 000B000000031211110100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000300000009000000160000 + 002600000037000000460D0D0D65353333BF484646FA494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF454444EF262525A10505055C000000540000004C00000041000000310000 + 001F000000100000000712111101000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000002F3F3F01000000050000000E0000001D0000002F0000 + 0040090909572F2E2EB3484646FA494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4A48 + 48FF4A4949FF4A4949FF4A4949FF4A4949FF4A4848FF4A4848FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF444242E7212020940000005700000052000000490000 + 003A00000028000000170000000A000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000002F3F3F0100000007000000130000002400000037000000472524 + 2497474545F4494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4A4949FF4C4B4BFF4F4F4FFF515353FF555757FF585C5CFF5B6060FF5D63 + 63FF5F6565FF606767FF606767FF5F6565FF5E6363FF5C6060FF585C5CFF5558 + 58FF525353FF4F4F4FFF4C4C4CFF4B4949FF494848FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF3F3D3DDB12121277000000550000 + 004E00000042000000300000001D0000000E000000052F3F3F01000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000020000000A000000170000002A0000003E111111673F3D3DD94947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4A4949FF4D4C4CFF515252FF585B + 5BFF5F6565FF677070FF707B7BFF778787FF7D9293FF7D999EFF7B9EA7FF76A1 + ADFF72A2B1FF70A2B3FF70A2B3FF70A1B2FF73A0AEFF779EA9FF7B9AA0FF7B92 + 95FF78898AFF717E7EFF697272FF616767FF595C5CFF525353FF4D4D4DFF4B49 + 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF484646FC2F2E2EB30505 + 055C0000005200000048000000370000002300000011000000062F3F3F010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00030000000C0000001B0000002F000000422928289B484646F9494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4A4848FF4D4D4DFF535555FF5C6060FF687070FF768484FF7F97 + 9AFF74A1AEFF5DA1BCFF479FC6FF379DCDFF2899D1FF1F97D2FF1E96D4FF2098 + D5FF229AD6FF249BD7FF259BD7FF229AD6FF2199D6FF1E96D4FF1D96D3FF2197 + D1FF2D9ACFFF3C9CC8FF4F9DBEFF669EB2FF78989FFF778788FF6A7474FF5D63 + 63FF545656FF4E4E4EFF4A4949FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4341 + 41E512121277000000550000004B0000003C0000002800000014000000073F3F + 3F01000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000030000 + 000D0000001E000000330B0A0A543B3939CD494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B4A + 4AFF505151FF595D5DFF677070FF798889FF7E9EA5FF65A4BCFF409FCAFF2498 + D1FF1E97D5FF269CD8FF2CA0DBFF2EA2DDFF30A3DEFF31A4DFFF32A5E0FF33A6 + E1FF33A6E1FF34A6E1FF34A6E1FF34A6E1FF33A6E1FF33A5E0FF32A5E0FF31A4 + DFFF30A2DDFF2DA1DCFF279DD9FF1F98D6FF1B94D2FF2C99CDFF4E9DBFFF709D + ABFF798C8EFF6A7474FF5C6060FF515252FF4C4B4BFF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF484646FC2726269F000000560000004E000000400000002B000000170000 + 0008000000020000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000030000000D0000 + 001F0000003513121269444242E9494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4C4B4BFF525353FF5E63 + 63FF707C7CFF80999CFF6BA5BAFF3A9ECCFF2097D3FF239AD7FF2BA0DBFF2EA2 + DDFF30A4DFFF32A6E1FF34A7E2FF35A9E4FF37AAE5FF37ABE6FF38ACE6FF39AC + E7FF39ADE8FF3AADE8FF3AADE8FF3AADE8FF3AACE7FF39ACE7FF38ACE6FF38AB + E6FF37AAE5FF35A9E3FF33A7E2FF32A5E0FF30A4DFFF2DA1DCFF269CD8FF1B95 + D4FF2697CFFF4D9DBFFF7599A3FF738181FF606767FF535555FF4C4C4CFF4948 + 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF363434C30707075E00000050000000420000002D0000 + 0018000000090000000200000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000030000000D0000001F0000 + 0036201F1F80474545F7494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF4B4A4AFF515252FF5F6464FF738080FF80A0 + A6FF57A4C3FF2899D1FF2198D6FF2A9FDBFF2DA2DEFF30A5E0FF32A7E3FF34A9 + E5FF36ABE7FF37ACE8FF39AEE9FF3AAEEAFF3BAFEBFF3CB1ECFF3DB1ECFF3DB1 + ECFF3DB1EDFF3EB2EDFF3EB2EDFF3EB2EDFF3EB1ECFF3EB1ECFF3DB1ECFF3DB0 + ECFF3CB0EBFF3BAEEAFF3AAEE9FF38ACE8FF37ABE6FF34A8E4FF32A6E1FF30A4 + DFFF2CA1DCFF239BD8FF1994D2FF389AC8FF6C9DADFF758587FF616868FF5355 + 55FF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF3F3D3DDD0B0B0B6700000051000000440000 + 002F000000190000000903223202000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000030000000C0000001F000000362928 + 2894484646FC494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4A4848FF4F4F4FFF5B6060FF717C7CFF82A0A5FF51A3C5FF2398 + D2FF249BD8FF2AA0DCFF2DA3E0FF30A6E3FF32A8E5FF35ABE7FF36ACE9FF38AE + EAFF39B0EBFF3BB0ECFF3CB1EDFF3DB2EEFF3DB3EEFF3EB3EFFF3EB3EFFF3FB4 + F0FF3FB4F0FF3FB4F0FF40B4F0FF40B4F0FF40B4F0FF40B4EFFF3FB4EFFF3FB3 + EFFF3EB2EEFF3EB2EEFF3DB2EDFF3CB1ECFF3BB0EBFF39AEEAFF37ADE9FF35AA + E6FF33A8E4FF30A5E1FF2DA2DEFF279DDAFF1A95D3FF3099CAFF6A9CAEFF7483 + 83FF5E6464FF505151FF4A4949FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF444242EA0F0E0E71000000520000 + 00440000002F00000018000000082F3F3F010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000020000000B0000001D000000352A2929974947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4C4B4BFF555858FF687171FF81989AFF5EA6C2FF2498D1FF249BD8FF29A0 + DCFF2CA4E0FF2FA6E3FF31A9E6FF34ABE9FF36AEEAFF38AFECFF39B0EDFF3AB1 + EEFF3BB2EFFF3CB3EFFF3DB3F0FF3DB4F0FF3DB4F1FF3EB5F1FF3EB5F1FF3EB5 + F1FF3EB5F1FF3FB5F1FF3FB5F2FF3FB5F1FF3FB5F2FF3FB5F2FF3FB5F1FF3FB5 + F1FF3FB5F1FF3FB4F0FF3EB4F0FF3EB3EFFF3DB3EFFF3CB2EDFF3BB1ECFF39AF + EBFF37ADEAFF35ABE8FF32A9E5FF2FA6E2FF2CA2DFFF269DDAFF1894D3FF3699 + C7FF7399A4FF6C7777FF585B5BFF4D4C4CFF494848FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF454444EF121111740000 + 0052000000430000002D00000017000000072F3F3F0100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000002F3F3F01000000090000001A000000322B292996494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4F4F + 4FFF5D6262FF778686FF79A8B5FF319CCEFF2098D6FF279EDBFF2AA2DFFF2DA6 + E3FF30A9E7FF32ABEAFF35ADEBFF37AFEDFF38B0EEFF39B1EFFF39B2F0FF39B3 + F0FF3AB3F0FF3BB4F1FF3BB4F1FF3CB5F2FF3CB5F2FF3CB5F2FF3CB5F2FF3CB5 + F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3EB5 + F2FF3EB5F2FF3EB5F1FF3EB5F1FF3DB4F1FF3DB4F1FF3DB3F0FF3CB3EFFF3BB2 + EFFF3AB1EDFF39AFECFF37AEEAFF34ABE8FF31A8E5FF2DA5E2FF2AA1DEFF239B + D9FF1893D1FF519DBDFF768C8FFF616767FF515252FF4A4949FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF474545F71413 + 137C00000051000000420000002B00000014000000062F3F3F01000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00002F3F3F0100000007000000160000002F2B2A2A94494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF535454FF666E + 6EFF829A9CFF55A5C6FF1F96D3FF249CDAFF27A0DEFF2AA4E3FF2DA8E6FF30AA + E9FF32ADEBFF34AEEDFF36B0EEFF37B1EFFF38B2F0FF38B2F0FF39B2F1FF39B3 + F1FF39B3F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF3AB4F2FF3AB4F2FF3AB4 + F2FF3AB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4 + F2FF3CB4F2FF3CB5F2FF3CB5F2FF3CB5F2FF3CB5F2FF3CB4F1FF3BB4F1FF3BB4 + F0FF3AB3F0FF39B2EFFF39B1EEFF38AFECFF35ADEBFF32AAE8FF2FA7E4FF2BA3 + E0FF289FDCFF1C97D6FF2B98CBFF6F99A7FF6A7575FF555757FF4C4B4BFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4544 + 44EF0F0E0E71000000500000003F000000270000001100000004000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000500000012000000292322227E494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4C4B4BFF565858FF6E7979FF81A5 + ADFF369DCEFF1E97D6FF249EDCFF28A2E1FF2AA5E5FF2DA9E8FF2FACEAFF31AD + ECFF33AFEEFF34B0EFFF35B1F0FF35B1F1FF36B2F1FF36B2F2FF37B2F2FF37B3 + F2FF37B3F2FF37B3F2FF37B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3 + F2FF38B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3 + F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B3 + F1FF39B3F1FF39B3F0FF39B2F0FF38B1EFFF37B0EEFF35AEECFF32ACEAFF2FA9 + E7FF2CA5E3FF29A1DEFF229BD9FF1A93D1FF599DB8FF728081FF595D5DFF4C4C + 4CFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF454444EF0C0C0C680000004E0000003B000000220000000D000000030000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00030000000D0000002315141465484646F9494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF4C4C4CFF595D5DFF758383FF79AAB9FF2598 + D1FF209AD8FF249FDDFF27A3E2FF29A7E6FF2CAAEAFF2EACECFF30ADEEFF31AF + EFFF32AFF0FF32B0F1FF33B0F1FF33B1F1FF33B1F1FF34B1F1FF34B1F2FF34B1 + F2FF34B1F2FF35B1F2FF35B1F2FF35B1F2FF35B2F2FF35B2F2FF36B2F2FF36B2 + F2FF36B2F2FF36B2F2FF36B2F2FF36B2F2FF37B2F2FF37B2F2FF37B3F2FF37B3 + F2FF37B3F2FF37B3F2FF37B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3 + F2FF38B3F2FF38B3F2FF38B2F1FF37B2F0FF37B1F0FF36B0EFFF34AEEDFF32AD + EBFF2FAAE9FF2BA6E5FF28A2E0FF249DDCFF1694D3FF469CC2FF778A8DFF5C61 + 61FF4E4E4EFF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF424040E50707075D0000004B000000360000001D0000000A2F3F + 3F01000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000002F3F3F010000 + 00090000001C0D0D0D4B464444ED494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF4D4C4CFF5B6060FF7A8A8AFF6BAAC1FF1D95D2FF209A + D9FF239FDEFF26A3E4FF29A7E8FF2BAAEBFF2CABEDFF2EADEEFF2FAFEFFF2FAF + F0FF30AFF0FF30B0F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF32B0 + F1FF32B0F1FF32B1F1FF32B1F1FF32B1F1FF32B1F1FF33B1F1FF33B1F1FF33B1 + F1FF33B1F1FF33B1F1FF33B1F1FF34B1F1FF34B1F1FF34B1F2FF34B1F2FF35B1 + F2FF35B1F2FF35B1F2FF35B1F2FF35B2F2FF35B2F2FF35B2F2FF36B2F2FF36B2 + F2FF36B2F2FF36B2F2FF36B2F2FF36B2F2FF36B1F1FF35B1F0FF34B0F0FF33AF + EEFF31ADECFF2FABEAFF2BA7E7FF28A3E2FF249EDDFF1995D5FF3298C8FF7891 + 95FF5F6565FF4E4E4EFF4A4848FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF3A3939D003030357000000470000002F000000160000 + 0006000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000050000 + 0015040404313F3D3DD2494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4D4C4CFF5C6161FF7D8D8EFF61A8C5FF1A95D3FF1E9ADAFF22A0 + E0FF24A4E5FF27A7E9FF29AAEBFF2AABEDFF2BADEFFF2CAEEFFF2DAEF0FF2DAF + F1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FB0 + F1FF2FB0F1FF2FB0F1FF2FB0F1FF2FB0F1FF30B0F1FF30B0F1FF30B0F1FF30B0 + F1FF30B0F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0 + F1FF32B0F1FF32B0F1FF32B1F1FF32B1F1FF32B1F1FF32B1F1FF33B1F1FF33B1 + F1FF33B1F1FF33B1F1FF33B1F1FF33B1F1FF33B1F1FF33B1F1FF33B0F1FF32B0 + F0FF31AFEFFF30ADEDFF2DABEAFF2AA7E7FF27A4E3FF249FDDFF1A96D7FF2996 + CBFF75939AFF606767FF4E4E4EFF4A4848FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF2E2C2CAE0000005200000041000000270000 + 0010000000030000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000030000000E0000 + 0025302F2FA2494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4C4B4BFF5B5F5FFF7C8D8EFF62AAC6FF1894D3FF1D9ADBFF209FE1FF23A4 + E6FF26A7E9FF28A9EBFF28ABEEFF29ACEFFF29ADF0FF2AADF0FF2AAEF1FF2BAE + F1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAFF1FF2CAF + F1FF2CAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2EAF + F1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FB0F1FF2FB0 + F1FF2FB0F1FF2FB0F1FF2FB0F1FF2FB0F1FF30B0F1FF30B0F1FF30B0F1FF30B0 + F1FF30B0F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31AF + F0FF30AFF0FF2FAEEFFF2EADEDFF2CAAEBFF29A8E8FF26A3E3FF229EDEFF1A97 + D7FF2895CBFF75939AFF5F6565FF4E4E4EFF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF1B1B1B860000004E000000390000 + 001F0000000A1211110100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000012111101000000080000001B1A19 + 1966494747FF494747FF494747FF494747FF494747FF494747FF494747FF4C4B + 4BFF585C5CFF798989FF67ABC4FF1894D3FF1B9ADAFF1E9EE0FF21A3E5FF24A7 + E9FF25A8ECFF27AAEEFF27ABEFFF28ACF0FF28ADF1FF28ADF1FF28ADF1FF28AD + F1FF28ADF1FF28ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29AD + F1FF29ADF1FF2AADF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2BAE + F1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAF + F1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAF + F1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FAFF1FF2EAF + F1FF2EAFF0FF2EAEF0FF2DAEEFFF2CACEDFF2AAAECFF28A7E9FF24A2E4FF219E + DEFF1997D7FF2896CBFF789195FF5C6161FF4C4C4CFF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF464444F20A0A0A62000000480000 + 0030000000150000000500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000400000012090909344543 + 43E6494747FF494747FF494747FF494747FF494747FF494747FF4B4949FF5558 + 58FF748181FF73ADC0FF1793D2FF1A99DAFF1C9EE0FF1FA2E5FF22A6E9FF23A8 + ECFF24A9EEFF25ABEFFF25ABF0FF25ACF1FF26ACF1FF26ACF1FF26ACF1FF27AC + F1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF28AD + F1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28AD + F1FF28ADF1FF28ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29AD + F1FF2AADF1FF2AADF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2BAE + F1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAEF1FF2CAF + F1FF2CAFF1FF2CAEF0FF2BADF0FF2BADEFFF2AABEDFF28AAEBFF26A6E8FF23A2 + E4FF1F9DDEFF1796D6FF3298C8FF768A8DFF595D5DFF4C4B4BFF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF373535C8000000510000 + 0040000000240000000D00000002000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000121111010000000A0000001F313030A64947 + 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF525353FF6D78 + 78FF80ACB7FF1F96D1FF1897D9FF1A9DDFFF1CA1E5FF1FA5E9FF21A7ECFF22A9 + EEFF22AAEFFF23AAF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF24ABF0FF24AB + F0FF24ABF0FF24ABF0FF24ABF0FF25ABF0FF25ABF0FF25ACF1FF25ACF1FF25AC + F1FF25ACF1FF25ACF1FF26ACF1FF26ACF1FF26ACF1FF26ACF1FF27ACF1FF27AC + F1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF28AD + F1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF3F83 + A5FF3B8FBAFF2BA9E9FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29AD + F1FF2AADF1FF29ADF1FF29ADF0FF29ADF0FF29ACEFFF28ABEDFF27A8EBFF24A6 + E8FF21A1E3FF1D9CDDFF1594D5FF469CC2FF728081FF555757FF4A4949FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF1F1E1E8D0000 + 004C000000350000001900000007000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000040000001417171754484646FC4947 + 47FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF656C6CFF85A5 + AAFF299AD0FF1696D7FF189BDEFF1AA0E4FF1DA4E9FF1EA6EBFF1FA8EDFF20A9 + EEFF20A9EFFF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AA + F0FF22AAF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF23ABF0FF23AB + F0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF24ABF0FF24AB + F0FF24ABF0FF24ABF0FF24ABF0FF24ABF0FF25ABF0FF25ACF1FF25ACF1FF25AC + F1FF25ACF1FF25ACF1FF26ACF1FF26ACF1FF26ACF1FF26ACF1FF2AA3E1FF5658 + 5AFF5B5959FF595D60FF497790FF3596C8FF28ABEEFF27ACF1FF27ACF1FF28AD + F1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ACF0FF27ABEFFF26A9EDFF24A8 + EBFF21A4E7FF1FA0E2FF1B9ADBFF1292D2FF599CB8FF6A7575FF515252FF4948 + 48FF494747FF494747FF494747FF494747FF494747FF494747FF454343EC0707 + 075B00000043000000270000000F000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000010000000B00000021413F3FCC494747FF4947 + 47FF494747FF494747FF494747FF494747FF4C4B4BFF5C6161FF839798FF46A3 + CCFF1494D5FF169ADCFF189EE2FF1BA2E7FF1CA5EAFF1DA7EDFF1DA8EEFF1DA8 + EFFF1FA5E9FF2E3B42FF3E3D3DFF4C4A4AFF535252FF565454FF565454FF5654 + 54FF565454FF565454FF555454FF3B7898FF20A9F0FF20AAF0FF20AAF0FF20AA + F0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF22AA + F0FF22AAF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF23ABF0FF23AB + F0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF3A81A5FF5856 + 56FF595858FF595858FF595858FF5A5858FF546169FF427E9DFF2F9CD4FF25AC + F1FF25ACF1FF25ACF1FF26ACF1FF26ACF1FF25ACF1FF25ABF0FF25AAEFFF24A9 + EDFF22A6EAFF1FA3E6FF1C9EE0FF1999DAFF1892D0FF6F99A7FF616767FF4D4C + 4CFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2E2D + 2DB00000004D000000360000001A000000070000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000004000000141F1E1E6D494747FF494747FF4947 + 47FF494747FF494747FF494747FF4A4848FF545656FF758282FF6CADC4FF1292 + D2FF1597DAFF169DE1FF18A1E7FF1AA4EAFF1AA6EDFF1BA7EEFF1BA7EFFF1CA8 + F0FF1CA8F0FF2277A2FF343333FF434242FF4F4D4DFF535151FF545353FF5453 + 53FF545353FF545353FF545353FF515253FF249CD9FF1EA9F0FF1EA9F0FF1EA9 + F0FF1EA9F0FF1EA9F0FF1EA9F0FF1EA9F0FF1FA9F0FF1FA9F0FF1FA9F0FF1FA9 + F0FF1FA9F0FF20A9F0FF20A9F0FF20A9F0FF20AAF0FF20AAF0FF20AAF0FF20AA + F0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF22A9EDFF4D5A61FF5755 + 55FF585656FF585656FF585656FF585656FF585656FF585656FF585757FF4F67 + 73FF3B86ACFF28A3E1FF23ABF0FF23ABF0FF23ABF0FF23AAF0FF23AAEFFF22A9 + EEFF22A7ECFF1FA5E9FF1CA1E5FF1A9CDEFF1696D7FF2A97CBFF768C8FFF585B + 5BFF4A4949FF494747FF494747FF494747FF494747FF494747FF494747FF4846 + 46FA0C0C0C6600000043000000270000000E0000000200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000A05050523454343DF494747FF494747FF4947 + 47FF494747FF494747FF494747FF4E4E4EFF666E6EFF87ABB1FF2097D1FF1395 + D8FF159BDFFF169FE5FF17A3E9FF18A4ECFF19A6EEFF19A6EFFF19A7F0FF1AA7 + F0FF1AA8F0FF1AA6EDFF29414DFF393838FF474646FF504E4EFF525050FF5351 + 51FF535151FF535151FF535151FF535151FF3E6B82FF1BA8F0FF1CA8F0FF1CA8 + F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1DA8F0FF1DA9 + F0FF1DA9F0FF1DA9F0FF1DA9F0FF1DA9F0FF1DA9F0FF1EA9F0FF1EA9F0FF1EA9 + F0FF1EA9F0FF1EA9F0FF1EA9F0FF1EA9F0FF1EA9F0FF2D8DBFFF535151FF5654 + 54FF565454FF565454FF565454FF565454FF575555FF575555FF575555FF5755 + 55FF575555FF565657FF486D81FF358CB8FF23A7EBFF21AAF0FF21AAEFFF21A9 + EFFF20A8EDFF1FA6EBFF1DA3E9FF1A9FE3FF189ADCFF1292D4FF519DBDFF6C77 + 77FF505151FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF353333BF0000004C00000034000000170000000500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000030000001127252578494747FF494747FF494747FF4947 + 47FF494747FF494747FF4B4949FF595D5DFF819494FF48A4CDFF1192D5FF1398 + DCFF149DE3FF16A1E8FF17A3EBFF17A5EEFF17A6EFFF17A7F0FF17A7F0FF17A7 + F0FF18A7F0FF18A7F0FF1C82B7FF2F2E2EFF3F3D3DFF4B4949FF504E4EFF514F + 4FFF525050FF525050FF525050FF525050FF504E4EFF2690C6FF19A7F0FF19A7 + F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1BA8 + F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1CA8 + F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF40667AFF535151FF5452 + 52FF545353FF545353FF545353FF545353FF545353FF555353FF555353FF5553 + 53FF555353FF555353FF555353FF555353FF53575AFF3F728CFF2A8FC2FF1EA9 + EFFF1EA8EEFF1EA7EDFF1DA5EAFF1AA2E6FF189DE1FF1597D9FF1391D0FF7399 + A4FF5E6464FF4C4B4BFF494747FF494747FF494747FF494747FF494747FF4947 + 47FF484646FC0E0E0E6500000040000000230000000B12111101000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000070000001B444242D8494747FF494747FF494747FF4947 + 47FF494747FF494747FF505151FF6D7878FF7CAFBEFF1090D1FF1196DAFF129B + E1FF149FE7FF15A2EAFF15A4EDFF16A5EFFF16A5EFFF16A6F0FF16A6F0FF17A6 + F0FF17A6F0FF17A6F0FF17A6F0FF23495CFF343333FF434141FF4C4A4AFF4F4D + 4DFF504E4EFF504E4EFF504E4EFF504E4EFF504E4EFF435C6AFF18A5EDFF18A7 + F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF19A7F0FF19A7 + F0FF19A7F0FF19A7F0FF19A7F0FF19A7F0FF19A7F0FF19A7F0FF1AA7F0FF1AA8 + F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF209BDAFF4E4C4CFF535151FF5351 + 51FF535151FF535151FF535151FF535151FF535151FF535151FF535252FF5452 + 52FF545252FF545252FF545252FF545252FF535252FF4F4D4DFF434141FF2E4E + 5EFF1CA7EFFF1CA7EEFF1BA6ECFF1AA3E9FF179FE4FF169ADDFF1294D6FF3699 + C8FF748383FF535555FF494848FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF2F2E2EB5000000490000002F0000001300000003000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000010000000D1F1E1E64494747FF494747FF494747FF494747FF4947 + 47FF494747FF4B4A4AFF5C6161FF879D9EFF359ECFFF0F92D6FF1098DDFF119D + E4FF13A0E9FF13A2EBFF14A4EDFF14A5EEFF14A5EFFF14A5EFFF15A6EFFF15A6 + EFFF15A6EFFF15A6EFFF15A6EFFF188DC9FF2A2B2CFF3A3838FF474545FF4D4B + 4BFF4F4D4DFF4F4D4DFF4F4D4DFF4F4D4DFF4F4D4DFF4E4C4CFF2A81AEFF16A6 + F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6 + F0FF17A6F0FF17A6F0FF17A7F0FF17A7F0FF17A7F0FF17A7F0FF17A7F0FF18A7 + F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF337496FF504E4EFF514F4FFF5250 + 50FF525050FF525050FF525050FF525050FF525050FF525050FF525050FF5250 + 50FF525050FF525050FF525050FF525050FF504E4EFF494747FF3A3939FF246C + 91FF1AA8F0FF1AA7EFFF1AA6EEFF19A4EBFF17A1E7FF159DE1FF1397DAFF0E90 + D2FF699CAEFF616868FF4C4C4CFF494747FF494747FF494747FF494747FF4947 + 47FF494747FF474545F4070707580000003A0000001D00000008000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000400000015413F3FC3494747FF494747FF494747FF494747FF4947 + 47FF494747FF505151FF6F7A7AFF76AFC2FF0E8FD1FF0F95DAFF0F9AE1FF119E + E7FF12A1EAFF12A3EDFF13A4EEFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5 + EFFF13A5EFFF13A5EFFF13A5EFFF14A5EFFF1E5470FF302E2EFF3F3E3EFF4947 + 47FF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF465258FF189F + E4FF15A6EFFF15A6EFFF15A6EFFF15A6EFFF15A6EFFF15A6EFFF16A6F0FF16A6 + F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF17A6 + F0FF17A6F0FF17A6F0FF17A6F0FF18A3EAFF465158FF4F4D4DFF4F4D4DFF4F4D + 4DFF504E4EFF504E4EFF504E4EFF4F4D4DFF4E4C4CFF4E4C4CFF4E4C4CFF504E + 4EFF514F4FFF514F4FFF514F4FFF514F4FFF4D4B4BFF414040FF323334FF1A9B + DDFF19A7F0FF18A6EFFF18A6EEFF17A5EDFF17A2E9FF159EE5FF1399DFFF1093 + D6FF2F98CAFF758587FF535555FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF2423239900000044000000280000000E000000020000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000815141439494747FF494747FF494747FF494747FF494747FF4947 + 47FF4B4949FF5B5F5FFF869D9DFF389FCFFF0D92D6FF0E98DEFF0F9CE4FF10A0 + E8FF10A2ECFF11A3EDFF11A3EEFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF12A4 + EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF1398DBFF26292BFF353434FF4342 + 42FF4B4949FF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4C4A4AFF3073 + 95FF13A5EFFF13A5EFFF13A5EFFF13A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5 + EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF15A6EFFF15A6 + EFFF15A6EFFF15A6EFFF15A6EFFF2684B4FF4B4A4AFF4E4C4CFF4E4C4CFF4F4D + 4DFF4F4D4DFF4F4D4DFF4E4C4CFF4B4A4AFF474545FF444242FF454343FF4948 + 48FF4D4B4BFF4E4C4CFF4F4D4DFF4E4C4CFF484646FF393838FF25536BFF17A6 + F0FF17A6F0FF17A6F0FF17A5EFFF16A4EEFF16A3EBFF14A0E8FF129BE2FF1096 + DAFF0E90D1FF6C9DADFF606767FF4C4B4BFF494747FF494747FF494747FF4947 + 47FF494747FF494747FF413F3FDD0000004C0000003400000017000000050000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00010000000D2F2E2E93494747FF494747FF494747FF494747FF494747FF4947 + 47FF4F4F4FFF6B7676FF7FB1BFFF0D8FD1FF0E94D9FF0E99E1FF0F9DE7FF0FA0 + EAFF10A2EDFF10A3EEFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF11A4 + EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF196187FF2C2B2BFF3B3A + 3AFF464444FF4B4949FF4B4949FF4B4949FF4B4949FF4B4949FF4B4949FF474A + 4CFF1998D9FF12A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF13A5 + EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5 + EFFF13A5EFFF13A5EFFF13A5EFFF3A5D6FFF4C4A4AFF4D4B4BFF4D4B4BFF4D4B + 4BFF4D4B4BFF4D4B4BFF4C4A4AFF454343FF3B3939FF343232FF353434FF3B3A + 3AFF413F3FFF464444FF4A4848FF494747FF403F3FFF313030FF1A81B6FF15A6 + EFFF15A6EFFF15A6EFFF15A6EFFF15A5EEFF14A3ECFF13A1E9FF119DE4FF0F98 + DDFF0E92D6FF379AC8FF738081FF515252FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF1211116A00000040000000230000000B1211 + 1101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000300000014464444E1494747FF494747FF494747FF494747FF494747FF4A48 + 48FF575A5AFF819393FF46A4CEFF0C91D5FF0D96DDFF0D9BE4FF0F9FE8FF0FA1 + ECFF0FA2EDFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF10A4EFFF10A4 + EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF109DE5FF222F36FF3231 + 31FF403F3FFF484646FF4A4848FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 + 48FF34667FFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4 + EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF12A4 + EFFF12A4EFFF12A4EFFF1A94D3FF484646FF4C4A4AFF4C4A4AFF4C4A4AFF4C4A + 4AFF4C4A4AFF4C4A4AFF484747FF3E3D3DFF2F2E2EFF252424FF242323FF2928 + 28FF302E2EFF363535FF3D3B3BFF3E3C3CFF363535FF273841FF14A5EFFF14A5 + EFFF14A5EFFF14A5EFFF13A5EFFF13A4EEFF12A3EDFF12A1EAFF109EE6FF0F9A + E0FF0E94D9FF0E8FD0FF7499A3FF5C6161FF4A4949FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF2E2D2DB20000004900000030000000140000 + 0004000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00061C1B1B44494747FF494747FF494747FF494747FF494747FF494747FF4C4B + 4BFF636B6BFF8AADB4FF1692D0FF0D93D8FF0D98E0FF0D9DE6FF0E9FEAFF0EA1 + EDFF0FA2EEFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 + EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF156D99FF2827 + 27FF393737FF444242FF494747FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 + 48FF484646FF1C8DC6FF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4 + EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4 + EFFF10A4EFFF11A4EFFF2C6E90FF494747FF4B4949FF4B4949FF4B4949FF4B49 + 49FF4B4949FF4A4848FF444242FF363434FF224558FF185A7BFF1A252AFF1D1D + 1DFF212020FF252525FF2B2A2AFF2D2B2BFF282828FF1A678EFF12A4EFFF12A4 + EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF11A3EDFF10A1EBFF109FE8FF0E9B + E3FF0E96DCFF0C91D4FF4D9DBFFF6A7474FF4E4E4EFF494747FF494747FF4947 + 47FF494747FF494747FF494747FF474545F4050505550000003C0000001F0000 + 0009000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000A302F2F91494747FF494747FF494747FF494747FF494747FF494747FF5152 + 52FF738080FF69ADC7FF0C90D3FF0D95DBFF0D9AE3FF0E9EE8FF0EA0EBFF0EA2 + EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0FA3EFFF0FA3EFFF0FA0EBFF1E35 + 40FF2F2E2EFF3F3D3DFF474545FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 + 48FF494747FF3B5767FF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 + EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 + EFFF10A4EFFF11A0E9FF404A50FF494747FF4A4848FF4A4848FF4A4848FF4A48 + 48FF4A4848FF474646FF3F3D3DFF2F2E2EFF167BAFFF10A4EFFF109FE8FF1374 + A4FF17394AFF1B1A1AFF1D1D1DFF1F1E1EFF1E2123FF1299DEFF11A4EFFF11A4 + EFFF11A4EFFF11A4EFFF10A4EFFF10A4EFFF10A3EEFF0FA2EDFF0F9FE9FF0E9C + E6FF0D98DFFF0C93D7FF2195CEFF788C8EFF545656FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF24232399000000460000002B0000 + 0011000000030000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000010000 + 000E454343CE494747FF494747FF494747FF494747FF494747FF4A4848FF585C + 5CFF85999AFF3BA1D0FF0C92D6FF0D97DEFF0D9CE5FF0E9FE9FF0EA1ECFF0EA2 + EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF127A + B0FF262424FF363434FF434141FF484646FF494747FF494747FF494747FF4947 + 47FF494747FF484646FF237FAEFF0EA3EFFF0EA3EFFF0FA3EFFF0FA3EFFF0FA3 + EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 + EFFF0FA3EFFF2080B2FF474545FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 + 48FF494747FF454343FF393737FF26333AFF0FA1EBFF0FA3EFFF0FA3EFFF0FA3 + EFFF0FA3EFFF118BC9FF155272FF182025FF154761FF10A4EFFF10A4EFFF10A4 + EFFF10A4EFFF10A4EFFF10A4EFFF0FA3EFFF0FA3EEFF0FA2EDFF0EA0EBFF0E9E + E7FF0D99E1FF0D95DAFF0C8FD1FF709DABFF5E6363FF4B4949FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF424141E20000004E000000370000 + 001B000000070000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000030E0D + 0D21494747FF494747FF494747FF494747FF494747FF494747FF4C4A4AFF636A + 6AFF8DAFB4FF1592D0FF0D94D8FF0D99E0FF0D9DE6FF0EA0EAFF0EA2EDFF0EA2 + EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF1B4053FF2D2C2CFF3C3A3AFF454343FF484646FF494747FF494747FF4947 + 47FF494747FF484646FF404D54FF109EE6FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0FA3EFFF345D72FF494747FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 + 48FF484646FF413F3FFF323030FF1A5D7FFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 + EFFF0FA3EFFF0FA3EFFF0FA3EFFF0F9EE8FF0F96DAFF0FA3EFFF0FA3EFFF0FA3 + EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0EA2EEFF0EA1ECFF0E9F + E8FF0D9BE4FF0D96DCFF0C91D4FF4E9DBFFF6A7474FF4D4D4DFF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF1A19197E000000430000 + 00270000000E1211110200000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000042120 + 205A494747FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF6F7B + 7BFF72B0C4FF0C8FD2FF0D95DBFF0D9AE3FF0E9EE8FF0EA0EBFF0EA2EEFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF1089C7FF242323FF343333FF413F3FFF474545FF494747FF494747FF4947 + 47FF494747FF494747FF484646FF297298FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF1496D8FF444242FF484646FF494747FF494747FF494747FF494747FF4947 + 47FF454343FF3B3939FF2A2828FF118ECEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 + EFFF0FA3EFFF0FA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1EDFF0E9F + E9FF0D9CE6FF0D98DFFF0C92D7FF2897CDFF778788FF525353FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF383636C70000004C0000 + 0033000000170000000500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000072F2E + 2E8E494747FF494747FF494747FF494747FF494747FF494747FF545656FF7D8E + 8EFF4FA8CEFF0C91D5FF0D97DDFF0D9BE4FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF19506CFF2B2A2AFF3B3939FF454343FF484646FF494747FF4947 + 47FF494747FF494747FF494747FF444749FF1398DCFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF286F94FF474545FF494747FF494747FF494747FF494747FF494747FF4846 + 46FF424040FF343333FF1F3F50FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0EA0 + EBFF0D9DE7FF0D99E1FF0D94D9FF0F8FD0FF78989FFF595C5CFF494848FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF484646FC0E0E0E650000 + 003F000000220000000B12111101000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000094442 + 42BA494747FF494747FF494747FF494747FF494747FF4A4848FF5B5F5FFF8BA1 + A2FF2D9CD0FF0C92D7FF0D98DFFF0D9CE6FF0E9FEAFF0EA1EDFF0EA2EEFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0F94D7FF222628FF323131FF403E3EFF474545FF494747FF4947 + 47FF494747FF494747FF494747FF484646FF316580FF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 + ECFF3D4C54FF484646FF494747FF494747FF494747FF494747FF494747FF4644 + 44FF3D3C3CFF2E2D2DFF16709EFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0 + EBFF0E9EE8FF0D9AE3FF0D95DBFF0C90D3FF679EB2FF616767FF4B4949FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF2D2B2BAF0000 + 00490000002F0000001300000004000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000B4745 + 45E2494747FF494747FF494747FF494747FF494747FF4B4A4AFF626969FF8FAF + B3FF1491D0FF0D94D9FF0D99E0FF0D9DE7FF0EA0EBFF0EA2EDFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF165E83FF292828FF393838FF444242FF484646FF4947 + 47FF494747FF494747FF494747FF494747FF474545FF198DC9FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1C86 + BDFF454343FF494747FF494747FF494747FF494747FF494747FF484646FF4442 + 42FF383737FF262C30FF0E9CE5FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 + ECFF0E9FE9FF0D9BE4FF0D96DCFF0C91D5FF4E9DBFFF697272FF4C4C4CFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF464444F20505 + 05550000003B0000001E00000009000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F010E0D0D184947 + 47FF494747FF494747FF494747FF494747FF494747FF4C4C4CFF697272FF85B3 + BEFF0C8ED1FF0D95DAFF0D9AE2FF0E9EE7FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0E9AE1FF202B31FF302F2FFF3F3D3DFF474545FF4947 + 47FF494747FF494747FF494747FF494747FF484646FF395869FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF3160 + 79FF474545FF494747FF494747FF494747FF494747FF494747FF474545FF403F + 3FFF323131FF1B536FFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 + EDFF0E9FE9FF0D9CE5FF0D97DEFF0C92D6FF3B9BC8FF717E7EFF4F4F4FFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2322 + 2297000000460000002A00000010000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F011F1E1E374947 + 47FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF707D7DFF71B0 + C6FF0C90D3FF0D95DBFF0D9AE3FF0E9EE8FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF146A96FF282626FF383636FF434242FF4846 + 46FF494747FF494747FF494747FF494747FF494747FF474545FF2180B0FF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF119AE1FF4245 + 47FF484646FF494747FF494747FF494747FF494747FF494747FF464444FF3C3A + 3AFF2B2A2AFF1284BEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EDFF0E9FEAFF0D9DE6FF0D98DFFF0D93D7FF2898CEFF78898AFF525353FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF413F + 3FDD0000004E000000370000001A000000070000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F01222121514947 + 47FF494747FF494747FF494747FF494747FF494747FF515252FF788686FF5FAD + CCFF0C90D4FF0D97DDFF0D9BE4FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA0EBFF1E323DFF2F2E2EFF3E3C3CFF4644 + 44FF494747FF494747FF494747FF494747FF494747FF484646FF404E56FF0F9F + E9FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF2378A4FF4644 + 44FF494747FF494747FF494747FF494747FF494747FF484646FF434141FF3634 + 34FF223844FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EDFF0EA0EBFF0D9DE7FF0D99E0FF0D94D9FF1792CFFF7B9295FF555858FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF1817177800000043000000260000000D1211110100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F01232222674947 + 47FF494747FF494747FF494747FF494747FF494747FF545656FF7E8F8FFF4FA9 + CFFF0C91D6FF0D97DEFF0D9CE4FF0E9FE9FF0EA1EDFF0EA2EEFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1278ADFF262525FF363434FF4240 + 40FF484646FF494747FF494747FF494747FF494747FF494747FF484646FF2874 + 9BFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF375463FF4846 + 46FF494747FF494747FF494747FF494747FF494747FF474545FF3E3D3DFF2F2E + 2EFF17668EFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EEFF0EA0EBFF0D9EE7FF0D9AE1FF0D94DAFF0E8FD0FF7A99A0FF585C5CFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF373636C40000004C00000033000000170000000500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F012423237E4947 + 47FF494747FF494747FF494747FF494747FF494747FF565959FF849696FF43A5 + D1FF0C92D6FF0D97DEFF0D9CE5FF0E9FEAFF0EA1EDFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1B4053FF2D2C2CFF3C3B + 3BFF464444FF484646FF494747FF494747FF494747FF494747FF494747FF4349 + 4CFF1399DEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1592D2FF444242FF4846 + 46FF494747FF494747FF494747FF494747FF484646FF444343FF393838FF2829 + 2AFF0F96DBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EEFF0EA0EBFF0E9EE8FF0D9AE2FF0D95DAFF0C8ED1FF769DA8FF5C6060FF4A48 + 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF484646FC0B0B0B620000003F000000220000000B12111101000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F01242323854947 + 47FF494747FF494747FF494747FF494747FF494747FF585B5BFF889C9CFF38A0 + D0FF0C92D7FF0D98DFFF0D9CE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1187C3FF242323FF3433 + 33FF413F3FFF484646FF494747FF494747FF494747FF494747FF494747FF4846 + 46FF306783FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF276E93FF464444FF4947 + 47FF494747FF494747FF494747FF494747FF484646FF413F3FFF333232FF1E49 + 5FFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EEFF0EA1ECFF0E9EE8FF0D9AE2FF0D95DBFF0C8FD2FF6F9EADFF5E6363FF4A48 + 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF2C2B2BAC000000480000002E0000001300000003000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F01242323854947 + 47FF494747FF494747FF494747FF494747FF494747FF5A5D5DFF8BA0A0FF329E + D1FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF194E69FF2B2A + 2AFF3B3939FF454343FF484646FF494747FF494747FF494747FF494747FF4947 + 47FF474545FF188FCBFF0EA3EFFF0EA3EFFF0EA3EFFF3A4D58FF484646FF4947 + 47FF494747FF494747FF494747FF494747FF464444FF3D3B3BFF2D2B2BFF137A + AEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6B9FB1FF5F6565FF4A49 + 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF464444EF050505550000003A0000001D00000008000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F01242323844947 + 47FF494747FF494747FF494747FF494747FF4A4848FF5A5E5EFF8CA2A2FF309D + D0FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0F92D4FF2226 + 28FF323131FF403F3FFF474545FF494747FF494747FF494747FF494747FF4947 + 47FF484646FF385A6BFF0EA3EFFF0EA3EFFF1594D6FF444242FF484646FF4947 + 47FF494747FF494747FF494747FF484646FF444242FF373535FF243138FF0EA1 + EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6B9FB2FF606767FF4A49 + 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF1F1E1E91000000450000002A00000010000000020000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F01242323844947 + 47FF494747FF494747FF494747FF494747FF4A4848FF5A5E5EFF8CA1A1FF319D + D0FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF165C + 7FFF2A2828FF393838FF444242FF484646FF494747FF494747FF494747FF4947 + 47FF494747FF474545FF2182B3FF0EA3EFFF2677A0FF464444FF494747FF4947 + 47FF494747FF494747FF494747FF474545FF403E3EFF312F2FFF195C7EFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6B9FB2FF606767FF4A49 + 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF403E3EDA0000004E000000360000001A000000070000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F01242323844947 + 47FF494747FF494747FF494747FF494747FF494747FF5A5D5DFF8B9F9FFF349F + D1FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0E9A + E1FF20292DFF312F2FFF3F3D3DFF474545FF494747FF494747FF494747FF4947 + 47FF494747FF484646FF40535DFF0FA0E9FF395D6FFF484646FF494747FF4947 + 47FF494747FF494747FF494747FF454343FF3B3939FF2A2828FF108ECEFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6E9FB0FF5F6565FF4A49 + 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF1616167600000042000000260000000D1211 + 1101000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F01242323834947 + 47FF494747FF494747FF494747FF494747FF494747FF585B5BFF879B9BFF3EA3 + D1FF0C92D6FF0D98DFFF0D9CE5FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF156893FF282626FF383636FF434242FF484646FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF2C7398FF484849FF494747FF494747FF4947 + 47FF494747FF494747FF484646FF424040FF343333FF1F3F50FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EEFF0EA1ECFF0E9EE8FF0D9AE2FF0D95DBFF0C8ED1FF739FACFF5D6363FF4A48 + 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF353333C20000004B00000032000000160000 + 0005000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000002423237B4947 + 47FF494747FF494747FF494747FF494747FF494747FF565858FF839595FF49A7 + D0FF0C92D6FF0D97DEFF0D9CE5FF0E9FE9FF0EA1EDFF0EA2EEFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA0EBFF1E323DFF2F2E2EFF3E3C3CFF464444FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF464444FF3D3C3CFF2E2D2DFF16709EFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EEFF0EA0EBFF0E9EE7FF0D9AE1FF0D95DAFF0D8ED1FF7A9EA6FF5B6060FF4A48 + 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF484646FA0B0B0B620000003E000000210000 + 000A121111010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000242323644947 + 47FF494747FF494747FF494747FF494747FF494747FF535555FF7D8E8EFF57AC + CFFF0C91D5FF0D97DDFF0D9CE4FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF1577AAFF2B2A2AFF3D3C3CFF4C4A4AFF525050FF545252FF5553 + 53FF565454FF565454FF575555FF565454FF555454FF555353FF545252FF5250 + 50FF514F4FFF4D4C4CFF474545FF393737FF262C30FF0E9CE5FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EDFF0EA0EBFF0D9EE7FF0D99E1FF0D94D9FF1291D0FF7D999EFF585C5CFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF2A2929A7000000480000002E0000 + 0012000000030000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000002322224C4947 + 47FF494747FF494747FF494747FF494747FF494747FF515252FF778585FF69B0 + CBFF0C90D4FF0D96DCFF0D9BE3FF0E9EE8FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0FA3EFFF15A5EFFF1CA8 + F0FF20AAF0FF23ABF0FF304F5FFF403F3FFF4E4C4CFF575555FF595757FF5957 + 57FF595757FF595757FF595757FF595757FF595757FF595757FF595757FF5957 + 57FF595757FF585656FF525050FF434242FF2B5E79FF18A6EFFF12A4EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 + EDFF0EA0EAFF0D9DE6FF0D98E0FF0D93D8FF1F95CFFF7D9293FF555757FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF464444EF030303520000003A0000 + 001D000000080000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000222121334947 + 47FF494747FF494747FF494747FF494747FF494747FF4F4E4EFF6F7B7BFF7DB5 + C5FF0C8FD2FF0D95DBFF0D9AE2FF0E9EE8FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF15A5EFFF1FA9F0FF26ACF0FF28ACF1FF28AC + F1FF28ACF1FF28ACF1FF2A92C7FF3C3B3BFF4A4949FF565454FF5C5A5AFF5D5B + 5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B + 5BFF5D5B5BFF5A5858FF514F4FFF424141FF2B91C5FF28ACF1FF28ACF1FF23AB + F0FF1AA7EFFF11A4EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 + EDFF0E9FEAFF0D9CE6FF0D98DFFF0C92D7FF339BCDFF778787FF515353FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF1E1D1D8C000000450000 + 00290000000F0000000200000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001010100F4947 + 47FF494747FF494747FF494747FF494747FF494747FF4C4B4BFF677171FF8EB6 + BEFF0E8FD1FF0D94DAFF0D99E1FF0D9EE7FF0EA0EBFF0EA2EDFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0FA3EFFF1AA7EFFF27ACF0FF2CAEF1FF2CAEF1FF2CAEF1FF2CAEF1FF2CAE + F1FF2CAEF1FF2CAEF1FF2CAEF1FF366279FF464545FF545252FF5C5B5BFF5F5D + 5DFF605E5EFF605E5EFF605E5EFF605E5EFF605E5EFF605E5EFF605E5EFF605E + 5EFF5F5D5DFF5A5959FF4F4E4EFF3E515BFF2CAEF1FF2CAEF1FF2CAEF1FF2CAE + F1FF2CAEF1FF2AAEF1FF21AAF0FF14A5EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 + ECFF0E9FE9FF0D9CE5FF0D97DDFF0C91D6FF459FC6FF707C7CFF4F4F4FFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF3F3D3DD70000004D0000 + 0036000000190000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000014846 + 46E8494747FF494747FF494747FF494747FF494747FF4B4949FF606767FF93AF + B1FF1F95D0FF0D93D8FF0D98E0FF0D9DE6FF0EA0EAFF0EA2EDFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF19A7 + EFFF2AADF0FF30B0F1FF30B0F1FF30B0F1FF30B0F1FF30B0F1FF30B0F1FF30B0 + F1FF30B0F1FF30B0F1FF30B0F1FF319FD7FF414547FF4F4E4EFF5B5A5AFF615F + 5FFF626161FF626161FF626161FF626161FF626161FF626161FF626161FF6261 + 61FF615F5FFF5A5858FF4D4B4BFF387B9EFF30B0F1FF30B0F1FF30B0F1FF30B0 + F1FF30B0F1FF30B0F1FF30B0F1FF2EAFF1FF23AAF0FF12A4EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 + ECFF0E9EE8FF0D9BE3FF0D96DCFF0C90D4FF5DA1BCFF677070FF4C4B4BFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF141414720000 + 0041000000250000000D12111101000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004745 + 45B9494747FF494747FF494747FF494747FF494747FF494848FF595D5DFF899E + 9EFF3EA3D0FF0C92D6FF0D97DEFF0D9CE5FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF13A5EFFF29ADF1FF35B1 + F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1 + F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF3C7491FF4C4B4BFF595858FF6261 + 61FF666464FF666464FF666464FF666464FF666464FF666464FF666464FF6664 + 64FF626161FF595858FF4B4C4CFF36A7E1FF35B1F2FF35B1F2FF35B1F2FF35B1 + F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF31B0F1FF1DA9F0FF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0EA0 + EBFF0D9EE7FF0D9AE2FF0D95DAFF0C8FD1FF75A1AEFF5F6565FF4A4949FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF343232BD0000 + 004B000000320000001600000005000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000003534 + 348D494747FF494747FF494747FF494747FF494747FF494747FF535555FF7B8B + 8BFF63B0CDFF0C90D4FF0D96DCFF0D9BE3FF0E9EE8FF0EA1ECFF0EA2EEFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1BA8F0FF35B2F1FF39B3F2FF39B3 + F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3 + F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39ACE7FF484F53FF565555FF6261 + 61FF686666FF696868FF696868FF696868FF696868FF696868FF696868FF6967 + 67FF636161FF585656FF46697BFF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3 + F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF29AD + F1FF11A4EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0 + EAFF0D9DE6FF0D98E0FF0D93D8FF1A93CFFF7F9799FF585B5BFF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF484646FA0A0A + 0A5F0000003D000000210000000A000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000002322 + 2252494747FF494747FF494747FF494747FF494747FF494747FF4E4E4EFF6D78 + 78FF88B8C3FF0C8FD1FF0D95DAFF0D99E1FF0D9EE7FF0EA0EBFF0EA2EDFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF22ABF0FF3CB4F2FF3DB5F2FF3DB5F2FF3DB5 + F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5 + F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF4485A6FF565555FF6462 + 62FF6B6969FF6D6B6BFF6D6B6BFF6D6B6BFF6D6B6BFF6D6B6BFF6D6B6BFF6B69 + 69FF636262FF565555FF4294BEFF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5 + F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5 + F2FF33B1F1FF13A5EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9F + E9FF0D9CE5FF0D97DEFF0C92D6FF3D9ECAFF768484FF515252FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2827 + 27A4000000470000002D00000012000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001111 + 1111494747FF494747FF494747FF494747FF494747FF494747FF4B4A4AFF6167 + 67FF92AEB0FF2799D0FF0C93D7FF0D98DFFF0D9CE6FF0E9FEAFF0EA1EDFF0EA2 + EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF25ACF0FF41B6F2FF42B7F2FF42B7F2FF42B7F2FF42B7 + F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7 + F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF43B3EDFF58676FFF6866 + 66FF6E6D6DFF716F6FFF716F6FFF716F6FFF716F6FFF716F6FFF706E6EFF6C6B + 6BFF636161FF545E64FF42B5F0FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7 + F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7 + F2FF42B7F2FF39B3F2FF13A5EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0EA0EBFF0E9E + E8FF0D9AE3FF0D95DBFF0C90D3FF65A4BCFF687070FF4D4C4CFF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4543 + 43EC03030352000000390000001C000000080000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000484646D0494747FF494747FF494747FF494747FF494747FF494848FF575A + 5AFF829595FF54ABD0FF0C91D4FF0D96DCFF0D9BE4FF0E9FE8FF0EA1ECFF0EA2 + EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF22AAF0FF45B8F2FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 + F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 + F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF519BC1FF6D6C + 6CFF737272FF747373FF747373FF747373FF747373FF747373FF737171FF6D6C + 6CFF616161FF50839DFF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 + F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 + F3FF47B8F3FF47B8F3FF39B3F1FF11A4EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EAFF0D9D + E6FF0D99E0FF0D94D9FF1291D0FF7E9EA5FF5C6161FF4A4949FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF1D1C1C8900000044000000290000000F0000000200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000036343488494747FF494747FF494747FF494747FF494747FF494747FF5050 + 50FF707C7CFF82B7C5FF0C8FD1FF0D95DAFF0D99E1FF0D9DE7FF0EA0EAFF0EA2 + EDFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF17A6EFFF47B8F2FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA + F3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA + F3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF50B2E4FF7472 + 72FF777676FF787676FF787676FF787676FF787676FF787676FF757474FF6E6C + 6CFF616060FF4EA9D8FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA + F3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA + F3FF4CBAF3FF4CBAF3FF4CBAF3FF31B0F1FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9FE9FF0D9C + E5FF0D97DEFF0C92D6FF379DCCFF798889FF535555FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF3D3C3CD20000004D00000035000000190000000600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00002322223D494747FF494747FF494747FF494747FF494747FF494747FF4C4A + 4AFF616767FF92ADAEFF2D9CD0FF0C92D7FF0D97DEFF0D9CE5FF0E9FE9FF0EA1 + ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF3DB5F2FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC + F3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC + F3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF619CBBFF7978 + 78FF7C7B7BFF7C7B7BFF7C7B7BFF7C7B7BFF7C7B7BFF7B7A7AFF777676FF6D6C + 6CFF5E7581FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC + F3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC + F3FF51BCF3FF51BCF3FF51BCF3FF50BCF3FF1DA9F0FF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EBFF0D9EE7FF0D9A + E2FF0D95DBFF0C8FD2FF6AA5BAFF677171FF4D4D4DFF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF1413137000000041000000240000000C00000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000484646E3494747FF494747FF494747FF494747FF494747FF4948 + 48FF555858FF7D8D8DFF68B2CDFF0C90D3FF0D95DBFF0D9AE2FF0E9EE8FF0EA0 + EBFF0EA2EDFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF20AA + F0FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE + F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE + F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF728995FF7F7D + 7DFF807E7EFF807E7EFF807E7EFF807E7EFF807E7EFF7E7D7DFF787777FF6D6C + 6CFF5C9AB9FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE + F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE + F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF45B7F2FF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9FE9FF0D9CE6FF0D98 + DFFF0C93D7FF1F95CFFF80999CFF595D5DFF4A4848FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF333131BA0000004A000000310000001500000004000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003635358C494747FF494747FF494747FF494747FF494747FF4947 + 47FF4E4E4EFF687171FF93B6BBFF1B94D0FF0C93D8FF0D98DFFF0D9CE6FF0E9F + E9FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF44B8 + F2FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 + F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 + F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5FB8E7FF807F7FFF8382 + 82FF848282FF848282FF848282FF848282FF838282FF807F7FFF787878FF6C6F + 71FF5CBCEDFF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 + F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 + F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5BC0F4FF1EA9F0FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EBFF0E9EE8FF0D9AE3FF0D96 + DCFF0C90D3FF57A4C3FF707C7CFF505151FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF484646FA0909095C0000003D000000200000000A000000000000 + 0000000000000000000000000001000000000000000000000000000000000000 + 00000000000023222228494747FF494747FF494747FF494747FF494747FF4947 + 47FF4A4848FF595C5CFF839696FF5BAECFFF0C90D4FF0D96DCFF0D9AE3FF0E9E + E8FF0EA0EBFF0EA2EDFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF14A5EFFF5DC1 + F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 + F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 + F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF6FA8C5FF868484FF8887 + 87FF888787FF888787FF888787FF888787FF878686FF828181FF797878FF6A8E + A1FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 + F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 + F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF3AB3F2FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9FE9FF0D9CE6FF0D98DFFF0C93 + D8FF1893D0FF809FA6FF5E6363FF4B4A4AFF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF272626A1000000470000002C00000012000000030000 + 0000000000000000000000000002000000000000000000000000000000000000 + 00000000000000000000484646C0494747FF494747FF494747FF494747FF4947 + 47FF494747FF4F4F4FFF6B7676FF90B8BEFF1692D0FF0C93D8FF0D98DFFF0D9C + E5FF0E9FE9FF0EA1ECFF0EA2EEFF0EA2EEFF0EA3EFFF0EA3EFFF25ACF0FF66C4 + F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 + F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 + F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF7F98A5FF8B8A8AFF8C8A + 8AFF8C8A8AFF8C8A8AFF8C8A8AFF8C8A8AFF8A8888FF838282FF797878FF69AF + D3FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 + F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 + F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF52BCF3FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EBFF0D9EE7FF0D9AE2FF0D96DBFF0C90 + D3FF50A2C5FF738080FF525353FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF444242E70000004F000000390000001C000000070000 + 0000000000000000000000000003000000000000000000000000000000000000 + 0000000000000000000024232350494747FF494747FF494747FF494747FF4947 + 47FF494747FF4B4949FF595D5DFF849797FF60B0CFFF0C90D3FF0D95DBFF0D9A + E2FF0D9DE7FF0EA0EAFF0EA1EDFF0EA2EEFF0EA3EFFF0EA3EFFF34B1F1FF6CC6 + F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 + F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 + F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6EC2EDFF8E8F8FFF8F8E8EFF908F + 8FFF908F8FFF908F8FFF908F8FFF8F8E8EFF8C8B8BFF848383FF78848BFF6CC6 + F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 + F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 + F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF63C3F4FF0EA3EFFF0EA3 + EFFF0EA2EEFF0EA2EDFF0EA1ECFF0E9FE9FF0D9CE5FF0D98DFFF0C93D7FF1A94 + CFFF82A0A5FF5F6464FF4C4B4BFF494747FF494747FF494747FF4A4848FF4B49 + 49FF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A + 4AFF4B4A4AFF4B4A4AFF4B4A4AFF4A4949FF4A4848FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF1C1B1B8600000044000000280000000E0000 + 0002000000000000000000000002000000000000000000000000000000000000 + 0000000000000000000011101004484646DB494747FF494747FF494747FF4947 + 47FF494747FF494747FF4F4F4FFF697272FF92B5B9FF2297D0FF0C92D6FF0D97 + DEFF0D9BE4FF0E9FE8FF0EA0EBFF0EA2EDFF0EA2EEFF0EA3EFFF3EB5F2FF71C9 + F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9 + F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF78B7D7FF7DB3CFFF7EB5D1FF7EB5 + D1FF7EB5D1FF7EB5D1FF7EB5D1FF7EB5D1FF85AABDFF949393FF949393FF9493 + 93FF949393FF949393FF949393FF939292FF8E8D8DFF858484FF77A5BDFF71C9 + F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9 + F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9 + F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF70C9F5FF0EA3EFFF0EA3 + EFFF0EA2EEFF0EA1EDFF0E9FEAFF0D9DE7FF0D99E1FF0D95DAFF0C8FD2FF5FA6 + C2FF717C7CFF515252FF494747FF494747FF4A4848FF4E4D4DFF545656FF5A5D + 5DFF5C6161FF5C6161FF5C6161FF5C6161FF5C6161FF5C6161FF5C6161FF5C61 + 61FF5C6161FF5C6161FF5B6060FF585C5CFF525353FF4C4B4BFF494747FF4947 + 47FF494747FF494747FF494747FF3D3B3BCF0000004D00000035000000180000 + 0005000000000000000000000002000000000000000000000000000000000000 + 000000000000000000000000000047454560494747FF494747FF494747FF4947 + 47FF494747FF494747FF4A4848FF575A5AFF7D8D8DFF75B6CCFF0C8FD1FF0D94 + D9FF0D99E0FF0D9CE6FF0E9FE9FF0EA1ECFF0EA2EDFF0EA2EEFF3EB5F2FF77CB + F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CB + F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF889CA7FF949393FF989797FF9997 + 97FF999797FF999797FF999797FF999797FF999797FF999797FF999797FF9997 + 97FF999797FF999797FF989797FF969595FF908F8FFF868787FF78C3E9FF77CB + F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CB + F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CB + F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF73C9F5FF0EA3EFFF0EA2 + EEFF0EA1EDFF0EA0EBFF0E9EE8FF0D9BE3FF0D96DDFF0C91D6FF2C9ACDFF8098 + 9AFF5B6060FF4B4A4AFF494747FF494747FF4C4B4BFF50626AFF6699AFFF75A4 + B8FF79A8BBFF79A9BCFF79A9BCFF79A9BCFF79A9BCFF79A9BCFF79A9BCFF79A9 + BCFF79A9BCFF79A9BCFF78A7BAFF759EAFFF6A6F6FFF515252FF4A4848FF4947 + 47FF494747FF494747FF494747FF494747FF1312126D00000040000000240000 + 000C000000010000000000000002000000000000000000000000000000000000 + 000000000000000000000000000048464604494747DB494747FF494747FF4947 + 47FF494747FF494747FF494747FF4D4C4CFF626969FF90A8A9FF46A6D0FF0C90 + D4FF0D96DBFF0D9AE2FF0D9EE7FF0EA0EAFF0EA1EDFF0EA2EEFF34B1F1FF7DCD + F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCD + F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF8DA0AAFF999898FF9C9B9BFF9D9C + 9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C + 9CFF9D9C9CFF9D9C9CFF9C9B9BFF999898FF919090FF859DA9FF7DCDF6FF7DCD + F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCD + F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCD + F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF6BC7F5FF0EA2EEFF0EA2 + EDFF0EA1ECFF0E9FE9FF0D9CE5FF0D98DFFF0C93D8FF1391D1FF79A8B5FF6871 + 71FF4F4F4FFF494747FF494747FF494747FF4D4D4DFF537684FF70CCF6FF80D1 + F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1 + F7FF80D1F7FF80D1F7FF80D1F7FF83CAEBFF7D8383FF565858FF4A4848FF4947 + 47FF494747FF494747FF494747FF494747FF302E2EB70000004A000000300000 + 0014000000040000000000000002000000000000000000000000000000000000 + 00000000000000000000000000000000000048464660494747FF494747FF4947 + 47FF494747FF494747FF494747FF4A4848FF525353FF6F7B7BFF90B8BFFF1C94 + CFFF0C92D7FF0D97DDFF0D9BE3FF0E9EE8FF0EA0EBFF0EA1EDFF22AAEFFF82CF + F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CF + F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF92A4AEFF9D9C9CFFA1A0A0FFA1A0 + A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0 + A0FFA1A0A0FFA1A0A0FFA09F9FFF9B9A9AFF929191FF86B9D3FF82CFF7FF82CF + F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CF + F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CF + F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF5DC0F4FF0EA2EDFF0EA1 + ECFF0E9FE9FF0D9DE6FF0D99E1FF0D95DAFF0C8FD3FF54A4C6FF778686FF5558 + 58FF4A4848FF494747FF494747FF494747FF4D4D4DFF557785FF73CDF6FF80D1 + F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1 + F7FF80D1F7FF80D1F7FF80D1F7FF82C9EBFF7B8181FF555757FF4A4848FF4947 + 47FF494747FF494747FF494747FF494747FF474545F70909095B0000003C0000 + 001F000000090000000000000001000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000484646CB494747FF4947 + 47FF494747FF494747FF494747FF494747FF4B4A4AFF595C5CFF7E8F8FFF7AB8 + CBFF0E8FD1FF0D94D8FF0D98DFFF0D9CE5FF0E9FE8FF0EA0EBFF0FA2EDFF74C9 + F5FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1 + F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF96A8B1FFA1A0A0FFA4A3A3FFA5A4 + A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4 + A4FFA5A4A4FFA4A3A3FFA2A1A1FF9C9B9BFF93989BFF88D0F5FF88D1F7FF88D1 + F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1 + F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1 + F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF38B2F0FF0EA1ECFF0E9F + EAFF0D9DE7FF0D9AE2FF0D96DBFF0C91D5FF339BCDFF829A9CFF5D6262FF4C4B + 4BFF494747FF494747FF494747FF494747FF4C4B4BFF566469FF65BEE6FF80D1 + F7FF80D1F7FF80D1F7FF8EB8CAFF8AA7ACFF7C969CFF738B91FF71888EFF7188 + 8EFF71888EFF71888EFF70878DFF6B7E84FF5F6363FF4F5050FF494848FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF2423239C000000460000 + 002B000000100000000300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000083A2A238494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4D4D4DFF606767FF8BA1 + A1FF5CAECFFF0C8FD2FF0D94D9FF0D99E0FF0D9CE5FF0E9FE9FF0EA0EBFF4BB9 + F1FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3 + F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF9BACB5FFA5A4A4FFA8A7A7FFA8A7 + A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7 + A7FFA8A7A7FFA8A7A7FFA4A3A3FF9D9D9DFF92B2C2FF8DD3F7FF8DD3F7FF8DD3 + F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3 + F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3 + F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF82CFF6FF16A4EDFF0EA0EAFF0D9E + E7FF0D9BE3FF0D97DDFF0C92D6FF1E95CFFF81A6ADFF666E6EFF4F4F4FFF4947 + 47FF494747FF494747FF494747FF494747FF4A4848FF525353FF5D7B86FF71CB + F4FF80D1F7FF80D1F7FF81CEF2FF91A7AEFF717E7EFF5E6464FF565959FF5557 + 57FF555757FF555757FF545757FF525454FF4E4F4FFF4B4949FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF434141E50000004E0000 + 0036000000190000000600000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000004947479B4947 + 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF505151FF6770 + 70FF92ADAFFF44A5D0FF0C90D4FF0D95DAFF0D99E1FF0D9CE6FF0E9FE9FF19A5 + ECFF86D0F6FF92D5F7FF92D5F7FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5 + F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF9FAEB7FFA7A6A6FFA9A8A8FFA9A8 + A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8 + A8FFA9A8A8FFA8A7A7FFA4A4A4FF9F9E9EFF94CBE7FF92D5F8FF92D5F8FF92D5 + F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5 + F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5 + F8FF92D5F8FF92D5F8FF92D5F7FF92D5F7FF50BBF1FF0EA0EAFF0D9EE7FF0D9B + E3FF0D97DEFF0C92D7FF1391D0FF79AAB9FF6E7979FF535454FF4A4848FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4C4A4AFF565959FF5E91 + A5FF79CFF6FF80D1F7FF80D1F7FF84CBEBFF879496FF616767FF505151FF4A49 + 49FF4A4848FF4A4848FF4A4848FF494848FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF1C1B1B820000 + 003F000000220000000A00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000A0D0D0104947 + 47E3494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF5354 + 54FF6E7979FF93B5B9FF319ED0FF0C91D4FF0D95DBFF0D99E1FF0D9CE6FF0E9F + E9FF47B7EFFF98D7F7FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7 + F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FFA0B0B8FFA5A5A5FFA6A6A6FFA6A6 + A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6 + A6FFA6A6A6FFA6A5A5FFA3A3A3FF9EACB3FF98D7F8FF98D7F8FF98D7F8FF98D7 + F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7 + F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7 + F8FF98D7F8FF98D7F8FF98D7F7FF83CFF5FF17A3EAFF0D9EE7FF0D9BE3FF0D97 + DEFF0C93D8FF0E90D1FF6BAAC1FF758383FF565858FF4B4949FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF4D4C4CFF5A5E + 5EFF5FA5C2FF7ED0F7FF80D1F7FF80D1F7FF89C2DCFF7C8686FF5B6060FF4E4D + 4DFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF383737C70000 + 00470000002B0000001000000002000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006674 + 744C494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B49 + 49FF555858FF738080FF91B8BEFF2899CFFF0C91D5FF0D95DBFF0D99E1FF0D9C + E5FF11A0E9FF6FC6F3FF9ED9F7FF9ED9F8FF9ED9F8FF9EDAF8FF9EDAF8FF9EDA + F8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FFA3ABAFFFA4A4A4FFA5A4A4FFA5A4 + A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4 + A4FFA5A4A4FFA4A4A4FFA3A3A3FFA0C3D5FF9EDAF8FF9EDAF8FF9EDAF8FF9EDA + F8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDA + F8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9ED9 + F8FF9ED9F8FF9ED9F8FF97D6F6FF32AEECFF0D9EE7FF0D9BE3FF0D97DEFF0C93 + D8FF0D8FD1FF61A8C4FF7A8A8AFF595D5DFF4C4B4BFF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4F4E + 4EFF5D6668FF65B9DCFF80D1F7FF80D1F7FF80D1F7FF8DB7C9FF737D7DFF575B + 5BFF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF484646F90707 + 0755000000330000001600000004000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000066757597494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4C4B4BFF575B5BFF768484FF93BAC0FF2899CFFF0C91D4FF0D95DAFF0D99 + E0FF0D9CE5FF1BA3E9FF86CFF4FFA3DBF8FFA3DBF8FFA3DBF8FFA3DCF9FFA3DC + F9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA6ADB1FFA7A7A7FFA7A7A7FFA7A7 + A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7 + A7FFA7A7A7FFA7A7A7FFA7A8A9FFA3D9F5FFA3DCF9FFA3DCF9FFA3DCF9FFA3DC + F9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DC + F9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DB + F8FFA3DBF8FFA1DAF7FF4BB7EEFF0D9DE6FF0D9AE2FF0D97DDFF0C93D8FF0E8F + D1FF61A9C5FF7D8D8EFF5B6060FF4C4B4BFF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4A48 + 48FF515252FF5E7379FF6DC5ECFF80D1F7FF80D1F7FF81D0F5FF8EA9B3FF6A74 + 74FF545656FF4B4A4AFF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF1E1D + 1D860000003A0000001B00000006000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000A0D1D108484646CF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4C4B4BFF585B5BFF768484FF92B8BEFF329ED0FF0C90D4FF0D94 + D9FF0D98DFFF0D9BE3FF1EA4E9FF8DD1F4FFA9DDF8FFA9DDF8FFA9DDF9FFA9DE + F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE + F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE + F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE + F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE + F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DDF9FFA9DDF9FFA9DD + F8FFA5DBF7FF54BAEFFF0D9CE6FF0D99E1FF0D96DCFF0C92D7FF0F8FD0FF67AB + C4FF7C8D8EFF5C6161FF4D4C4CFF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4B4A4AFF545656FF5E8492FF75CDF5FF81D1F7FF81D1F7FF83CDF0FF8B9C + A0FF646B6BFF515252FF4A4848FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF3635 + 35BD0000003E0000001F00000008000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000A0D1D124494747EF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF4C4B4BFF575B5BFF738080FF93B5B9FF44A5D0FF0C8F + D2FF0D94D8FF0D97DDFF0D9AE2FF1CA2E7FF81CCF3FFAEDFF8FFAEDFF8FFAEDF + F9FFAEDFF9FFAEE0F9FFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 + FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 + FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 + FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 + FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0F9FFAEDFF9FFAEDFF9FFAEDFF8FFA4DB + F7FF4AB6EDFF0D9BE4FF0D99E0FF0D95DBFF0C91D5FF1993D0FF73ADC0FF7989 + 89FF5B5F5FFF4D4C4CFF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4C4B4BFF575B5BFF5F99AFFF7CD0F6FF81D1F7FF81D1F7FF87C8 + E6FF838F91FF5F6565FF4F4F4FFF4A4848FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4543 + 43E900000041000000220000000A000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000066757544494747FB494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF4C4B4BFF555858FF6E7979FF92ADAFFF5CAE + CFFF0E8FD1FF0C92D7FF0D96DBFF0D99E0FF159EE5FF65C1F0FFAEDFF7FFB3E1 + F9FFB3E1F9FFB3E2F9FFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 + FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 + FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 + FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 + FAFFB3E2FAFFB3E2FAFFB3E2F9FFB3E1F9FFB3E1F9FFB3E1F8FF97D5F5FF30AB + E9FF0D9AE2FF0D97DEFF0D94D9FF0C90D4FF2598CFFF80ACB7FF748181FF585C + 5CFF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF4E4D4DFF5B6060FF61ACCBFF80D0F7FF81D1F7FF81D1 + F7FF8BBFD6FF7A8484FF5A5F5FFF4D4D4DFF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF0A09094D000000230000000A000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000039586867494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4B4949FF535454FF677070FF8BA1 + A1FF7AB8CBFF1B94CFFF0C90D4FF0D94D9FF0D97DEFF0D9AE2FF36ADE9FF96D4 + F4FFB8E3F8FFB8E3F9FFB8E3FAFFB8E3FAFFB8E3FAFFB8E4FAFFB8E4FAFFB8E4 + FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4 + FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4 + FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E3 + FAFFB8E3FAFFB8E3FAFFB8E3F9FFB8E3F9FFAFDFF7FF68C1EFFF18A0E5FF0D99 + E0FF0D96DBFF0C92D7FF0D8FD1FF45A3CCFF85A5AAFF6D7777FF555858FF4C4B + 4BFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF4A4848FF504F4FFF606B6EFF8DCCE8FFA4DEF9FFA2DD + F9FF9DDBF9FF9AB8C4FF707A7AFF565959FF4B4A4AFF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF1616165D000000210000000A000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000003958687F494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF505151FF6067 + 67FF7E8F8FFF90B8BFFF46A6D0FF0C8FD1FF0C92D6FF0D95DBFF0D98DFFF149D + E3FF52B8ECFFA3DAF6FFBEE5F9FFBEE5F9FFBEE5FAFFBEE5FAFFBEE6FAFFBEE6 + FAFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6 + FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6 + FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FAFFBEE6FAFFBEE5 + FAFFBEE5F9FFBEE5F9FFB8E3F8FF80CBF2FF2AA7E7FF0D99E1FF0D96DDFF0D94 + D9FF0C90D4FF1D95D0FF6DADC4FF839798FF656C6CFF525353FF4B4949FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF4A4949FF525353FF677C82FF9CD9F5FFAAE0 + FAFFAAE0FAFFA9DFF9FF96A8AEFF666F6FFF515252FF4A4848FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF1D1C1C6B0000001E00000008000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000003958688F494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4D4D + 4DFF595C5CFF6F7B7BFF8FA8A9FF77B7CCFF2297D0FF0C90D3FF0C93D8FF0D96 + DCFF0D98DFFF159EE3FF4DB6EBFF99D6F5FFC2E7F9FFC3E7FAFFC3E7FAFFC3E7 + FAFFC3E7FAFFC3E7FBFFC3E7FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8 + FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8 + FBFFC3E8FBFFC3E7FBFFC3E7FBFFC3E7FAFFC3E7FAFFC3E7FAFFC3E7FAFFC3E7 + F9FFB4E1F7FF76C7F0FF2CA8E7FF0D99E1FF0D97DEFF0D94DAFF0C91D5FF0E8F + D1FF48A4CDFF88ABB1FF748282FF5C6161FF4F4F4FFF4A4848FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4B4A4AFF555757FF71939FFFA9E0 + FAFFAFE1FAFFAFE1FAFFACD9EFFF848F8FFF5C6060FF4C4C4CFF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF1B1A1A620000001900000005000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000003958688F4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4B4A4AFF525353FF626868FF7C8D8DFF93B5B9FF60B0CFFF1792D0FF0C90 + D4FF0C93D8FF0D95DBFF0D97DEFF0D99E1FF30A9E7FF6DC3EFFFA4DAF6FFC6E8 + F9FFC8E9FAFFC8E9FAFFC8E9FAFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9 + FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9 + FBFFC8E9FBFFC8E9FBFFC8E9FAFFC8E9FAFFC8E9FAFFBAE3F8FF8ED1F3FF4AB4 + EBFF189FE4FF0D98E0FF0D96DDFF0D94D9FF0C91D6FF0C8FD1FF349ECFFF7CAF + BEFF819393FF666E6EFF545656FF4C4B4BFF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4C4C4CFF5A5D5DFF84B2 + C4FFB3E3FAFFB4E3FAFFB4E3FAFFA1B8C1FF687171FF515252FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF1515154A0000001400000004000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000003958 + 687B494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4A4848FF4D4C4CFF575959FF697272FF849797FF90B7BEFF5CAE + CFFF1B94D0FF0C90D3FF0C92D7FF0D95DAFF0D96DCFF0D98DFFF0D99E1FF28A6 + E6FF4EB6EBFF82CCF2FFA3DAF5FFC0E6F8FFCDEBFAFFCDEBFAFFCDEBFAFFCDEB + FBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFAFFCDEB + FAFFCAEAF9FFB2E0F7FF94D3F4FF68C1EFFF3BAEE9FF159EE4FF0D99E0FF0D97 + DEFF0D95DBFF0D93D8FF0C91D5FF0C8FD1FF379FCFFF76AFC2FF879D9EFF6D78 + 78FF595D5DFF4E4E4EFF4A4848FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF4D4D4DFF4F50 + 50FF4F5050FF4D4D4DFF4B4949FF494747FF494747FF4A4848FF4F4F4FFF6472 + 75FFA8DDF5FFB8E5FBFFB8E5FBFFAFD4E4FF7B8484FF565858FF4A4848FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4846 + 46FC0404042B0000000E00000002000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000039586860494747FB494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF4A4848FF4F4F4FFF595D5DFF6B7575FF8396 + 96FF93B6BBFF67B1CDFF2D9CD0FF0C8FD1FF0C91D4FF0C93D7FF0D95DAFF0D96 + DCFF0D97DEFF0D98E0FF0D99E1FF109BE3FF26A5E6FF3BAFE9FF4DB6EBFF5BBB + EDFF66C0EFFF6CC3EFFF6EC4EFFF69C2EFFF61BEEEFF55B9ECFF44B2EAFF31AA + E8FF1AA0E4FF0D9AE2FF0D99E0FF0D98DFFF0D97DDFF0D95DBFF0D94D8FF0C92 + D6FF0C90D3FF1692D0FF47A4CEFF7FB1BFFF869C9DFF6F7A7AFF5C6161FF5051 + 51FF4B4949FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4B4949FF515252FF5D6161FF656D + 6DFF656D6DFF5D6262FF525252FF4B4949FF494747FF494747FF4A4949FF585C + 5CFF93C0D2FFBDE7FBFFBDE7FBFFB7E0F3FF848D8DFF595D5DFF4A4949FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4543 + 43D80000001D0000000800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000039586840494747E7494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF4F4F4FFF595C + 5CFF687171FF7D8D8DFF91ADAEFF83B7C5FF54ABCFFF2799D0FF0C8FD1FF0C90 + D4FF0C92D6FF0D93D8FF0D94DAFF0D95DBFF0D96DCFF0D97DDFF0D97DEFF0D98 + DFFF0D98DFFF0D98DFFF0D98DFFF0D98DFFF0D98DFFF0D97DEFF0D97DEFF0D97 + DDFF0D95DBFF0D95DAFF0D94D9FF0C92D7FF0C91D5FF0C8FD2FF1592D0FF3BA2 + D0FF69ADC7FF8BAEB4FF819393FF6B7676FF5B5F5FFF505151FF4B4A4AFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4C4C4CFF637C87FFAEDCF0FFB8E0 + F2FFB8E0F2FF95A8AFFF5E6464FF4E4E4EFF494747FF494747FF4A4848FF5658 + 58FF8BACB7FFC2E8FBFFC2E8FBFFBCE1F3FF868F8FFF5A5E5EFF4A4949FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF302F + 2F9C000000120000000300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000001B7AAA1C494747C3494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4A48 + 48FF4E4E4EFF555858FF616767FF707C7CFF829595FF92AEAFFF88B7C3FF63B0 + CDFF3EA2D0FF1F96D0FF0E8FD1FF0C8FD2FF0C90D4FF0C91D5FF0C92D6FF0C92 + D6FF0C92D7FF0C92D7FF0C92D7FF0C92D7FF0C92D7FF0C92D6FF0C91D6FF0C90 + D4FF0C90D3FF0C8ED1FF1491D0FF2C9CD0FF4FA8CEFF72B0C4FF8EAFB4FF8599 + 9AFF738080FF636B6BFF575A5AFF4F4F4FFF4B4949FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4D4C4CFF677E86FFBEE8FBFFC6EA + FCFFC6EAFCFFADC1CAFF6E7979FF545656FF4A4848FF494747FF4C4A4AFF5B5F + 5FFF9DC9D9FFC6EAFCFFC6EAFCFFBFE2F3FF848D8DFF595D5DFF4A4949FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF1C1B + 1B4A000000090000000100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000001B7AAA0439586887494747FB494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494848FF4C4A4AFF505050FF575A5AFF616767FF6D7878FF7B8B + 8BFF899E9EFF93AFB1FF8EB6BEFF7DB5C5FF69B1CBFF57ACCFFF49A7D0FF3DA2 + D1FF369FD1FF319DD0FF309DD0FF329ED1FF38A0D0FF43A5D1FF4FA9CFFF5FAD + CCFF71B0C6FF85B3BEFF8FAFB3FF8BA1A2FF7D8E8EFF6F7B7BFF626A6AFF585C + 5CFF515252FF4C4B4BFF4A4848FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4C4A4AFF5D6465FFBAE5F8FFCBEC + FCFFCBECFCFFC2E1F0FF899697FF646B6BFF545555FF505151FF565959FF7083 + 87FFC1E8FAFFCBECFCFFCBECFCFFBBD8E5FF7A8484FF565858FF4A4848FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF454343D10000 + 0010000000030000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000083A3A338494747D74947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494848FF4B4A4AFF4E4E4EFF5355 + 55FF595D5DFF606767FF677171FF6F7B7BFF778585FF7D8E8EFF839595FF879B + 9BFF8A9F9FFF8CA1A1FF8CA2A2FF8BA0A0FF889C9CFF849696FF7E8F8FFF7886 + 86FF707D7DFF697272FF626969FF5B5F5FFF545656FF4F4F4FFF4C4A4AFF4A48 + 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4A4848FF555858FF9ABECDFFCFED + FCFFCFEDFCFFCFEDFCFFB8D1DCFF869596FF6E7979FF697373FF788B8FFFB8DA + E7FFCFEDFCFFCFEDFCFFCFEDFCFFA9BBC2FF687171FF505151FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF212020590000 + 0007000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000A0D1D1046675 + 757B494747F7494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494848FF4B4949FF4C4B4BFF4F4E4EFF515252FF535555FF565858FF575B + 5BFF595D5DFF5A5E5EFF5A5E5EFF5A5D5DFF585B5BFF565959FF545656FF5152 + 52FF4F4F4FFF4C4C4CFF4B4A4AFF4A4848FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF68777CFFC2E5 + F4FFD4EFFCFFD4EFFCFFD4EFFCFFCEEAF8FFBCD9E4FFBCDCE8FFD0EDFBFFD4EF + FCFFD4EFFCFFD4EFFCFFC5DEEAFF7F8888FF5A5E5EFF4C4B4BFF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF424040B9000000090000 + 0001000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00006675751C4947479F494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4A4848FF4A4848FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF535555FF7688 + 8EFFC6E5F3FFD8F1FDFFD8F1FDFFD8F1FDFFD8F1FDFFD8F1FDFFD8F1FDFFD8F1 + FDFFD8F1FDFFC8DFEBFF869394FF606767FF505050FF4A4848FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF484646EC10101025000000020000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000049474730494747AF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF4C4A4AFF5456 + 56FF687578FF9DB5BDFFC4E1EEFFD9F0FBFFDDF2FDFFDDF2FDFFD6EEF9FFC5DE + E9FFA3B6BBFF778283FF5F6565FF515252FF4B4949FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FB2C2B2B4600000002000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000004947472C4947479B494747F74947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B4A + 4AFF505050FF585C5CFF626969FF697373FF6D7878FF6E7979FF6C7777FF6770 + 70FF606565FF565959FF4E4E4EFF4A4949FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FB323131580000000200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000494747144947 + 4773494747D7494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4B4A4AFF4E4D4DFF505050FF525353FF525353FF525252FF4F50 + 50FF4D4C4CFF4A4949FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF484646E732303042000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000004947473049474787494747DB494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF464444A82322221500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000004947472449474768494747A74947 + 47DF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FB484646B04846 + 4634000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000049474714494747444947476C4947478F494747AF494747C7494747DF4947 + 47EB494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747F3494747D3494747A34947476448464618000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF007FFFFFFFFFFFFFFFFFFFFFFFFFFF800001FFFFFFFFFFFFFFFFFFF + FFFFFF80000001FFFFFFFFFFFFFFFFFFFFFFFC000000003FFFFFFFFFFFFFFFFF + FFFFF00000000007FFFFFFFFFFFFFFFFFFFF800000000001FFFFFFFFFFFFFFFF + FFFE0000000000007FFFFFFFFFFFFFFFFFF80000000000001FFFFFFFFFFFFFFF + FFF000000000000007FFFFFFFFFFFFFFFFC000000000000001FFFFFFFFFFFFFF + FF8000000000000000FFFFFFFFFFFFFFFE00000000000000007FFFFFFFFFFFFF + FC00000000000000001FFFFFFFFFFFFFF800000000000000000FFFFFFFFFFFFF + F0000000000000000007FFFFFFFFFFFFE0000000000000000003FFFFFFFFFFFF + C0000000000000000001FFFFFFFFFFFF80000000000000000000FFFFFFFFFFFF + 000000000000000000007FFFFFFFFFFE000000000000000000003FFFFFFFFFFC + 000000000000000000001FFFFFFFFFF8000000000000000000001FFFFFFFFFF8 + 000000000000000000000FFFFFFFFFF00000000000000000000007FFFFFFFFE0 + 0000000000000000000007FFFFFFFFE00000000000000000000003FFFFFFFFC0 + 0000000000000000000001FFFFFFFF800000000000000000000001FFFFFFFF80 + 0000000000000000000000FFFFFFFF000000000000000000000000FFFFFFFF00 + 00000000000000000000007FFFFFFE0000000000000000000000007FFFFFFE00 + 00000000000000000000003FFFFFFE0000000000000000000000003FFFFFFC00 + 00000000000000000000001FFFFFFC0000000000000000000000001FFFFFF800 + 00000000000000000000001FFFFFF80000000000000000000000000FFFFFF800 + 00000000000000000000000FFFFFF000000000000000000000000007FFFFF000 + 000000000000000000000007FFFFF000000000000000000000000007FFFFF000 + 000000000000000000000003FFFFE000000000000000000000000003FFFFE000 + 000000000000000000000001FFFFE000000000000000000000000001FFFFE000 + 000000000000000000000000FFFFE000000000000000000000000000FFFFE000 + 000000000000000000000000FFFFC0000000000000000000000000007FFFC000 + 0000000000000000000000007FFFC0000000000000000000000000003FFFC000 + 0000000000000000000000003FFFC0000000000000000000000000001FFFC000 + 0000000000000000000000001FFFC0000000000000000000000000001FFFC000 + 0000000000000000000000000FFFC0000000000000000000000000000FFFC000 + 00000000000000000000000007FFC00000000000000000000000000007FFE000 + 00000000000000000000000003FFE00000000000000000000000000003FFE000 + 00000000000000000000000003FFE00000000000000000000000000001FFE000 + 00000000000000000000000001FFE00000000000000000000000000000FFF000 + 00000000000000000000000000FFF00000000000000000000000000000FFF000 + 000000000000000000000000007FF000000000000000000000000000007FF800 + 000000000000000000000000003FF800000000000000000000000000003FF800 + 000000000000000000000000001FFC00000000000000000000000000001FFC00 + 000000000000000000000000001EFC00000000000000000000000000000EFE00 + 000000000000000000000000000EFE000000000000000000000000000006FE00 + 0000000000000000000000000006FF000000000000000000000000000002FF00 + 0000000000000000000000000002FF800000000000000000000000000002FFC0 + 0000000000000000000000000001FFC00000000000000000000000000001FFE0 + 0000000000000000000000000001FFE00000000000000000000000000000FFF0 + 0000000000000000000000000000FFF80000000000000000000000000000FFF8 + 0000000000000000000000000000FFFC0000000000000000000000000000FFFE + 0000000000000000000000000000FFFF0000000000000000000000000000FFFF + 8000000000000000000000000000FFFFC000000000000000000000000000FFFF + E000000000000000000000000000FFFFF000000000000000000000000000FFFF + F800000000000000000000000001FFFFFC00000000000000000000000001FFFF + FE00000000000000000000000001FFFFFF00000000000000000000000003FFFF + FFC0000000000000000000000007FFFFFFE0000000000000000000000007FFFF + FFF800000000000000000000000FFFFFFFFE00000000000000000000001FFFFF + FFFF80000000000000000000003FFFFFFFFFE0000000000000000000007FFFFF + FFFFFC00000000000000000001FFFFFFFFFFFF80000000000000000007FFFFFF + FFFFFFF800000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFF2800000060000000C0000000010020000000 + 0000809400000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000009F9F9F019F9F + 9F019F9F9F010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000010000 + 000300000006000000080000000B0000000E0000001000000011000000120000 + 00120000001200000011000000100000000D0000000A00000007000000050000 + 0002000000010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000100000003000000070000000D000000140000 + 001B00000021000000280000002D000000320000003500000037000000370000 + 0037000000370000003700000034000000300000002C000000250000001F0000 + 0018000000100000000A00000005000000020000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000002000000070000000F00000019000000240000002F000000390000 + 0040000000460000004B0000004E000000500000005200000052000000530000 + 0053000000530000005200000051000000500000004D00000049000000440000 + 003D000000340000002A0000001E000000130000000A00000004000000010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000025242401030303040000 + 000B0000001700000025000000330000004000000049030303530F0F0F711B1A + 1A8B292828A9302E2EC13D3B3BD4424040E1464444EF464444EF464444EF4644 + 44EF464444EF434141E53E3C3CD7323030C4292828AD1D1C1C900F0F0F750404 + 045B000000520000004C00000045000000390000002C0000001D000000100000 + 0007141313020000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000050505040000000D0000001A0000 + 002B0000003B01010149090909621F1E1E92343333C4413F3FE9474545F84947 + 47FE494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF494747FF484646FE494747FF494747FF484646FE474545F94140 + 40EA353434C5201F1F960B0A0A6A010101540000004C00000041000000320000 + 0022000000130202020716161602000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000D0D0D020000000A000000190000002C0000003E0302 + 024E1D1C1C8C363535CB474545F6494747FF494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF474545F6363535CB1B1B1B8C030303590000004F0000 + 0045000000350000002100000011000000062322220100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001B1A1A010000000700000015000000290000003D0A0A0A5F282626A64543 + 43EE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE444242ED262525A60A0A + 0A680000005100000045000000330000001E0000000C03030303000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000606 + 06030000000D0000001F0000003608080857292828A6454343F1484646FE4846 + 46FE494747FF494747FF484646FE494747FF494747FF494747FF484646FE4947 + 47FF494747FF494747FE494747FF494747FF494747FE494747FF494747FF4947 + 47FE494747FF494747FF494747FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4442 + 42EF2A2929AB070707620000004E000000400000002A00000014030303062C31 + 3101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000B0F0F050000 + 0013000000290000004022212192424040E9484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE494747FE494747FE4A49 + 49FE4D4C4CFE505050FE535555FE565959FE595D5DFE5B5F5FFE5B5F5FFE5A5E + 5EFE585B5BFE555757FE515353FE4E4F4FFE4C4B4BFE4A4848FE494747FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE414040E91F1E1E940101015500000048000000340000001D0000 + 0009324343020000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000596B6B0100000008000000190000 + 0033101010663B3939D1494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF494747FF494747FE4A4949FF4E4E4EFF565858FF616767FE6C78 + 78FF728689FF6F909AFE6796A6FF619AB0FF5D9DB7FE5B9EBAFF5A9FBBFF5A9D + B9FE5D9BB5FF6098ADFF6692A2FE6D8C95FF6F8184FF687171FE5C6161FF5354 + 54FF4C4C4CFE4A4848FF494747FF484646FE494747FF484646FE494747FF4947 + 47FF484646FE494747FF484646FE3A3838D30E0E0E6F0000004F0000003E0000 + 00240000000E1A23230300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000073737301000000090000001D0201013A2121 + 2190454343F1484646FE494747FF494747FF484646FE494747FF494747FF4947 + 47FE4A4848FF4E4D4DFF575A5AFE666F6FFF71868AFF6B98A7FF529CBCFE3B9D + CAFF2D9BD1FF299CD6FE299DD9FF2A9FDBFF2CA0DCFE2DA1DCFF2EA1DCFF2DA1 + DCFE2BA0DBFF2A9EDAFF289DD8FE289BD5FF2B99CFFF3B9AC7FE5198B6FF6890 + 9EFF6B7D80FE606666FF535555FF4C4A4AFE494747FF494747FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE444242F0201F1F95010101540000 + 00430000002A000000112B2B2B03000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000073737301000000090000001F04040442302F2FB44846 + 46FE484646FE484646FE484646FE484646FE484646FE494747FE4A4848FE4F4E + 4EFE5C6161FE717F80FE7099A6FE499DC3FE309CD1FE269BD7FE2BA0DBFE30A4 + DFFE32A6E1FE34A8E3FE36A9E4FE37AAE5FE38ABE6FE39ABE6FE39ABE6FE39AB + E6FE38ABE6FE37AAE5FE36A9E4FE34A8E2FE32A6E1FE30A3DEFE299FDBFE249A + D6FE2F99CDFE4998BAFE6C8F9AFE687272FE565959FE4C4B4BFE494747FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FC2F2D2DB80404 + 0458000000460000002D00000012070707040000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000006B6B6B010000000A000000200B0B0B503B3A3AD2484646FE4947 + 47FF494747FF484646FE494747FF494747FF494848FE4F4F4FFF5E6363FF7386 + 89FE649FB5FF389ECEFF239AD7FE2CA1DDFF2FA4E0FF32A7E3FF35AAE6FE37AC + E8FF39AEEAFF3BAFEBFE3CB1ECFF3DB1EDFF3DB1EDFE3EB2EDFF3EB2EDFF3EB2 + EDFE3EB2EDFF3EB1ECFF3DB1ECFE3CB0EBFF3BAFEAFF39ADE8FE36AAE6FF33A8 + E3FF30A5E0FE2AA0DCFF1F98D6FF399AC8FE6294A6FF6A797BFE565959FF4C4B + 4BFF494747FE494747FF494747FF484646FE494747FF494747FF484646FE3A38 + 38D209090965000000490000002F0000001301131C0400000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000090000001F0C0C0C51403F3FE0494747FE484646FE4947 + 47FF494747FF484646FE494747FF4C4B4BFF575B5BFE708081FF679DB1FF359C + CDFE259CD9FF2BA1DEFF2FA6E2FE32A9E6FF35ACE9FF38AEEBFF39B0ECFE3BB1 + EEFF3CB2EFFF3DB3EFFE3DB4F0FF3EB4F0FF3EB4F0FE3FB4F0FF3FB5F1FF3FB4 + F1FE3FB5F1FF3FB4F0FF3FB4F0FE3EB3EFFF3EB3EFFF3DB2EDFE3BB1ECFF39AF + EBFF37ACE8FE34A9E6FF30A6E2FF2AA1DDFE239AD7FF3398C8FE6591A1FF6570 + 71FF525353FE4A4848FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF3D3C3CDD0B0B0B6A000000480000002E00000012202B2B03000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000060000001B0C0C0C4F3F3E3EDD484646FE484646FE484646FE4846 + 46FE484646FE494747FE4F5050FE646B6BFE77979FFE409EC9FE239AD7FE28A0 + DDFE2CA5E3FE30A9E7FE33ACEAFE36AEECFE38B0EEFE39B1EFFE39B2F0FE3BB3 + F0FE3BB3F1FE3CB4F1FE3CB4F1FE3CB4F1FE3DB4F1FE3DB5F1FE3DB5F1FE3DB5 + F1FE3DB5F1FE3DB5F1FE3EB5F1FE3EB5F1FE3EB4F1FE3DB4F0FE3DB3F0FE3CB2 + EFFE3AB1EEFE38AFECFE36ADEAFE32A9E6FE2EA5E2FE29A0DDFE2098D4FE4297 + BEFE6E878CFE595D5DFE4C4B4BFE494747FE484646FE484646FE484646FE4846 + 46FE484646FE413F3FE60B0A0A6A000000470000002B0000000F202B2B020000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000080B + 0B04000000160C0C0C4B413F3FE0484646FE494747FF494747FF484646FE4947 + 47FF4A4949FF545757FE718182FF61A1BAFF2699D3FE259EDCFF29A3E1FF2DA8 + E6FE31ABEAFF33AEECFF35AFEEFE37B1EFFF37B2F0FF38B2F1FF38B3F1FE38B3 + F2FF39B3F2FF39B3F1FE39B3F2FF3AB3F2FF3AB3F1FE3AB4F2FF3AB4F2FF3AB4 + F1FE3AB4F2FF3BB4F2FF3BB4F1FE3BB4F2FF3BB4F2FF3BB4F1FE3BB4F1FF3BB4 + F1FF3AB3F0FE39B2F0FF39B1EEFF37AFECFE34ACEAFF30A9E6FE2BA4E1FF249D + DAFF2497D0FE6094A8FF646E6EFF4F4F4FFE494747FF494747FF484646FE4947 + 47FF494747FF484646FE3F3D3DE00A0A0A6900000045000000260000000C506B + 6B01000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000002C3B3B020000 + 0011050505373D3B3BD4494747FF484646FE494747FF494747FF494747FE4B4A + 4AFF5A5E5EFF778C8FFE49A0C6FF219AD7FF259FDEFE29A5E4FF2CA9E9FF2FAC + ECFE31AEEEFF33AFEFFF33B0F0FE34B1F1FF35B1F1FF35B2F2FF35B2F1FE36B2 + F2FF36B2F2FF36B2F1FE37B2F2FF37B2F2FF37B2F1FE37B3F2FF37B3F2FF37B2 + F1FE38B3F2FF38B3F2FF38B3F1FE38B3F2FF38B3F2FF38B3F1FE38B3F2FF39B3 + F2FF38B3F1FE38B3F1FF38B2F0FF38B1EFFE36B0EEFF34AEECFE30AAE9FF2CA6 + E4FF27A0DEFE1E97D4FF4C97B8FF6A797BFE515252FF4A4848FF494747FE4947 + 47FF494747FF484646FE494747FF3C3A3AD7070707600000003F000000200000 + 0008000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000B0202 + 022A333131B6484646FE484646FE484646FE484646FE494747FE4B4A4AFE5D61 + 61FE79959BFE3B9DCBFE1F9AD8FE24A0E0FE28A6E6FE2AAAEAFE2DACEDFE2FAE + EFFE30AFF0FE30AFF0FE31B0F0FE31B0F0FE31B0F0FE32B0F1FE32B0F1FE32B0 + F1FE32B0F1FE33B1F1FE33B1F1FE33B1F1FE33B1F1FE34B1F1FE34B1F1FE34B1 + F1FE34B1F1FE35B1F1FE35B1F1FE35B1F1FE35B1F1FE35B2F1FE36B2F1FE36B2 + F1FE36B2F1FE36B2F1FE36B2F1FE36B2F1FE35B1F0FE34B0EFFE32AEEDFE2FAB + EAFE2BA7E6FE27A1E0FE1E98D7FE3B97C2FE6E7F81FE535555FE4A4848FE4846 + 46FE484646FE484646FE484646FE484646FE353434C801010152000000380000 + 0018040404040000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000050000001C2726 + 268E494747FF484646FE494747FF484646FE494747FF4B4A4AFF5D6363FE789B + A4FF2F9BCFFF1E9ADAFE22A1E2FF26A6E8FF28A9EBFE2AACEDFF2BADEFFF2CAE + F0FE2DAFF1FF2DAFF1FF2DAFF0FE2DAFF1FF2EAFF1FF2EAFF1FF2EAFF0FE2FAF + F1FF2FAFF1FF2FAFF0FE2FAFF1FF2FAFF1FF30AFF0FE30B0F1FF30B0F1FF30B0 + F0FE31B0F1FF31B0F1FF31B0F0FE31B0F1FF31B0F1FF32B0F0FE32B0F1FF32B0 + F1FF32B0F1FE32B0F1FF33B1F1FF33B0F1FE33B1F1FF32B0F0FE32AFF0FF30AE + EEFF2EABEBFE2AA7E7FF26A2E1FF1E99D9FE3197C7FF6C8489FF545656FE4A48 + 48FF494747FF484646FE494747FF494747FF484646FE292828A90000004D0000 + 00300000000F1312120200000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002B373702000000111616165E4644 + 44F4494747FF484646FE494747FF494747FE4B4A4AFF5C6161FF78989FFE2D9B + CFFF1C9ADAFF20A0E2FE24A6E8FF26A9EBFF27ABEEFE28ACEFFF29ADF0FF29AD + F0FE29ADF1FF2AADF1FF2AADF0FE2AAEF1FF2AAEF1FF2BAEF1FF2AAEF0FE2BAE + F1FF2BAEF1FF2BAEF0FE2CAEF1FF2CAEF1FF2CAEF0FE2CAFF1FF2DAFF1FF2DAE + F0FE2DAFF1FF2DAFF1FF2EAFF0FE2EAFF1FF2EAFF1FF2EAFF0FE2EAFF1FF2FAF + F1FF2FAFF0FE2FAFF1FF2FB0F1FF2FAFF0FE30B0F1FF30AFF0FE2FAFF0FF2FAE + F0FF2EADEEFE2BABECFF28A7E8FF24A1E2FE1C99D9FF3296C6FF6B8287FE5253 + 53FF494747FF484646FE494747FF494747FF484646FE474545F8181717830000 + 0044000000220101010800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000008050505283F3E3EDB4846 + 46FE484646FE484646FE484646FE4A4848FE575A5AFE799397FE359CCDFE1A99 + D9FE1D9FE1FE21A4E8FE23A8ECFE25AAEEFE25ABEFFE26ACF0FE26ACF0FE26AC + F0FE27ACF0FE27ACF0FE27ACF0FE27ACF0FE27ACF0FE28ACF0FE28ACF0FE28AC + F0FE28ADF0FE28ADF0FE28ADF0FE28ADF0FE28ADF0FE29ADF0FE29ADF0FE29AD + F0FE29ADF0FE29ADF0FE2AADF0FE2AADF0FE2AAEF0FE2AAEF0FE2BAEF0FE2BAE + F0FE2BAEF0FE2BAEF0FE2CAEF0FE2CAEF0FE2CAEF0FE2CAEF0FE2CAEF0FE2CAE + F0FE2CADEFFE2BACEEFE29AAECFE26A6E8FE22A0E1FE1B98D9FE3897C4FE6C79 + 7BFE505050FE494747FE484646FE484646FE484646FE484646FE403E3EE30706 + 065D000000370000001606060603000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000A090903000000172B2A2A98494747FF4947 + 47FF494747FF484646FE494747FF525454FE778B8DFF43A0CAFF1797D8FE1A9E + E1FF1DA3E8FF20A7EBFE21A9EEFF22AAEFFF23AAEFFE23ABF0FF23ABF0FF23AB + F0FE24ABF0FF24ABF0FF24ABF0FE24ABF0FF24ABF0FF25ABF0FF25ABF0FE25AB + F0FF25ABF0FF25ABF0FE26ACF1FF26ACF1FF26ACF0FE26ACF1FF26ACF1FF27AC + F0FE27ACF1FF27ACF1FF27ACF0FE27ACF1FF27ACF1FF28ACF0FE28ACF1FF28AC + F1FF457995FE3C8CB5FF2EA4E1FF28ADF0FE29ADF1FF29ADF0FE29ADF1FF29AD + F1FF29ADF0FE29ACF0FF28ABEEFF27A9EBFE23A5E7FF1F9FE1FF1896D7FE4798 + BBFF667172FF4D4D4DFE494747FF494747FF484646FE494747FF494747FF302E + 2EB800000049000000290000000B000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000A11111148464444F2494747FF4947 + 47FF494747FF494747FE4E4E4EFF6D7878FE59A4C3FF1696D6FF189CDFFE1BA2 + E7FF1DA5EBFF1EA7EDFE1FA8EFFF238BBFFF2F7295FE377B9EFF3B7FA1FF3C7F + A2FE3C7FA2FF3C7FA2FF3C7FA2FE2A9AD3FF21AAF0FF21AAF0FF22AAEFFE22AA + F0FF22AAF0FF22AAEFFE22ABF0FF22ABF0FF23AAF0FE23ABF0FF23ABF0FF23AB + F0FE23ABF0FF24ABF0FF24ABF0FE24ABF0FF24ABF0FF24ABF0FE25ABF0FF2F98 + CEFF585757FE5A5859FF565F63FF48768DFE3692C2FF29A6E7FE26ACF1FF26AC + F1FF27ACF0FE27ACF1FF26ABF0FF25AAEEFE24A8EBFF20A3E6FF1C9DDEFE1795 + D4FF5A94ACFF5D6363FE4A4949FF494747FF484646FE494747FF494747FF4846 + 46FB121212740000003C00000019090808030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000200000016353434B6484646FE484646FE4846 + 46FE484646FE4B4949FE5F6565FE75A2AFFE1794D3FE1599DCFE179FE4FE1AA4 + EAFE1BA6EDFE1CA7EEFE1CA8EFFE1F92CDFE33393DFE474646FE525050FE5453 + 53FE545353FE545353FE545353FE44677AFE1FA6EBFE1EA9EFFE1EA9EFFE1EA9 + EFFE1FA9EFFE1FA9EFFE1FA9EFFE1FA9EFFE1FA9EFFE20A9EFFE20A9EFFE20A9 + EFFE20AAEFFE20AAEFFE21AAEFFE21AAEFFE21AAEFFE21AAEFFE22AAEFFE3F73 + 8EFE575656FE585656FE585656FE585656FE585757FE52616AFE417C9BFE2E9A + D1FE23ABF0FE23ABF0FE23ABF0FE23AAEFFE22A9EDFE21A6EAFE1DA1E5FE199A + DCFE1E94CFFE6B8B94FE535454FE494747FE484646FE484646FE484646FE4846 + 46FE383636CE0202024E0000002A0000000A0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000819181859484646F9484646FE494747FF4947 + 47FF494747FF545656FE799295FF309CCFFE1397DAFF159DE3FF17A2E9FE18A5 + EDFF19A6EFFF19A7EFFE19A7F0FF1AA7EFFF236282FE3A3939FF4B4949FF514F + 4FFE535151FF535151FF535151FE515051FF2D88B7FF1BA8F0FF1CA8EFFE1CA8 + F0FF1CA8F0FF1CA8EFFE1CA8F0FF1CA8F0FF1DA8EFFE1DA8F0FF1DA8F0FF1DA8 + EFFE1DA8F0FF1DA8F0FF1EA8EFFE1EA9F0FF1EA9F0FF1EA8EFFE239EDDFF4E57 + 5CFF565454FE565454FF565454FF565454FE565454FF565454FE565454FF5755 + 55FF4E626EFE3A82A7FF299CD7FF21A9EFFE20A9EEFF1FA7ECFF1DA4E9FE1A9F + E2FF1697D9FF3698C6FE697576FF4D4D4DFF494747FE494747FF494747FF4846 + 46FE484646FE1A1919840000003B000000151312120200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000002000000123B3939BE494747FF484646FE494747FF4947 + 47FF4C4B4BFF6B7575FE5BA4C1FF1193D6FE139AE0FF15A0E7FF16A3ECFE16A5 + EEFF16A6EFFF16A6EFFE17A6F0FF17A6F0FF189CE0FE2C363BFF413F3FFF4D4B + 4BFE504E4EFF514F4FFF514F4FFE514F4FFF465B67FF1CA1E5FF19A7EFFE19A7 + F0FF19A7F0FF19A7EFFE19A7F0FF19A7F0FF1AA7EFFE1AA7F0FF1AA7F0FF1AA7 + EFFE1AA7F0FF1AA8F0FF1BA8EFFE1BA8F0FF1BA8F0FF1BA8EFFE317FA7FF5250 + 50FF535252FE545252FF545252FF535252FE545252FF545252FE545353FF5453 + 53FF545252FE545353FF505559FF3D5F71FE2488BBFF1DA7EEFF1CA6EBFE1AA1 + E7FF169BDFFF1293D4FE5D94AAFF5A5E5EFF4A4848FE494747FF494747FF4846 + 46FE494747FF393737D00101014A000000240101010800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000611111142484646FC494747FF484646FE494747FF4947 + 47FF565959FF7C9CA3FE1F96D1FF1096DBFE129DE4FF13A1EAFF14A4EDFE14A5 + EEFF14A5EFFF15A5EFFE15A6EFFF15A6EFFF15A5EFFE1D6B92FF343333FF4644 + 44FE4E4C4CFF4F4D4DFF4F4D4DFE4F4D4DFF4E4D4DFF2F7BA2FF16A6EFFE17A6 + F0FF17A6F0FF17A6EFFE17A6F0FF17A6F0FF17A6EFFE17A6F0FF17A7F0FF17A6 + EFFE17A7F0FF18A7F0FF18A7EFFE18A7F0FF18A7F0FF19A4EBFE435C69FF514F + 4FFF525050FE525050FF525050FF525050FE525050FF525050FE525050FF5250 + 50FF525050FE525050FF4E4C4CFF3E3D3DFE23749DFF1AA7EFFF1AA6EDFE19A3 + EAFF169FE4FF1497DBFE2795CBFF6B7E82FF4E4E4EFE494747FF494747FF4846 + 46FE494747FF474545F914131375000000320000001022212101000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000D343232A5484646FE484646FE484646FE494747FE4D4C + 4CFE6C7777FE53A5C7FE0E93D6FE0F9AE0FE119FE7FE12A2ECFE12A3EEFE12A4 + EEFE13A4EEFE13A4EEFE13A4EEFE13A4EEFE13A4EEFE149DE4FE253C49FE3B39 + 39FE494747FE4D4B4BFE4D4B4BFE4D4B4BFE4D4B4BFE494E52FE1A9BDDFE15A5 + EFFE15A5EFFE15A5EFFE15A5EFFE15A5EFFE15A5EFFE16A5EFFE16A5EFFE16A5 + EFFE16A5EFFE16A5EFFE16A5EFFE16A6EFFE16A6EFFE248BC0FE4C4D4EFE4F4D + 4DFE4F4D4DFE4F4D4DFE4F4D4DFE4E4C4CFE4C4A4AFE4D4B4BFE4F4D4DFE504E + 4EFE514F4FFE504E4EFE464545FE32383CFE19A0E5FE18A6EFFE18A6EEFE17A4 + ECFE16A0E8FE139AE0FE0F92D5FE5696B1FE5C6161FE494747FE484646FE4846 + 46FE484646FE484646FE313030BB000000410000001C00000005000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000209090928464444EA494747FF494747FF484646FE494747FF5658 + 58FF809CA1FF1A94D1FE0E96DBFF0E9CE4FE10A0EAFF10A2EDFF10A3EEFE11A4 + EFFF11A4EFFF11A4EEFE11A4EFFF11A4EFFF11A4EEFE11A4EFFF1777A8FF2D2D + 2EFE413F3FFF4B4949FF4C4A4AFE4C4A4AFF4C4A4AFF4C4A4AFF336C89FE13A4 + EDFF13A4EFFF13A4EEFE13A5EFFF13A5EFFF13A5EEFE13A5EFFF13A5EFFF13A5 + EEFE14A5EFFF14A5EFFF14A5EFFE14A5EFFF14A5EFFF36667FFE4D4B4BFF4E4C + 4CFF4E4C4CFE4E4C4CFF4D4B4BFF474545FE3E3C3CFF3D3B3BFE434242FF4947 + 47FF4C4A4AFE4B4949FF3D3C3CFF235C79FE16A6EFFF16A6EFFF16A5EFFE15A4 + EDFF14A1EAFF129DE4FE0F96DAFF2695CBFF6C7E81FE4D4C4CFF494747FF4846 + 46FE494747FF494747FF474545F5050505520000002B0000000C000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000005201F1F68484646FE494747FF494747FF484646FE4B4A4AFF676F + 6FFF60A6C1FF0C91D6FE0D98E0FF0E9EE7FE0FA1ECFF0FA2EEFF0FA3EEFE0FA3 + EFFF0FA3EFFF0FA3EEFE10A4EFFF10A4EFFF10A3EEFE10A4EFFF109FE8FF1F42 + 54FE373535FF454343FF4A4848FE4A4848FF4A4848FF4A4848FF474A4DFE1C90 + CCFF11A4EFFF11A3EEFE11A4EFFF11A4EFFF11A4EEFE11A4EFFF11A4EFFF11A4 + EEFE11A4EFFF12A4EFFF12A4EEFE12A4EFFF169BDFFF474A4CFE4C4A4AFF4C4A + 4AFF4C4A4AFE4C4A4AFF4A4848FF3D3B3BFE2C2A2AFF272626FE2D2C2CFF3635 + 35FF3E3C3CFE3F3D3DFF313335FF1887BFFE14A5EFFF14A5EFFF14A5EEFE13A4 + EEFF12A2EBFF109EE7FE0E98DEFF0F91D4FF6094A9FE565959FF494747FF4846 + 46FE494747FF494747FF484646FE1E1D1D8E0000003B00000017121111020000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000A3B3939B8484646FE484646FE484646FE494747FE515151FE7A8F + 91FE2D9BCFFE0C95DAFE0D9BE3FE0D9FE9FE0EA1EDFE0EA2EEFE0EA2EEFE0EA2 + EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE1283 + BDFE2A292AFE3D3C3CFE484646FE494747FE494747FE494747FE494747FE385E + 72FE10A1EBFE0FA3EEFE0FA3EEFE0FA3EEFE0FA3EEFE0FA3EEFE0FA3EEFE10A3 + EEFE10A3EEFE10A3EEFE10A3EEFE10A3EEFE28769EFE494747FE4A4848FE4A48 + 48FE4A4848FE4A4848FE444242FE313132FE186A93FE174A64FE1C2428FE2120 + 20FE272626FE292828FE203F50FE12A2ECFE12A4EEFE12A4EEFE12A4EEFE11A3 + EEFE10A2EDFE0F9FE9FE0E9AE2FE0D94D9FE3698C6FE666F6FFE4B4A4AFE4846 + 46FE484646FE484646FE484646FE3B3939D70202024C00000026000000080000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000C0C0C22464444EA484646FE494747FF494747FF494747FE5B5F5FFF77A4 + B1FF1092D3FF0C97DEFE0D9DE6FF0DA0EBFE0EA2EEFF0EA3EFFF0EA2EEFE0EA3 + EFFF0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2 + EEFE1B4A62FF323131FF434141FE494747FF494747FF494747FF494747FE4748 + 49FF2183B5FF0EA2EEFE0FA3EFFF0FA3EFFF0FA3EEFE0FA3EFFF0FA3EFFF0FA3 + EEFE0FA3EFFF0FA3EFFF0FA3EEFE119FE7FF3B5461FF494747FE4A4848FF4A48 + 48FF4A4848FE484646FF3E3C3CFF254150FE109FE7FF10A3EDFE1192D4FF1461 + 88FF192F3BFE1B1C1DFF146E9CFF10A3EEFE10A4EFFF10A4EFFF10A3EEFE10A3 + EFFF0FA2EEFF0FA0EBFE0D9CE5FF0D96DCFF1291D1FE70898FFF505050FF4947 + 47FE494747FF494747FF484646FE484646FC1514147700000036000000121616 + 1602000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000219191951484646FC484646FE494747FF494747FF4A4949FE6A7373FF5AA6 + C5FF0C92D6FF0C99E1FE0D9EE8FF0DA1ECFE0EA2EEFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE108AC8FF262C30FF3A3939FE464444FF484646FF494747FF484646FE4846 + 46FF3E525DFF0FA0EAFE0EA3EFFF0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2 + EEFE0EA3EFFF0EA3EFFF0EA2EEFE1B8AC4FF474647FF494747FE4A4848FF4A48 + 48FF494747FE454343FF363434FF196891FE0FA3EFFF0EA2EEFE0FA3EFFF0FA3 + EFFF0F9EE7FE117BB2FF0F9AE1FF0FA3EEFE0FA3EFFF0FA3EFFF0FA3EEFE0FA3 + EFFF0EA2EEFF0EA1ECFE0D9EE7FF0D98E0FF0C91D5FE5C96ACFF585C5CFF4947 + 47FE494747FF494747FF484646FE494747FF323131BF000000440000001F0505 + 0506000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00032B2A2A8B484646FE484646FE484646FE494747FE4E4E4EFE7B8D8EFE309B + CEFE0C94DAFE0D9BE4FE0D9FEAFE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE18597BFE2F2E2EFE424040FE484646FE484646FE484646FE4846 + 46FE484646FE2777A0FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE30637DFE484646FE484646FE484646FE4846 + 46FE484646FE3F3E3EFE2B2D2FFE0F97DCFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2 + EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2 + EEFE0DA2EEFE0DA1EDFE0D9FE9FE0D9AE3FE0C94D9FE3B97C2FE646D6DFE4A48 + 48FE484646FE484646FE484646FE484646FE454343F40D0C0C65000000300000 + 000F252424010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00063F3E3EBB494747FF484646FE494747FF494747FF545656FE7E9FA6FF1994 + D2FF0D96DDFF0D9CE5FE0EA0EBFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0F93D7FF233037FE393737FF454444FF484646FF484646FE4947 + 47FF494747FF414E55FE1497DBFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF1397DBFE414B50FF484646FF484646FE494747FF4947 + 47FF464444FE393737FF1F4D65FF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA0EAFF0D9CE4FF0C95DBFE2295CDFF6C7E82FF4C4C + 4CFE494747FF494747FF484646FE494747FF494747FE282727A60000003F0000 + 001B030303040000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0008474545E4494747FF484646FE494747FF494747FF5B6060FE74A7B7FF0F92 + D4FF0D98DFFF0D9EE7FE0EA1ECFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF16658DFE2E2D2DFF403E3EFF484646FF484646FE4947 + 47FF494747FF484646FE2E6B8BFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF237AA7FE474545FF494747FF484646FE494747FF4846 + 46FF434141FE313131FF147AAEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA1EBFF0D9DE6FF0C97DDFE1292D2FF6C8C96FF5051 + 51FE494747FF494747FF484646FE494747FF494747FF444242EB0302024E0000 + 002A0000000B0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000D0D + 0D16484646FE484646FE484646FE484646FE4A4848FE646B6BFE64A9C3FE0C92 + D6FE0C99E1FE0D9EE8FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0E9EE7FE21333CFE363535FE454343FE484646FE4846 + 46FE484646FE484646FE45494CFE198ECAFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0EA2EEFE395463FE484646FE484646FE484646FE484646FE4745 + 45FE3D3B3BFE263944FE0E9CE5FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA1ECFE0D9DE7FE0C98E0FE0C91D4FE6395A8FE5557 + 57FE484646FE484646FE484646FE484646FE484646FE484646FE1F1E1E8E0000 + 003A000000160D0D0D0200000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001818 + 1834494747FF494747FF484646FE494747FF4B4A4AFF6C7777FE51A7CBFF0C93 + D8FF0D9AE2FF0D9FE9FE0EA1EDFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF0DA2EEFE1472A2FF2B2B2CFF3E3D3DFF474545FE4947 + 47FF494747FF484646FE484646FF365E73FF0EA2EDFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF1790CEFF454445FE484646FF494747FF484646FE484646FF4543 + 43FF363434FE1A5F83FF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA1EDFF0D9EE8FF0C99E1FE0C92D6FF5497B4FF5A5F + 5FFE494747FF494747FF484646FE494747FF494747FF484646FE3A3838D20202 + 024B000000250000000800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001A19 + 194B494747FF494747FF484646FE494747FF4D4C4CFF748181FE40A3CFFF0C94 + D9FF0D9BE3FF0D9FE9FE0EA2EDFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF0DA2EEFE0E9EE8FF1E3D4EFF343333FF444242FE4846 + 46FF494747FF484646FE494747FF474546FF1D87BDFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF2A6C8FFF484646FE494747FF494747FF484646FE484646FF413F + 3FFF2D2F30FE118BCAFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA1EDFF0D9FE9FF0D9AE2FE0C93D8FF4798BCFF5F66 + 66FE494747FF494747FF484646FE494747FF494747FF484646FE484646FB1312 + 127300000035000000111A191901000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001B1A + 1A60484646FE484646FE484646FE484646FE4E4E4EFE7A8A8AFE349FD1FE0C95 + DAFE0D9BE4FE0D9FEAFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE1280B9FE282A2BFE3D3B3BFE4745 + 45FE484646FE484646FE484646FE484646FE3C5563FE109DE5FE0DA2EEFE0DA2 + EEFE109DE4FE3C4F59FE484646FE484646FE484646FE484646FE464444FE3A39 + 39FE21465AFE0EA0EBFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0D9FE9FE0D9AE3FE0C94D9FE3E99C3FE646C + 6CFE494747FE484646FE484646FE484646FE484646FE484646FE484646FE312F + 2FBD000000440000001F03030306000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001B1A + 1A64494747FF494747FF484646FE494747FF4F4F4FFF7F9090FE2A9BD2FF0C95 + DBFF0D9BE5FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA0EBFF1B4B63FF323131FE4341 + 41FF484646FF484646FE494747FF494747FF484646FE2679A4FF0EA3EFFF0DA2 + EEFE1B87BFFF454444FF484646FE494747FF494747FF484646FE434242FF3331 + 31FF1672A1FE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA2EEFF0E9FEAFF0D9BE4FE0C94D9FF3799C6FF6771 + 71FE4A4848FF494747FF484646FE494747FF494747FF484646FE494747FF4543 + 43F20C0C0C630000002F0000000E292727010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001B1A + 1A64494747FF494747FF484646FE494747FF505050FF819393FE279AD1FF0C95 + DBFF0D9CE5FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF108CCCFF27282AFE3B39 + 39FF464444FF484646FE494747FF494747FF484646FE414E56FF1399DDFF0DA2 + EEFE2B6A8BFF474545FF484646FE494747FF494747FF484646FE3E3D3DFF2930 + 34FF0E9CE4FE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA2EEFF0E9FEAFF0D9BE4FE0C94D9FF3498C7FF6973 + 73FE4A4848FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF262525A20000003E0000001A060606040000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001B1A + 1A64484646FE484646FE484646FE484646FE505050FE819393FE289AD1FE0C95 + DBFE0D9BE5FE0DA0EAFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE185878FE302E + 2EFE414040FE484646FE484646FE484646FE484646FE484646FE2F6B8BFE0FA0 + E9FE3E515CFE484646FE484646FE484646FE484646FE454343FE373636FE1C56 + 74FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0D9FEAFE0D9BE4FE0C94D9FE3599C7FE6973 + 73FE4A4848FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE444242EA0202024E0000002A0000000B0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001B1A + 1A63494747FF494747FF484646FE494747FF4F4F4FFF7F9090FE2D9DD2FF0C95 + DBFF0D9BE4FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0EA3EFFF0F92D4FE242F + 36FF393737FF464444FE484646FF494747FF484646FE494747FF46494CFF2381 + B1FE46494BFF494747FF484646FE494747FF484646FF424040FE2F3032FF1382 + BCFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA2EEFF0E9FEAFF0D9BE3FE0C94D9FF3999C6FF6770 + 70FE4A4848FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE1B1B1B880000003A000000161312120200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001B1A + 1A5E494747FF494747FF484646FE494747FF4E4E4EFF7A8989FE38A0D1FF0C95 + DAFF0D9BE4FF0D9FEAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0EA3EFFF0DA2EEFE1662 + 89FF2E2C2CFF413F3FFE484646FF494747FF484646FE494747FF494747FF454B + 4FFE494747FF494747FF484646FE494747FF474545FF3B3A3AFE243D4AFF0E9F + EAFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA2EDFF0E9FE9FF0D9AE3FE0C93D9FF419AC2FF646C + 6CFE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE393737CF0202024A000000240000000700000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001A1A + 1A48484646FE484646FE484646FE484646FE4C4C4CFE738080FE47A5CFFE0C94 + D9FE0C9AE3FE0D9FE9FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0FA3EFFE149B + E1FE293D48FE414040FE504E4EFE555353FE565454FE575555FE575555FE5654 + 54FE565454FE555353FE535151FE514F4FFE4B4949FE373636FE196B94FE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA1EDFE0D9FE8FE0C9AE2FE0C93D7FE4D9ABBFE5F65 + 65FE494747FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FB1212127200000035000000111D1C1C01000000000000 + 0000000000000000000000000000000000000000000000000000000000001A19 + 1931494747FF494747FF484646FE494747FF4B4A4AFF6B7575FE59A9CAFF0C93 + D7FF0D99E2FF0D9EE9FE0EA1EDFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF0EA3EFFF0EA3EEFE10A4EFFF17A6EFFF1FA9F0FF24ABF0FE25AB + F0FF2B7FAAFF413F3FFE515050FF595858FF5B5959FE5B5959FF5B5959FF5B59 + 59FE5B5959FF5B5959FF5B5959FE5A5858FF535151FF3F4549FE269BD8FF1EA9 + F0FF16A6EFFE10A3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA1ECFF0D9EE8FF0C99E1FE0C92D6FF5C9AB2FF5A5E + 5EFE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF302E2EB9000000430000001E04040405000000000000 + 0000000000000000000000000000000000000000000000000000000000000F0F + 0F0F494747FF494747FF484646FE494747FF4A4848FF626A6AFE6CACC3FF0C92 + D6FF0D98E0FF0D9EE8FE0EA1ECFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 + EEFE0EA3EFFF12A4EFFF1FA9F0FE28ADF0FF2BAEF1FF2BAEF1FF2BAEF0FE2BAE + F1FF2BACEEFF3A525FFE4E4C4CFF5B5959FF5F5D5DFE5F5D5DFF5F5D5DFF5F5D + 5DFE5F5D5DFF5F5D5DFF5F5D5DFE5D5B5BFF525050FF3A6378FE2BADEFFF2BAE + F1FF2BAEF0FE27ACF0FF1EA9F0FF11A4EFFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA1ECFF0D9DE7FF0C98DFFE0D91D4FF6A96A5FF5456 + 56FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF444242F00A09095F0000002E0000000D222121010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0001484646E6484646FE484646FE484646FE494747FE5A5E5EFE7CA9B6FE1292 + D3FE0C97DEFE0D9DE7FE0DA0EBFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE11A4 + EFFE22AAF0FE2FAFF1FE30B0F1FE30B0F1FE30B0F1FE30B0F1FE30B0F1FE30B0 + F1FE30B0F1FE3490BFFE484A4CFE585757FE626060FE636161FE636161FE6361 + 61FE636161FE636161FE636161FE5E5C5CFE4F4E4EFE368EBCFE30B0F1FE30B0 + F1FE30B0F1FE30B0F1FE30B0F1FE2EAFF1FE20A9F0FE10A3EFFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA0EBFE0D9CE6FE0C96DDFE1793D1FE708C92FE4F50 + 50FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE252424A00000003E0000001A0A0909040000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000444242BA494747FF484646FE494747FF494747FF535454FE84A0A3FF2097 + D1FF0D96DCFF0D9CE5FE0EA0EAFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF1AA7EFFF30B0 + F1FE37B2F2FF37B2F2FF36B2F1FE37B2F2FF37B2F2FF37B2F2FF36B2F1FE37B2 + F2FF37B2F2FF37B1EFFE42687BFF555454FF636161FE676565FF676666FF6766 + 66FE676666FF676666FF666464FE5E5C5CFF4B575DFF37B0EEFE37B2F2FF37B2 + F2FF36B2F1FE37B2F2FF37B2F2FF36B2F1FE36B2F2FF2FAFF1FE17A6EFFF0EA3 + EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EDFE0E9FEAFF0D9BE4FF0C95DAFE2B97CBFF6E7D7FFF4C4B + 4BFE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF424040E70101014D000000290000000A0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00002D2B2B86484646FE484646FE484646FE494747FE4D4D4DFE7A8B8BFE40A2 + CEFE0C94D9FE0D9AE3FE0D9FE9FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE22AAF0FE3AB4F1FE3CB5 + F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5 + F1FE3CB5F1FE3CB5F1FE3F9FCFFE535759FE656363FE6B6A6AFE6C6A6AFE6C6A + 6AFE6C6A6AFE6C6A6AFE696868FE5D5C5CFE477E9AFE3CB5F1FE3CB5F1FE3CB5 + F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE39B3F1FE1EA9 + EFFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA1EDFE0D9EE8FE0D9AE2FE0C93D7FE4A9BBFFE636B6BFE4A48 + 48FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE1A19198300000038000000150000 + 0002000000000000000000000000000000000000000000000000000000000000 + 00001C1B1B46494747FD484646FE494747FF494747FF4A4949FE677070FF6BAC + C3FF0C91D5FF0C98E0FE0D9EE7FF0DA1ECFE0EA2EEFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF26ACF0FE42B7F2FF43B7F2FF43B7 + F2FE43B7F2FF43B7F2FF43B7F2FE43B7F2FF43B7F2FF43B7F2FF43B7F2FE43B7 + F2FF43B7F2FF43B7F2FE43B6F1FF528099FF6A6868FE706F6FFF716F6FFF716F + 6FFE716F6FFF716F6FFF6B6969FE5B5F61FF46A5D5FF43B7F2FE43B7F2FF43B7 + F2FF43B7F2FE43B7F2FF43B7F2FF43B7F2FE43B7F2FF43B7F2FE43B7F2FF41B6 + F2FF21AAF0FE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA2EEFF0DA0EBFE0D9DE7FF0D97DEFF0C90D4FE6C99A9FF575959FF4947 + 47FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE383737CE02010149000000240000 + 0007000000000000000000000000000000000000000000000000000000000000 + 00000F0F0F17474545E9484646FE494747FF494747FF494747FE595D5DFF81A6 + ADFF1894D2FF0C96DCFE0D9CE5FF0DA0EAFE0EA2EEFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF21AAF0FF47B8F2FE49B9F3FF49B9F3FF49B9 + F2FE49B9F3FF49B9F3FF49B9F2FE49B9F3FF49B9F3FF49B9F3FF49B9F2FE49B9 + F3FF49B9F3FF49B9F2FE49B9F3FF4DAFE1FF717070FE757474FF767474FF7574 + 74FE767474FF747373FF6B6A6AFE597380FF4AB8F1FF49B9F2FE49B9F3FF49B9 + F3FF49B9F2FE49B9F3FF49B9F3FF49B9F2FE49B9F3FF49B9F2FE49B9F3FF49B9 + F3FF46B8F2FE1BA7EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0EA2EDFF0D9FEAFE0D9BE4FF0C95DBFF1D95D0FE75888AFF4F4F4FFF4947 + 47FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE474545F91010106E000000340000 + 0010000000010000000000000000000000000000000000000000000000000000 + 0000000000003F3D3DB8484646FE484646FE484646FE484646FE505050FE7A8C + 8DFE41A2CEFE0C93D8FE0D9AE2FE0D9EE8FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA2EEFE0DA2EEFE13A5EFFE47B8F2FE50BCF3FE50BCF3FE50BCF3FE50BC + F3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BC + F3FE50BCF3FE50BCF3FE50BCF3FE5AA7CFFE797777FE7B7979FE7B7979FE7B79 + 79FE7B7979FE777676FE6B6A6AFE5698B9FE50BCF3FE50BCF3FE50BCF3FE50BC + F3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BC + F3FE50BCF3FE41B6F2FE11A4EFFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0DA1ECFE0D9EE8FE0C99E1FE0C92D7FE4B9EC2FE646C6CFE4A4949FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE2E2D2DB4000000430000 + 001D000000050000000000000000000000000000000000000000000000000000 + 00000000000024232360484646FE494747FF494747FF484646FE4A4949FF646C + 6CFF77ADBEFF0C90D4FE0D97DEFF0D9DE6FE0EA0EBFF0EA2EEFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE34B1F1FF58BEF4FF57BEF3FE58BEF4FF58BEF4FF57BE + F3FE58BEF4FF58BEF4FF57BEF3FE58BEF4FF58BEF4FF58BEF4FF57BEF3FE58BE + F4FF58BEF4FF57BEF3FE58BEF3FF6E94A8FF807E7EFE807F7FFF807F7FFF807F + 7FFE807E7EFF797878FF6A7277FE59B7E7FF58BEF4FF57BEF3FE58BEF4FF58BE + F4FF57BEF3FE58BEF4FF58BEF4FF57BEF3FE58BEF4FF57BEF3FE58BEF4FF58BE + F4FF57BEF3FE58BEF4FF2AADF0FF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA2 + EDFF0EA0EAFF0D9CE6FE0D96DDFF1392D2FF6F97A3FE545656FF494747FF4846 + 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF444242F00909095E0000 + 002D0000000D0000000100000000000000000000000000000000000000000000 + 0000000000000C0C0C19484646E9494747FF494747FF484646FE494747FF5456 + 56FF849A9BFF2E9CD1FE0C94DAFF0D9AE3FE0E9FE9FF0EA1EDFF0DA2EEFE0EA3 + EFFF0EA3EFFF0FA3EFFE54BDF3FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1F4FF5EC1 + F4FE5EC1F4FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1F4FF5EC1F4FF5EC1F4FE5EC1 + F4FF5EC1F4FF5EC1F4FE60BDECFF7E888FFF858484FE868484FF868484FF8584 + 84FE848282FF7A7A7AFF688EA1FE5EC1F3FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1 + F4FF5EC1F4FE5EC1F4FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1F4FE5EC1F4FF5EC1 + F4FF5EC1F4FE5EC1F4FF4BBAF2FF0FA3EFFE0EA3EFFF0EA3EFFF0DA2EEFE0EA1 + ECFF0D9EE8FF0D9AE2FE0C93D8FF3B9BC7FF6E7B7CFE4C4B4BFF494747FF4846 + 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF484646FE2423239C0000 + 003D000000190000000300000000000000000000000100000000000000000000 + 000000000000020202013B39399D484646FE484646FE484646FE484646FE4C4B + 4BFE697272FE6DAEC5FE0E91D4FE0C97DEFE0D9DE6FE0DA0EBFE0DA2EDFE0DA2 + EEFE0DA2EEFE1DA8F0FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 + F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 + F4FE65C4F4FE65C4F4FE6EB4D8FE898889FE8B8989FE8B8989FE8B8989FE8A89 + 89FE868585FE7B7A7AFE68B0D5FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 + F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 + F4FE65C4F4FE65C4F4FE5FC1F4FE18A6EFFE0DA2EEFE0DA2EEFE0DA1EDFE0DA0 + EAFE0D9CE5FE0C97DDFE1091D3FE6B9AAAFE595D5DFE494747FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE413F3FE30000 + 0049000000280000000A00000000000000000000000200000000000000000000 + 000000000000000000001A1A1A2E494747FD494747FF484646FE494747FF4947 + 47FF545656FF849C9DFE329DCFFF0C93D8FE0D9AE2FF0D9EE8FF0DA1ECFE0EA2 + EEFF0EA3EFFF2CAEF1FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6DC7F5FF6CC7 + F5FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6DC7F5FF6DC7F5FF6CC7F5FE6DC7 + F5FF6DC7F5FF6CC7F5FE81A5B8FF908F8FFF908F8FFE908F8FFF908F8FFF8F8E + 8EFE898787FF7A8890FF6CC7F5FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6DC7 + F5FF6CC7F5FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6CC7F5FE6DC7F5FF6DC7 + F5FF6CC7F5FE6DC7F5FF6BC6F5FF22AAF0FE0EA2EFFF0EA2EEFF0DA1ECFE0D9E + E7FF0D99E1FF0C93D8FE3E9CC6FF6E7B7CFF4D4D4DFE494747FF494848FF4B4A + 4AFE4D4D4DFF4E4D4DFF4E4D4DFE4E4D4DFF4E4D4DFF4E4D4DFE4E4D4DFF4E4D + 4DFF4D4D4DFE4C4B4BFF4A4949FF494747FE494747FF494747FF484646FE1A19 + 1982000000390000001500000002000000000000000100000000000000000000 + 0000000000000000000000000000484646B7494747FF484646FE494747FF4947 + 47FF4B4A4AFF677070FE77ADBEFF1192D3FE0D96DDFF0D9CE5FF0D9FEAFE0EA1 + EDFF0EA2EEFF32B1F1FE74CAF6FF74CAF6FF74CAF5FE74CAF6FF74CAF6FF74CA + F5FE74CAF6FF74CAF6FF74CAF5FE76C3EBFF889EAAFF8EA0AAFF8FA1AAFE8FA1 + ABFF8FA1ABFF8FA1AAFE94989AFF969595FF969595FE969595FF969595FF9492 + 92FE8A898AFF7AA8BFFF74CAF5FE74CAF6FF74CAF6FF74CAF5FE74CAF6FF74CA + F6FF74CAF5FE74CAF6FF74CAF6FF74CAF5FE74CAF6FF74CAF5FE74CAF6FF74CA + F6FF74CAF5FE74CAF6FF74CAF6FF26ACF0FE0EA2EEFF0EA1ECFF0D9FE9FE0D9B + E4FF0C95DBFF1492D1FE7498A2FF585B5BFF494747FE494747FF4D4E4FFF5A68 + 6DFE68797EFF6B7D82FF6B7D82FE6B7D82FF6B7D82FF6B7D82FE6B7D82FF6B7D + 82FF6A7C81FE647073FF545656FF4A4848FE494747FF494747FF484646FE3735 + 35CA010101480000002300000006000000000000000100000000000000000000 + 000000000000000000000000000048464640484646F8484646FE484646FE4846 + 46FE494747FE525353FE7B8E8EFE4FA7CDFE0C92D6FE0D98DFFE0D9DE7FE0DA0 + EBFE0DA1EDFE2CAEF0FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCD + F5FE7BCDF5FE7BCDF5FE7BCDF5FE7EC5E8FE93979AFE9B9A9AFE9C9B9BFE9C9B + 9BFE9C9B9BFE9C9B9BFE9C9B9BFE9C9B9BFE9C9B9BFE9C9B9BFE9B9A9AFE9796 + 96FE8C8F92FE7DC3E6FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCD + F5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCD + F5FE7BCDF5FE7BCDF5FE78CBF5FE22AAEFFE0DA1EDFE0DA0EAFE0D9DE6FE0C97 + DEFE0D92D5FE56A1C0FE677070FE4C4B4BFE494747FE494747FE515B5EFE66BB + E3FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0 + F6FE7FD0F6FE86BCD6FE646969FE4C4A4AFE484646FE484646FE484646FE4745 + 45F80F0E0E6A000000330000000F000000010000000100000000000000000000 + 000000000000000000000000000048464601535858B1484646FE494747FF4947 + 47FF494747FF4A4848FE5C6161FF87A5A9FE2699D1FF0C94D9FF0C99E1FE0D9E + E8FF0EA0EBFF1AA6EEFE81CFF6FF83CFF7FF83CFF6FE83CFF7FF83CFF7FF83CF + F6FE83CFF7FF83CFF7FF83CFF6FE85C8EAFF9A9EA0FFA1A0A0FFA1A0A0FEA1A0 + A0FFA1A0A0FFA1A0A0FEA1A0A0FFA1A0A0FFA1A0A0FEA1A0A0FFA09F9FFF9998 + 98FE8CA3AFFF83CFF7FF83CFF6FE83CFF7FF83CFF7FF83CFF6FE83CFF7FF83CF + F7FF83CFF6FE83CFF7FF83CFF7FF83CFF6FE83CFF7FF83CFF6FE83CFF7FF83CF + F7FF83CFF6FE83CFF7FF76CAF6FF16A5EEFE0EA0EBFF0D9DE7FF0C99E1FE0C93 + D8FF329ACAFF75898CFE515252FF494747FF484646FE494747FF535B5FFF68BC + E2FE80D1F7FF80D1F7FF82CBEDFE82C8E7FF7FC5E5FF7EC4E4FE7EC4E4FF7EC4 + E4FF7EC4E4FE81B0C6FF616565FF4B4A4AFE494747FF494747FF484646FE4947 + 47FF2E2D2DB4000000420000001D000000050000000000000000000000000000 + 0000000000000000000000000000000000008AAEAE2F484646F2494747FF4947 + 47FF494747FF494747FE4D4D4DFF687171FE79AEBEFF1794D2FF0C95DBFE0D9B + E3FF0D9EE8FF0EA1EBFE6CC6F4FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2F7FF8AD2 + F7FE8AD2F7FF8AD2F7FF8AD2F7FE8CCBEBFF9FA3A5FFA6A5A5FFA6A5A5FEA6A5 + A5FFA6A5A5FFA6A5A5FEA6A5A5FFA6A5A5FFA6A5A5FEA6A5A5FFA4A3A3FF9B9B + 9BFE8DBED8FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2 + F7FF8AD2F7FE8AD2F7FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2F7FE8AD2F7FF8AD2 + F7FF8AD2F7FE8AD2F7FF5DC0F3FF0EA0EBFE0D9EE8FF0D9AE2FF0C94DAFE1D95 + D0FF7298A3FF5A5F5FFE4A4848FF494747FF484646FE494747FF4F5050FF5D8E + A3FE7CCFF6FF80D1F7FF86C7E4FE899DA0FF6E7B7DFF636D6FFE626B6DFF626B + 6DFF616B6CFE5C6263FF515151FF4A4848FE494747FF494747FF484646FE4947 + 47FF434141ED0808085A0000002B0000000B0000000000000000000000000000 + 000000000000000000000000000000000000ABE2E2015E696989484646FE4846 + 46FE484646FE484646FE494747FE515252FE768484FE68ADC7FE0F91D3FE0C96 + DCFE0D9BE4FE0D9EE8FE39B1EFFE8FD4F6FE91D5F7FE91D5F7FE91D5F7FE91D5 + F7FE91D5F7FE91D5F7FE91D5F7FE93CEECFEA3A6A9FEA8A7A7FEA8A8A8FEA8A8 + A8FEA8A8A8FEA8A8A8FEA8A8A8FEA8A8A8FEA8A8A8FEA8A8A8FEA5A4A4FE9CA4 + A8FE92D1F2FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5 + F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5 + F7FE91D5F7FE8DD3F6FE2AACEDFE0D9EE8FE0D9AE3FE0C95DBFE1091D2FE6CA1 + B3FE636B6BFE4C4B4BFE494747FE484646FE484646FE484646FE4A4949FE5659 + 59FE65AAC8FE7ED0F6FE7FD0F6FE89BACFFE6F7879FE535454FE4B4A4AFE4B4A + 4AFE4B4A4AFE4A4949FE494848FE494747FE484646FE484646FE484646FE4846 + 46FE484646FE2121219600000038000000140000000100000000000000000000 + 00000000000000000000000000000000000000000000ADE4E409494747D64947 + 47FF494747FF484646FE494747FF494747FE555757FF7C8E8FFF5BAACAFE0D91 + D4FF0C96DDFF0D9BE4FE11A0E9FF6DC6F3FF99D7F7FE99D7F8FF99D7F8FF99D7 + F7FE99D7F8FF99D7F8FF99D7F7FE9AD0ECFFA3A6A8FFA6A5A5FFA6A5A5FEA6A5 + A5FFA6A5A5FFA6A5A5FEA6A5A5FFA6A5A5FFA6A5A5FEA5A5A5FFA4A3A3FF9DBA + C9FE99D7F8FF99D7F8FF99D7F7FE99D7F8FF99D7F8FF99D7F7FE99D7F8FF99D7 + F8FF99D7F7FE99D7F8FF99D7F8FF99D7F7FE99D7F8FF99D7F7FE99D7F8FF99D7 + F8FF99D7F7FE5DBFF1FF0F9FE8FF0D9AE3FE0C96DBFF1092D3FF5FA2BCFE6973 + 73FF4E4E4EFF494747FE494747FF494747FF484646FE494747FF494747FF4B4A + 4AFE596467FF6BB8DAFF7FD0F6FE80D0F6FF88ABBAFF656C6CFE4E4D4DFF4947 + 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF3F3D3DDD000000430000001E0000000500000000000000000000 + 000000000000000000000000000000000000000000000000000088ABAB414A49 + 49F3494747FF484646FE494747FF484646FE4A4949FF595C5CFF819597FE50A7 + CCFF0E92D4FF0C96DCFE0D9BE3FF22A6EAFF89D0F5FEA1DAF8FFA1DAF8FFA0DB + F8FEA1DBF8FFA1DBF8FFA0DBF8FEA1D1E9FFA5A6A7FFA5A5A5FFA5A5A5FEA5A5 + A5FFA5A5A5FFA5A5A5FEA5A5A5FFA5A5A5FFA5A5A5FEA5A5A5FFA5A5A5FFA1D2 + EAFEA1DBF8FFA1DBF8FFA0DBF8FEA1DBF8FFA1DBF8FFA0DBF8FEA1DBF8FFA1DB + F8FFA0DBF8FEA1DBF8FFA1DBF8FFA0DBF8FEA1DBF8FFA0DBF8FEA1DAF8FFA0DA + F8FF81CDF4FE17A2E8FF0D9AE3FF0C96DCFE1092D3FF58A1BEFF6F7C7DFE5051 + 51FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4947 + 47FE4E4D4DFF5C747CFF72C5EAFE80D1F7FF82CDF1FF849DA6FE5C6161FF4C4B + 4BFF494747FE494747FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FD0E0E0E60000000270000000800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006777 + 777C484646FE484646FE484646FE484646FE494747FE4B4A4AFE5A5E5EFE8299 + 9AFE55A9CCFE0D90D4FE0C96DBFE0D9AE2FE2AA9E9FE98D6F6FEA7DCF8FEA7DD + F8FEA7DDF8FEA7DEF8FEA7DEF8FEA8DBF5FEA8D1E5FEA8D0E4FEA8D0E4FEA8D0 + E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D1E5FEA7DE + F8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DE + F8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DDF8FEA7DDF8FEA7DCF8FE8CD1 + F4FE22A5E8FE0D99E1FE0C95DAFE0E90D3FE5DA3BFFE707E7FFE525353FE4947 + 47FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE494747FE505151FE5E8594FE7ACEF5FE80D0F6FE85C9E9FE7D8A8DFE575A + 5AFE4A4949FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE242323970000002E0000000C00000000000000000000 + 000000000000000000000000000000000000000000000000000000000000B8F6 + F6065B6363A9484646FE494747FF484646FE494747FF494747FF4B4949FE595D + 5DFF7E9091FF68ADC8FE1392D2FF0C94DAFF0C99E0FE26A6E8FF8BD0F4FFAFDF + F8FEAFDFF9FFAFE0F9FFAFE0F9FEAFE0FAFFAFE0FAFFAFE0FAFFAFE0F9FEAFE0 + FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0 + F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0 + FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFDFF9FFAFDFF8FE7FCCF3FF1EA2 + E6FF0C98DFFE0C94D9FF1994D1FF69A4B9FE6D7878FF515252FF494747FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF4A4848FF535555FE639AB1FF7DCFF5FF80D0F6FE87C1DCFF7480 + 81FF545555FE4A4848FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE343333C5000000320000000E00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000A2D3D311464A4DCE494747FF484646FE494747FF494747FF494747FE4B49 + 49FF565959FF768585FE74AEC1FF2398D1FF0C92D7FE0D97DDFF1AA0E4FF6BC3 + F0FEAFDFF8FFB6E2F9FFB5E2F9FEB6E3FAFFB6E3FAFFB6E3FAFFB5E3F9FEB6E3 + FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3FAFFB5E3 + F9FEB6E3FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3 + FAFFB5E3F9FEB6E3FAFFB6E2F9FFB5E2F8FEAADDF7FF61BFEEFE149DE3FF0C96 + DDFF0C92D6FE2998CEFF729FADFF687272FE4F5050FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF494747FF4B4949FE575E5FFF73B2CDFF91D7F8FE8FD6F7FF91B8 + C9FF6B7474FE4F5050FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE3F3E3EDB040404370000000E00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001B79A921464A4DDE484646FE484646FE484646FE484646FE4947 + 47FE4A4848FE525353FE6D7878FE83A9B1FE44A4CFFE0C90D4FE0C94DAFE0D98 + DFFE37ACE8FE8CD0F3FEBBE4F9FEBDE5F9FEBDE5F9FEBDE5FAFEBDE5FAFEBDE6 + FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6 + FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE5FAFEBDE5 + FAFEBDE5F9FEBDE5F9FEB9E3F8FE81CCF2FE2EA8E7FE0D98DFFE0C94D9FE0F91 + D3FE49A2C9FE7A969BFE606767FE4D4D4DFE494747FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE494747FE4C4C4CFE5F6C70FE95CDE6FEA9E0F9FEA8DE + F7FE94ABB4FE5F6565FE4C4B4BFE494747FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE444242E6060606390000000C00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000001A7BAC29454B4FDD494747FF494747FF484646FE4947 + 47FF494747FF494747FE4E4D4DFF5E6464FF809393FE71AEC4FF2799D1FF0C91 + D5FE0C95DBFF0E99E0FF34ABE7FE80CBF1FFB3E0F7FFC4E7FAFFC3E7F9FEC4E7 + FAFFC4E7FBFFC3E8FAFEC4E8FBFFC4E8FBFFC3E8FAFEC4E8FBFFC4E8FBFFC3E8 + FAFEC4E8FBFFC4E8FBFFC3E8FAFEC4E8FBFFC4E7FBFFC3E7FAFEC4E7FAFFC4E7 + FAFFAEDEF7FE76C7F0FF2EA8E6FF0C98DFFE0C95DAFF0C91D4FE2E9ACEFF71A4 + B4FF728080FE565858FF4B4A4AFF494747FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF494747FF484646FE494747FF4E4E4EFF677B82FEA6DCF4FFB0E1 + FAFFAEDDF3FE808C8EFF555757FF494747FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE434141E1060606310000000800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000001A7BAC29464A4DDC494747FF484646FE4947 + 47FF494747FF484646FE494747FF4B4949FF545656FE6C7777FF83A2A6FF60AB + C8FE2197D1FF0D92D5FF0C94DAFE0E98DEFF1EA1E3FF49B4EAFF83CCF2FEAADD + F6FFBEE5F9FFC8E9FAFECAEAFAFFCAEAFAFFCAEAFAFECAEAFBFFCAEAFBFFCAEA + FAFECAEAFBFFCAEAFAFFCAEAFAFEC7E9FAFFBDE5F8FFA5DBF6FE7CC9F1FF45B2 + E9FF1A9EE2FE0D97DEFF0C94D9FF0E92D5FE2798CFFF61A5BFFE7A9093FF6168 + 68FF4F5050FE4A4848FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4A49 + 49FE4B4A4AFF4B4949FF494848FE494747FF494848FF525252FE80A3B1FFB4E3 + FAFFB5E4FAFE9EB8C2FF606666FF4B4949FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE3D3C3CD3030303220000000500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001B79A921464A4DCA484646FE4846 + 46FE484646FE484646FE484646FE494747FE494747FE4D4C4CFE595D5DFE717D + 7DFE85A5AAFE65ADC7FE2C9CD1FE0C90D3FE0C93D7FE0C95DBFE0C97DDFE119B + E1FE25A4E5FE3EAEE8FE58BAECFE6BC2EFFE79C8F0FE82CCF2FE86CDF2FE81CB + F2FE78C7F0FE69C1EEFE55B9EBFE3AADE8FE23A3E4FE0F99E0FE0C97DDFE0C95 + DAFE0C92D7FE0E91D3FE309CD0FE68A7BEFE7C9699FE677070FE535454FE4B4A + 4AFE494747FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE494747FE4D4C4CFE575A + 5AFE616767FE5D6363FE525353FE4A4848FE494747FE4A4949FE637175FEAFDE + F2FEBBE6FAFEAECDDBFE6A7171FE4C4B4BFE484646FE484646FE484646FE4846 + 46FE484646FE484646FE343333B2000000130000000200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000001A7BAC0F3F515BA14947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494848FF4D4C + 4CFE585B5BFF6B7575FF84999AFE7CACBAFF54A7CAFF2C9CD1FF1192D2FE0C91 + D5FF0C93D8FF0C94D9FE0D95DBFF0D96DCFF0C96DDFE0D97DDFF0D97DDFF0C96 + DDFE0D96DDFF0D96DCFF0C95DBFE0C94D9FF0C93D7FF0C91D5FE1492D2FF2F9C + CFFF57A5C5FE7AA4B0FF7B8C8CFF626969FE525454FF4B4A4AFE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF555C5FFFA2D0 + E4FEBBE2F5FFAECEDDFF6B7272FE4D4D4DFF494747FF494848FE5C6263FFB0D9 + EBFFC2E8FBFEB4D1DEFF6C7474FF4C4C4CFE494747FF494747FF484646FE4947 + 47FF494747FF484646FE21202070000000090000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E87C4053859 + 6A70484849EF484646FE494747FF494747FF484646FE494747FF494747FF4947 + 47FE494747FF4C4B4BFF535555FE606666FF717E7EFF80979AFF7FA9B3FE6AAA + C2FF51A6CBFF3AA0CEFE2799D0FF1C96D2FF1894D2FE1594D3FF1593D3FF1694 + D3FE1894D2FF1D96D2FF2999CFFE3CA0CDFF52A5C8FF6BA7BDFE7CA1AAFF7A8E + 90FF6A7474FE5B5F5FFF505151FF4A4949FE494747FF494747FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF55595AFFA9CF + DFFEC8EBFCFFC3E3F3FF869395FE585C5CFF4C4C4CFF4F4F4FFE718389FFC1E6 + F7FFC8EBFBFEB3CDD8FF686F6FFF4C4B4BFE494747FF494747FF484646FE4947 + 47FF494747FF484646F20909091F000000020000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000088B0B236535858CA484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE494747FE4A4848FE4C4C4CFE525353FE5A5F5FFE656E + 6EFE707C7CFE7B8C8CFE829899FE839FA3FE81A2A9FE7FA4ADFE7EA4ADFE7EA3 + ACFE80A1A7FE829DA0FE7F9495FE778686FE6D7777FE616868FE575A5AFE5050 + 50FE4B4A4AFE494747FE494747FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE494747FE4F5050FE8FAD + B9FECEEDFBFECEECFBFEB6CED8FE7A8787FE656D6DFE6E7B7DFEB2D2DFFECEED + FBFECEEDFBFE9FB1B7FE5D6262FE4A4949FE484646FE484646FE484646FE4846 + 46FE484646FE3130309400000006000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000ADE5E502768E8E724C4C4CE6484646FE494747FF494747FF4846 + 46FE494747FF494747FF484646FE494747FF494747FF494747FF494747FE4A48 + 48FF4B4A4AFF4D4D4DFE505050FF525454FF545656FE565858FF565959FF5558 + 58FE535555FF525252FF4F4F4FFE4C4B4BFF4B4949FF494747FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF4B4949FF5F68 + 6AFEBCDCEAFFD4EFFCFFD4EFFCFECEE9F6FFC2DEEAFFCEECF9FED4EFFCFFD4EF + FCFFBFD7E2FE717A7AFF515252FF494747FE494747FF494747FF484646FE4947 + 47FF444242DC0B0A0A1D00000001000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000004A49491C4846468E494747F0494747FF4846 + 46FE494747FF494747FF484646FE494747FF494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF494747FE494747FF494747FF4947 + 47FE494747FF494747FF494747FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4E4D + 4DFE697578FFB0CBD5FFD2EBF7FED9F1FCFFDAF1FDFFD9F0FCFED2EAF6FFB4CA + D2FF798385FE565858FF4A4949FF494747FE494747FF494747FF484646FE4846 + 46F31F1F1F4C0000000100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000484646244846468A4846 + 46ED484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4947 + 47FE4D4D4DFE595C5CFE707D80FE859395FE8A979AFE869497FE768284FE6167 + 67FE525454FE4B4949FE494747FE484646FE484646FE484646FE484646FC2D2C + 2C63010101020000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004846 + 460B49474765494747BD484646F6494747FF494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF4A4848FF4C4B4BFE4E4E4EFF505050FF4F4F4FFE4D4D4DFF4B49 + 49FF494747FE494747FF494747FF484646FE494747FF464444E1302F2F4C0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000049474704484646224947476E494747B4494747E5484646F94947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 + 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 + 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 + 47FF484646FE494747FF494747FE484646EF413F3F943837371D000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004846460F484646354846 + 46604846468B484646AE484646CD484646E4484646F3484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 + 46FC484646E2484646B24846466E484646210000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFF + FFFF80000FFFFFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFFFE00000003FFFFF + FFFFFFFFFF000000000FFFFFFFFFFFFFFE0000000003FFFFFFFFFFFFF8000000 + 0000FFFFFFFFFFFFE000000000007FFFFFFFFFFFC000000000001FFFFFFFFFFF + 8000000000000FFFFFFFFFFE00000000000007FFFFFFFFFC00000000000003FF + FFFFFFF800000000000001FFFFFFFFF000000000000000FFFFFFFFF000000000 + 0000007FFFFFFFE0000000000000003FFFFFFFC0000000000000001FFFFFFF80 + 000000000000001FFFFFFF80000000000000000FFFFFFF000000000000000007 + FFFFFE000000000000000007FFFFFE000000000000000003FFFFFC0000000000 + 00000003FFFFFC000000000000000001FFFFF8000000000000000001FFFFF800 + 0000000000000000FFFFF0000000000000000000FFFFF0000000000000000000 + 7FFFF00000000000000000007FFFE00000000000000000007FFFE00000000000 + 000000003FFFE00000000000000000003FFFE00000000000000000001FFFC000 + 00000000000000001FFFC00000000000000000000FFFC0000000000000000000 + 0FFFC00000000000000000000FFFC000000000000000000007FFC00000000000 + 0000000007FFC000000000000000000003FFC000000000000000000003FFC000 + 000000000000000001FFC000000000000000000001FFC0000000000000000000 + 01FFC000000000000000000000FFC000000000000000000000FFC00000000000 + 00000000007FC0000000000000000000007FC0000000000000000000003FC000 + 0000000000000000003FE0000000000000000000003FE0000000000000000000 + 001FE0000000000000000000001FE0000000000000000000000FF00000000000 + 00000000000FF00000000000000000000007F00000000000000000000006F000 + 00000000000000000006F80000000000000000000002FC000000000000000000 + 0002FC0000000000000000000000FC0000000000000000000001FE0000000000 + 000000000001FE0000000000000000000000FF0000000000000000000000FF80 + 00000000000000000000FFC000000000000000000000FFC00000000000000000 + 0000FFE000000000000000000000FFF000000000000000000000FFF800000000 + 000000000000FFFC00000000000000000000FFFE00000000000000000000FFFF + 00000000000000000001FFFF80000000000000000001FFFFE000000000000000 + 0003FFFFF0000000000000000003FFFFFC000000000000000007FFFFFF000000 + 00000000000FFFFFFFC0000000000000003FFFFFFFF0000000000000007FFFFF + FFFF00000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28000000480000009000 + 0000010020000000000060540000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003737370137373702373737043737370637373707373737073737 + 3707373737063737370537373703373737010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000001000000050000 + 000B000000130000001B00000023000000290000002E00000030000000310000 + 00310000002F0000002C000000260000001E000000160000000E000000070000 + 0002000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000040000000D0000001A000000290000 + 00370000004200000049030303520C0C0C64100F0F7110101073101010741010 + 10740E0D0D6B0707075B000000500000004C000000460000003B0000002F0000 + 0020000000110000000600000001000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000028272701070707060000001300000026000000390303034E121111742423 + 23A1333232C7424040E5474545F9484646FC484646FD484646FD484646FD4846 + 46FD484646FC474545FA444242EE383636D12A2929AF171616840606065F0000 + 004C0000003F0000002D000000190101010A1F1E1E0200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000D0C + 0C04000000120000002900000040121111702D2C2CB6424040E9484646FE4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF454343F23332 + 32C7181717860101015400000046000000320000001A03030308242323010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000001A1A1A020000000D0000 + 0024020202421B1A1A873C3A3AD9484646FE494747FF484646FE494747FF4846 + 46FE494747FF494747FF484646FE494747FF484646FE494747FF484646FE4947 + 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4846 + 46FE494747FF424040E92322229F0606065E000000460000002E000000140808 + 0804000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001014140500000017000000341716 + 16783C3A3AD9484646FE494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF4A4949FF4C4B4BFF4D4D4DFF4E4E4EFF4E4E4EFF4D4D + 4DFF4C4B4BFF4A4949FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF424040EA1F1E1E97020202540000003D0000 + 0020010101090000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000040505080000002009090950323131BE4846 + 46FE494747FF484646FE494747FF484646FE494747FF494747FE4C4C4CFF5456 + 56FE606666FF697879FF68848CFE638C9AFF6091A4FE5E94A9FF5E93A9FE5E90 + A4FF618A9AFE66838CFF687779FF5F6565FE545656FF4C4B4BFE494747FF4947 + 47FE494747FF484646FE494747FF484646FE494747FF3B3A3AD9100F0F740000 + 00480000002B0000000F546B6B01000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000505050A0000002718171776424141EA494747FF4947 + 47FF494747FF494747FF494747FF4B4A4AFF545656FF657071FF6A8B95FF5598 + B4FF3F9DC9FF2F9DD4FF2B9FD9FF2CA0DCFF2EA2DDFF30A3DEFF30A3DEFF2EA2 + DDFF2CA0DCFF2B9ED9FF2C9CD4FF399BCAFF4C95B5FF638895FF636E70FF5355 + 55FF4B4949FF494747FF494747FF494747FF494747FF494747FF464444F62322 + 229E010101500000003300000012515151020000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000606060A0101012B25242498484646FA494747FF484646FE4947 + 47FF494747FF4B4A4AFE575A5AFF6C7F82FE5A98B1FF399ECEFE289DD9FF2EA3 + DFFE33A7E3FF35AAE5FF38ACE7FE3AAEE9FF3BAEEAFE3CAFEAFF3CAFEAFE3CAF + EAFF3BAEE9FE39ADE8FF37ABE6FF34A8E3FE30A4DFFF279DD9FE319BCFFF4F93 + B0FE667C81FF565959FE4B4949FF494747FE494747FF494747FF484646FE4846 + 46FE323030C00404045800000037000000140327390200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000404040A0101012C2E2D2DAD484646FD494747FF494747FF494747FF4948 + 48FF525454FF6A7B7EFF599AB5FF2E9DD3FF2AA0DDFF2FA6E3FF34AAE7FF37AD + EAFF39B0ECFF3BB1EEFF3DB3EFFF3EB4EFFF3EB4F0FF3FB4F0FF3FB4F0FF3FB4 + F0FF3FB4EFFF3EB3EFFF3EB2EEFF3CB1ECFF3AAFEBFF36ACE8FF32A7E4FF2BA1 + DEFF289AD4FF4B95B5FF65787CFF525454FF494848FF494747FF494747FF4947 + 47FF494747FF393737D30606065D0000003700000013526E6E01000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000D12 + 1206010101282E2D2DAC484646FE494747FF484646FE494747FF4B4A4AFE5F65 + 65FF6994A3FF349DCFFE269FDCFF2DA6E3FE31AAE8FF35AEECFE38B0EEFF39B2 + EFFE3AB3F0FF3BB4F1FF3BB4F1FE3CB4F1FF3CB4F1FE3DB5F2FF3DB5F1FE3DB5 + F2FF3DB4F1FE3EB5F1FF3DB5F1FF3DB4F1FE3CB3F0FF3BB2EEFE38B0ECFF35AC + E9FE30A7E4FF28A0DDFE2A99CFFF5A8EA3FE5D6363FF4B4A4AFF494747FE4947 + 47FF484646FE494747FF3C3B3BDB0505055B000000350000000F5E7E7E010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000263333040000 + 001E2D2C2CA6484646FE494747FF494747FF494747FF4E4E4EFF6A7778FF539D + BDFF239BD8FF28A2E1FF2DA8E7FF31ADECFF33AFEEFF35B1F0FF36B2F1FF37B2 + F1FF37B2F2FF37B3F2FF38B3F2FF38B3F2FF38B3F2FF39B3F2FF39B3F2FF39B3 + F2FF39B3F2FF39B3F2FF3AB4F2FF3AB4F2FF3AB4F2FF39B3F1FF39B3F0FF38B1 + EFFF36AFEDFF31ABE9FF2BA5E2FF229BD9FF4196BDFF647478FF4E4D4DFF4947 + 47FF494747FF494747FF494747FF393838D4050505580000002E0304040B0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000526E6E0100000014201F + 1F82484646FE494747FF494747FF494747FF505050FF6F8285FF419DC7FF219C + DBFF27A4E4FF2BA9EAFF2EADEDFF30AEEFFF31B0F0FF32B0F1FF32B0F1FF32B0 + F1FF33B1F1FF33B1F1FF33B1F1FF34B1F1FF34B1F1FF34B1F1FF34B1F1FF35B1 + F1FF35B2F2FF36B2F2FF36B2F2FF36B2F2FF36B2F2FF37B2F2FF37B2F2FF37B2 + F1FF36B1F0FF34AFEEFF31ACEBFF2BA7E6FF239EDDFF3197C8FF657D83FF4F50 + 50FF494747FF494747FF494747FF494747FF333232C40000004B000000240E11 + 1105000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000B131313584745 + 45F7484646FE494747FF494747FE505151FF70878CFE359CCDFF1F9CDDFE24A4 + E6FF28A9EBFF2AACEEFE2BADF0FF2CAEF0FE2DAFF1FF2DAFF0FE2DAFF1FF2EAF + F0FE2EAFF1FF2EAFF1FF2EAFF0FE2FAFF1FF2FAFF0FE2FB0F1FF30B0F0FE30B0 + F1FF30B0F0FE30B0F1FF31B0F1FF31B0F0FE31B0F1FF32B0F1FE32B0F1FF32B0 + F1FE32B0F1FF32B0F0FE31AFEFFF2EACECFE29A7E7FF239FDFFF2797CEFE6481 + 8AFF505050FE494747FF484646FE494747FF484646FE262525A4000000420000 + 00181B1A1A020000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001315150405040428413F3FDF4947 + 47FF494747FF494747FF4E4E4EFF6F8285FF379CCCFF1C9CDDFF21A3E6FF25A8 + ECFF27ABEFFF27ACF0FF28ACF1FF28ADF1FF28ADF1FF28ADF1FF29ADF1FF29AD + F1FF29ADF1FF29ADF1FF2AADF1FF2AADF1FF2AAEF1FF2BAEF1FF2BAEF1FF2BAE + F1FF2BAEF1FF2CAEF1FF2CAEF1FF2CAEF1FF2DAEF1FF2DAFF1FF2DAFF1FF2DAF + F1FF2EAFF1FF2EAFF1FF2EAFF0FF2DAEEFFF2BABEDFF27A7E8FF219EDFFF2796 + CDFF647D83FF4D4D4DFF494747FF494747FF494747FF474545F9121212770000 + 00330000000B0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000102D2C2CA0494747FF4947 + 47FF494747FE4B4A4AFF6B7778FE439EC7FF199ADBFE1DA2E6FF21A7EBFE22A9 + EEFF23AAF0FF23ABF0FE24ABF0FF24ABF0FE24ABF0FF24ABF0FE25ABF0FF25AB + F0FE25ACF0FF26ACF0FF26ACF0FE26ACF1FF26ACF0FE26ACF1FF27ACF0FE27AC + F1FF27ACF0FE27ACF1FF28ADF1FF28ADF0FE28ADF1FF3990BDFE3698CAFF2AAB + EDFE29ADF1FF29ADF0FE2AADF1FF29ADF0FE29ACEFFF28AAECFF24A5E7FE1E9D + DEFF2F96C8FE647376FF4B4A4AFE494747FF484646FE494747FF3E3D3DE00303 + 034F000000201211110300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000511111148474545F7494747FF4947 + 47FF494848FF5E6465FF589FBBFF1697D9FF199FE4FF1CA5EAFF1EA8EEFF1FA0 + E2FF2F6581FF3D708AFF42748EFF42748EFF42748EFF3B7D9FFF21A9EEFF21AA + F0FF21AAF0FF22AAF0FF22AAF0FF22AAF0FF22AAF0FF23ABF0FF23ABF0FF23AB + F0FF23ABF0FF24ABF0FF24ABF0FF24ABF0FF26A7EAFF535D63FF595959FF5264 + 6EFF4180A1FF2F9ED7FF26ABEFFF26ACF0FF26ACF0FF26ABEFFF24A8ECFF20A3 + E6FF199ADBFF4194BBFF5D6363FF494747FF494747FF494747FF484646FE2524 + 24A1000000390000000E00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000001010110373636BF484646FE494747FF4947 + 47FF525454FE7096A2FF1996D5FE169CE1FF18A3E9FE1AA6EEFF1AA7EFFE1BA7 + EFFF285C77FF434242FE515050FF535252FE545252FF535152FE2B8EC1FF1DA8 + EFFE1DA8F0FF1DA8F0FF1DA8EFFE1EA9F0FF1EA9EFFE1EA9F0FF1EA9EFFE1FA9 + F0FF1FA9EFFE1FA9F0FF20A9F0FF20A9EFFE3288B4FF565454FE575555FF5755 + 55FE575555FF575657FE4B6979FF3986AEFE27A2E1FF22AAEFFF22A9EEFE20A6 + EBFF1BA0E4FE1796D7FF5B8DA1FE515252FF494747FE494747FF494747FF4442 + 42F10908085A0000002016161603000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000031615154F484646FC494747FF494747FF4B49 + 49FF6D7B7DFF359BCCFF1298DDFF15A0E7FF16A4EDFF17A6EFFF17A6F0FF17A6 + F0FF1998D9FF32373AFF494747FF504E4EFF514F4FFF514F4FFF465D6AFF1BA3 + E9FF19A7F0FF19A7F0FF19A7F0FF1AA7F0FF1AA7F0FF1AA8F0FF1AA7F0FF1AA8 + F0FF1BA8F0FF1BA8F0FF1BA8F0FF1CA7EEFF446272FF545252FF545252FF5452 + 52FF545252FF545353FF555353FF555353FF525659FF40697FFF2689BCFF1DA7 + EDFF1BA3E9FF179CDFFF2295CEFF65767AFF4B4949FF494747FF494747FF4947 + 47FF282727A8000000340202020A000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000B363434B6494747FF484646FE494747FF5658 + 58FF659EB3FE1094D7FF119CE3FE13A2EAFF14A4EEFE14A5EFFF15A5EFFE15A5 + EFFF15A5EFFF1F6487FE3B3A3AFF4C4A4AFE4E4C4CFF4E4C4CFE4E4C4DFF2D7E + A9FE16A6F0FF16A6F0FF16A6EFFE16A6F0FF17A6EFFE17A6F0FF17A6EFFE17A6 + F0FF17A6EFFE18A6F0FF18A7F0FF2294CEFE4E4F50FF514F4FFE514F4FFF514F + 4FFE514F4FFF514F4FFE525050FF525050FE514F4FFF454444FF266A8DFE1AA7 + EFFF19A5ECFE16A0E6FF1396DAFE4B92B1FF555858FE494747FF494747FF4846 + 46FE434242ED0505054D00000017252424010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000010D0D0D31484646F9494747FF494747FF4B4A4AFF707F + 7FFF2B9AD0FF0E98DEFF109FE8FF11A2EDFF11A4EEFF11A4EFFF12A4EFFF12A4 + EFFF12A4EFFF139BE0FF293841FF434141FF4C4A4AFF4C4A4AFF4D4B4BFF4751 + 57FF189DE1FF13A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5 + EFFF15A5EFFF15A5EFFF15A5EFFF356D8BFF4E4C4CFF4F4D4DFF4F4D4DFF4D4B + 4BFF474545FF464545FF4C4A4AFF4F4D4DFF4C4A4AFF383A3CFF1996D7FF17A6 + F0FF16A5EEFF15A2EAFF129AE1FF1C94D0FF657A7FFF4A4949FF494747FF4947 + 47FF484646FE1D1C1C8C0000002A0A0A0A060000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000327262684494747FF494747FF494747FF535555FF6B9D + AEFF0C92D7FF0E9BE3FF0FA0EBFF0FA2EEFF0FA3EFFF0FA3EFFF10A3EFFF10A4 + EFFF10A4EFFF10A4EFFF186E9AFF353434FF474545FF4A4848FF4A4848FF4A48 + 48FF307091FF11A4EFFF11A4EFFF11A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4 + EFFF12A4EFFF12A4EFFF159FE6FF464D51FF4C4A4AFF4C4A4AFF4C4A4AFF4544 + 44FF313030FF2C2A2AFF363434FF403E3EFF3F3E3EFF265065FF14A5EFFF14A5 + EFFF14A5EEFF13A2ECFF109DE5FF0E94D9FF5192ADFF525353FF494747FF4947 + 47FF494747FF373535CD0000003E000000110000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000101010A403E3ED2484646FE494747FF494747FE666F70FF3E9E + CAFF0C96DCFE0D9DE7FF0EA1EDFE0EA2EEFF0EA2EEFE0EA3EFFF0EA2EEFE0EA3 + EFFF0EA3EFFF0EA2EEFE0F9FE9FF233B48FE3E3C3CFF494747FE4A4848FF4947 + 47FE464A4DFF1993D1FF0FA3EEFE0FA3EFFF0FA3EEFE0FA3EFFF0FA3EEFE10A3 + EFFF10A3EEFE10A3EFFF257CA9FF494747FE4A4848FF4A4848FE494747FF3A39 + 39FE1B658CFF16587AFE1C2B33FF232323FE262525FF167DB2FF12A4EEFE12A4 + EFFF11A4EEFE10A2EDFF0F9FE8FE0D97DEFF2696CCFE636B6BFF494747FF4846 + 46FE494747FF484646FC0E0E0E68000000231414140300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000C0C0C2B484646F7494747FF494747FF4C4B4BFF758E93FF1995 + D3FF0D99E1FF0D9FEAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF1379ADFF303030FF454343FF494747FF4947 + 47FF494747FF356178FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0FA1EDFF395969FF494747FF4A4848FF494747FF454343FF2E37 + 3DFF109BE2FF0FA3EFFF0F9BE2FF1371A2FF154964FF109EE7FF0FA3EFFF0FA3 + EFFF0FA3EFFF0FA2EEFF0EA0EBFF0D9AE3FF0D92D5FF668690FF4C4B4BFF4947 + 47FF494747FF494747FF2D2C2CB4000000370101010C00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000201F1F63494747FF484646FE494747FF535454FE689EB2FF0C93 + D7FF0D9BE4FE0EA1EBFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA1ECFE1E455AFF3B3939FE474545FF4846 + 46FE494747FF484646FF1C88C0FE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 + EFFF0DA2EEFE188FCCFF464647FF494747FE494747FF484646FE3E3C3CFF1E59 + 77FE0EA3EFFF0EA2EEFE0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2EEFE0EA3 + EFFF0EA2EEFE0EA2EEFF0DA1ECFE0D9DE6FF0C94DAFE4D92B0FF525454FF4846 + 46FE494747FF484646FE444242F1070707550000001C1F1E1E02000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000067676701312F2F94494747FF494747FF494747FF5E6363FF4EA2C5FF0C95 + DBFF0D9DE7FF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1186C2FF2C2E2FFF434141FF4846 + 46FF494747FF494747FF3B5766FF0F9FE9FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF2C6B8CFF484646FF494747FF494747FF464444FF343435FF1285 + BFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA2EDFF0D9EE8FF0D97DDFF3396C4FF5D6262FF4947 + 47FF494747FF494747FF494747FE222121980000003001010108000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000067676703393737BE494747FF484646FE494747FF6B7575FE349ECFFF0D97 + DEFF0D9EE8FE0EA2EDFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA2EEFF1B516CFE383737FF4745 + 45FE494747FF494747FF484646FE247CA9FF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 + EFFF0F9EE7FE414B52FF494747FF484646FE484646FF424040FE26404DFF0EA1 + EDFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0DA2EEFE0EA3EFFF0DA2EEFE0D9FE9FF0D99E0FE1E94CFFF657274FF4947 + 47FE494747FF484646FE494747FF3F3D3DE201010145000000162A2929010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000069696907464444DC494747FF494747FF4A4949FF778787FF1E97D2FF0D99 + E0FF0E9FEAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1090D2FF292F33FF413F + 3FFF484646FF494747FF494747FF424E55FF119CE2FF0EA3EFFF0EA3EFFF0EA3 + EFFF1F81B4FF474646FF494747FF494747FF484646FF3A3838FF186B95FF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0EAFF0D9AE2FF1393D4FF677F85FF4A48 + 48FF494747FF494747FF494747FF484646FE1717177D000000290B0B0B050000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000069696909484646F0494747FF484646FE4C4B4BFF7B9396FE1293D4FF0D9A + E2FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE185D80FF3534 + 34FE464444FF494747FF484646FE484646FF2C7093FE0EA3EFFF0DA2EEFE0EA2 + EEFF345E75FE484646FF494747FF484646FE454343FF2F3437FE1094D8FF0DA2 + EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA0EBFF0D9BE3FE0D92D6FF648793FF4B4A + 4AFE494747FF484646FE494747FF484646FE353434C90000003D000000100000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00006969690B484646FE494747FF494747FF4D4D4DFF78979FFF0F92D5FF0D9A + E3FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0F98DEFF2534 + 3BFF3F3E3EFF484646FF494747FF494747FF45494DFF1693D4FF0EA3EFFF1397 + DBFF43474AFF494747FF494747FF484646FF3F3D3DFF205069FF0EA2EEFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1ECFF0D9BE5FF0C92D7FF608C9DFF4C4B + 4BFF494747FF494747FF494747FF494747FF474545F90E0E0E67000000211414 + 1403000000000000000000000000000000000000000000000000000000000000 + 00006969690B494747FF494747FF494747FF4E4E4EFF769AA3FF0E92D5FF0D9A + E3FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF166A + 96FF333232FF454444FF494747FF494747FF484646FF34637BFF0EA3EFFF227C + AAFF474545FF494747FF494747FF474545FF363536FF147CB2FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1ECFF0D9CE5FF0C93D7FF5E8EA1FF4D4C + 4CFF494747FF494747FF494747FF494747FF494747FF2B2929B0000000350100 + 000B000000000000000000000000000000000000000000000000000000000000 + 00006969690B484646FE494747FF484646FE4E4E4EFF7799A2FE0E92D5FF0D9A + E3FF0DA0EBFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0E9F + E9FE223A46FF3D3C3CFF484646FE494747FF484646FE474748FF1D89C1FE3561 + 77FF484646FE494747FF494747FF434141FE293942FF0EA0EAFE0EA3EFFF0DA2 + EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA1ECFF0D9CE5FE0C93D7FF5E8EA0FF4D4C + 4CFE494747FF484646FE494747FF484646FE494747FF464444F30504044F0000 + 001B1F1E1E010000000000000000000000000000000000000000000000000000 + 00006969690A484646FE494747FF494747FF4D4C4CFF7A989EFF0F92D5FF0D9A + E2FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF1478ABFF302F2FFF454343FF484646FF494747FF494747FF3E5866FF454B + 4FFF494747FF494747FF484646FF3C3A3AFF1B6185FF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA2EFFF0EA1ECFF0D9BE4FF0C92D7FF628D9CFF4C4B + 4BFF494747FF494747FF494747FF494747FF494747FF494747FF201F1F940000 + 002F050505070000000000000000000000000000000000000000000000000000 + 000069696907484646F0494747FF484646FE4C4B4BFF7C9295FE1493D4FF0D9A + E1FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 + EEFE10A1EBFF25485BFF434141FE504F4FFF525151FE535151FF535151FE5351 + 51FF525050FE504E4EFF4B4949FF333638FE118ECDFF0DA2EEFE0EA3EFFF0DA2 + EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA0EBFF0D9BE3FE0E92D6FF678892FF4B4A + 4AFE494747FF484646FE494747FF484646FE494747FF484646FE3E3C3CDE0202 + 0246000000152928280100000000000000000000000000000000000000000000 + 000069696904484646DB494747FF494747FF4A4949FF768586FF2499D2FF0D98 + E0FF0E9FE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF11A4EFFF1BA7EFFF22AA + F0FF26ACF0FF2992C7FF434243FF565555FF5B5959FF5B5959FF5B5959FF5B59 + 59FF5B5959FF5B5959FF545353FF395A6BFF23A9EFFF1CA8EFFF13A4EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0EAFF0D9AE2FF1694D3FF697E84FF4A48 + 48FF494747FF494747FF494747FF494747FF494747FF494747FF484646FE1514 + 147A000000270B0B0B0500000000000000000000000000000000000000000000 + 0000000000003A3838BC494747FF484646FE494747FF697373FE3CA1CFFF0D97 + DDFF0D9EE8FE0EA2EDFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 + EFFF0EA3EFFF0DA2EEFE0EA3EFFF13A5EFFE23ABF0FF2DAEF0FE2EAFF1FF2DAF + F0FE2EAFF1FF2EAFF1FF3A667DFE535151FF605E5EFE615F5FFF615F5FFE615F + 5FFF615F5FFE605E5EFF535151FF3586AFFE2EAFF1FF2DAFF0FE2DAFF0FF25AB + F0FE15A5EFFF0EA3EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0DA2EEFE0EA3EFFF0DA2EEFE0D9FE9FF0D98DFFE2496CDFF667172FF4947 + 47FE494747FF484646FE494747FF484646FE494747FF484646FE494747FF3533 + 33C60000003C0000001000000000000000000000000000000000000000000000 + 00000000000034323291494747FF494747FF494747FF5C6161FF58A5C4FF0C95 + DAFF0D9DE6FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0FA3EFFF21AAF0FF34B1F1FF36B2F2FF36B2F1FF36B2F2FF36B2 + F1FF36B2F2FF36B2F2FF38A1D8FF4D5255FF616060FF676565FF676565FF6765 + 65FF676565FF636161FF4F5559FF36ADEAFF36B2F2FF36B2F1FF36B2F2FF36B2 + F1FF35B1F1FF25ABF0FF10A3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA1EDFF0D9EE7FF0D96DDFF3C98C2FF5C6060FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4745 + 45FA0C0B0B610000002100000003000000000000000000000000000000000000 + 0000000000002120205C494747FF484646FE494747FF525353FE73A1B0FF0D92 + D6FF0D9BE3FE0EA0EBFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 + EFFF0FA3EFFF2DAFF0FE3DB5F1FF3DB5F1FE3DB5F2FF3DB5F1FE3DB5F2FF3DB5 + F1FE3DB5F2FF3DB5F2FF3DB5F1FE487D98FF636161FE6C6B6BFF6D6B6BFE6D6B + 6BFF6D6B6BFE646363FF4A7991FF3DB5F1FE3DB5F2FF3DB5F1FE3DB5F2FF3DB5 + F1FE3DB5F2FF3DB5F1FE32B0F1FF12A4EFFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 + EFFF0DA2EEFE0EA2EEFF0DA1ECFE0D9CE5FF0C94D9FE5894ACFF515252FF4846 + 46FE494747FF484646FE494747FF484646FE494747FF484646FE494747FF4947 + 47FF2A2929AD000000350000000B000000000000000000000000000000000000 + 0000000000000E0D0D22484646F7494747FF494747FF4B4A4AFF788D8FFF2298 + D2FF0D98E0FF0D9FE9FF0EA2EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0FA3 + EFFF32B0F1FF46B8F2FF46B8F3FF46B8F2FF46B8F3FF46B8F2FF46B8F3FF46B8 + F2FF46B8F3FF46B8F3FF46B8F2FF48B1E7FF697075FF737272FF737272FF7372 + 72FF727070FF636464FF4AA2CFFF46B8F2FF46B8F3FF46B8F2FF46B8F3FF46B8 + F2FF46B8F3FF46B8F2FF46B8F3FF3AB3F1FF10A4EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA2EEFF0EA0EAFF0D99E1FF1092D4FF6E868BFF4B4A4AFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF434141ED050505500000001A000000010000000000000000000000000000 + 00000000000002010101424141D1484646FE494747FF494747FE646C6CFF4EA3 + C8FF0C95DBFE0D9DE6FF0DA1ECFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE27AC + F0FF4EBBF3FF4FBBF3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBB + F3FE4FBBF3FF4FBBF3FF4FBBF3FE50B9F0FF737D82FE7A7979FF7A7979FE7A79 + 79FF757474FE61737DFF4FB9F0FF4FBBF3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBB + F3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBBF3FE31B0F1FF0EA3EFFF0DA2EEFE0EA3 + EFFF0DA2EEFE0EA1EDFF0D9EE7FE0C96DDFF359AC9FE616868FF494747FF4846 + 46FE494747FF484646FE494747FF484646FE494747FF484646FE494747FF4947 + 47FF484646FE1F1E1E900000002E000000070000000000000000000000000000 + 000000000000000000002A29297C494747FF494747FF494747FF525353FF79A0 + AAFF0F92D5FF0D9AE2FF0E9FEAFF0EA2EEFF0EA3EFFF0EA3EFFF11A4EFFF51BC + F3FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF + F4FF59BFF4FF59BFF4FF59BFF4FF61ADD4FF807E7EFF818080FF818080FF807F + 7FFF777676FF6098B5FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF + F4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF55BEF3FF18A7EFFF0EA3EFFF0EA3 + EFFF0EA2EEFF0EA0EBFF0D9BE4FF0D93D7FF6094A8FF505151FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF3D3B3BDD01010143000000140000000000000000000000000000 + 0000000000000000000012111123484646F9494747FF494747FF4A4949FF6F7A + 7BFF3EA1CFFF0C96DCFF0D9DE7FF0EA1ECFF0EA2EEFF0EA3EFFF26ACF0FF61C2 + F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2 + F4FF62C2F4FF62C2F4FF62C2F4FF769EB4FF888787FF888787FF888787FF8685 + 85FF787A7BFF63BAE7FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2 + F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF33B1F1FF0EA3EFFF0EA2 + EEFF0EA1EDFF0D9EE8FF0D97DEFF2797CDFF697779FF4A4848FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF484646FD15141477000000260000000500000000000000010000 + 00000000000000000000010101013C3A3AAF494747FF484646FE494747FF5456 + 56FF76A2AFFE1293D5FF0D99E1FE0D9FE9FF0DA1EDFE0EA2EEFF3AB3F1FE6BC6 + F5FF6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6 + F5FE6BC6F5FF6BC6F5FF6CC4F1FE8A959BFF8F8E8EFE8F8E8EFF8F8E8EFE8A88 + 88FF7793A2FE6BC6F4FF6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6 + F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF49B9F2FF0DA2EEFE0EA2 + EEFF0DA0EAFE0D9BE3FF0D92D7FE5F96ABFF545656FE494747FF4A4848FF4C4B + 4BFE4C4C4CFF4C4C4CFE4C4C4CFF4C4C4CFE4C4C4CFF4C4B4BFE4B4A4AFF4947 + 47FF484646FE494747FF323131C30000003B0000000F00000000000000010000 + 00000000000000000000000000002524243E484646FB494747FF494747FF4A49 + 49FF6C7777FF4AA3CAFF0C94DAFF0D9CE5FF0EA0EBFF0EA2EEFF43B7F2FF75CB + F6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF86A2B1FF919E + A6FF929FA6FF929FA6FF929EA4FF979696FF979696FF979696FF969595FF8D8C + 8CFF79B4D2FF75CBF6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF75CBF6FF75CA + F6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF75CBF6FF53BDF3FF0EA2EEFF0EA1 + ECFF0D9DE6FF0C96DCFF3299CAFF677274FF4A4949FF4A4848FF53656DFF6C8D + 9BFF70929FFF70929FFF70929FFF70929FFF70929FFF6F919EFF697B82FF4F4F + 4FFF494747FF494747FF474545F80B0B0B5F0000002000000002000000010000 + 000000000000000000000000000000000000484646B8484646FE494747FF4947 + 47FF515151FE7C979CFF2198D2FE0C97DEFF0D9DE7FE0EA1ECFF3BB3F1FE7FCE + F6FF7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE92A1AAFF9E9D + 9DFE9F9E9EFF9F9E9EFF9E9D9DFE9F9E9EFF9E9D9DFE9F9E9EFF9C9B9BFE8E97 + 9BFF80CBF2FE7FCEF6FF7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE7FCEF6FF7FCE + F6FE7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE7FCEF6FF4CBAF2FF0DA1ECFE0D9E + E8FF0D98E0FE1693D3FF6C8F99FE505050FF494747FE4A4949FF5A8CA1FF7FD0 + F6FE80D1F7FF7FD0F6FE80D1F7FF7FD0F6FE80D1F7FF7FD0F6FE82ADC0FF5456 + 56FF484646FE494747FF484646FE282727A9000000340000000A000000010000 + 000000000000000000000000000000000000748A8A33484646F7494747FF4947 + 47FF494747FF5C6060FF71A5B7FF1294D5FF0D99E0FF0D9EE8FF1EA7EDFF86D0 + F6FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF9AA9B0FFA5A4 + A4FFA6A5A5FFA6A5A5FFA6A5A5FFA6A5A5FFA6A5A5FFA5A4A4FF9F9F9FFF90B1 + C3FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2 + F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF88D1F7FF2FAEEFFF0D9FE9FF0D9A + E2FF0E93D6FF5A9AB4FF5B5F5FFF494747FF494747FF4A4848FF566F79FF78CB + F1FF80D0F6FF8BB5C4FF758C92FF697C82FF687B81FF687B81FF606B6EFF4D4D + 4DFF494747FF494747FF494747FF424141EB0404044D00000018000000010000 + 00000000000000000000000000000000000000000000626F6F91494747FF4947 + 47FF484646FE4B4A4AFF687272FE5FA7C3FF0D92D7FE0D99E1FF0D9EE8FE65C3 + F3FF92D5F7FF92D5F7FE92D5F8FF92D5F7FE92D5F8FF92D5F7FEA0ADB4FFA8A7 + A7FEA8A8A8FFA8A8A8FFA8A7A7FEA8A8A8FFA8A7A7FEA8A7A7FFA1A1A2FE94CC + E9FF92D5F7FE92D5F8FF92D5F8FF92D5F7FE92D5F8FF92D5F7FE92D5F8FF92D5 + F7FE92D5F8FF92D5F7FE92D5F8FF92D5F7FE77CAF4FF11A0E9FF0D9AE3FE0C93 + D8FF479CC1FE656F6FFF4B4949FE494747FF484646FE494747FF4E4D4DFF618D + 9FFE7DCFF5FF82CCEEFE7A8C91FF535454FE4B4949FF4A4949FE4A4848FF4947 + 47FF484646FE494747FF484646FE484646FE1D1C1C8B00000027000000040000 + 00000000000000000000000000000000000000000000ABE2E20D4E4F4FDA4947 + 47FF494747FF494747FF4D4C4CFF707D7EFF52A5C8FF0D93D7FF0D99E1FF1FA5 + EAFF8DD2F6FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FFA3ACB1FFA5A4 + A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA2B0B8FF9DD9 + F7FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9 + F8FF9DD9F8FF9DD9F8FF9DD9F8FF97D6F7FF2CABEBFF0D9AE3FF0C94D9FF3B9A + C6FF6C7A7BFF4C4C4CFF494747FF494747FF494747FF494747FF494747FF5152 + 52FF66A3BDFF7FD0F6FF84C4E2FF6F7A7CFF4E4D4DFF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF383737CF000000360000000A0000 + 000000000000000000000000000000000000000000000000000092BABA3D4846 + 46F6484646FE494747FF494747FE4F4F4FFF748384FE52A5C9FF0D92D6FE0D99 + E0FF31ACEAFF9DD8F7FEA6DCF8FFA6DDF8FEA6DDF9FFA6DDF8FEA8C9D9FFA8C6 + D5FEA8C6D5FFA8C6D5FFA8C6D5FEA8C6D5FFA8C6D5FEA8C6D5FFA7D1E7FEA6DD + F9FFA6DDF8FEA6DDF9FFA6DDF9FFA6DDF8FEA6DDF9FFA6DDF8FEA6DDF9FFA6DD + F8FEA6DDF9FFA6DCF8FEA2DAF7FF45B4EDFE0D99E1FF0C93D8FF3C9BC7FE6D7F + 81FF4E4E4EFE494747FF484646FE494747FF484646FE494747FF494747FF4948 + 48FE555C5EFF6EB8D8FE80D0F6FF86B8CEFE636A6AFF4B4A4AFE494747FF4947 + 47FF484646FE494747FF484646FE494747FF474545F90707074B000000100000 + 0000000000000000000000000000000000000000000000000000000000007891 + 916A494747FE494747FF494747FF494747FF4E4E4EFF707D7DFF62A7C2FF1293 + D5FF0C97DDFF2EA9E8FF96D5F5FFB0E0F8FFB0E0F9FFB0E1FAFFB0E1FAFFB0E1 + FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1 + FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E0 + F9FFB0E0F9FFA0D9F6FF3DAFEAFF0D98DFFF0F93D6FF4C9DC1FF6C797AFF4E4D + 4DFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4A4949FF596A70FF75C5E9FF81D1F7FF84A9B8FF5C6060FF4A4848FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF17161674000000140000 + 000000000000000000000000000000000000000000000000000000000000B9F8 + F80138586992494747FE494747FF494747FF494747FF4D4C4CFF677171FF72A5 + B6FF2398D2FF0C94DAFF1A9FE2FF6FC4EFFFB2E1F8FFB9E3F9FFB9E4FAFFB9E4 + FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4 + FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB6E2 + F8FF7DCAF1FF22A3E4FF0C95DBFF1995D2FF629DB3FF656F6FFF4D4C4CFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4C4B4BFF67828DFF9CD9F6FF9FD9F5FF879AA1FF545555FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF2423238B000000120000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000E88C50638596BA1484646FE494747FF484646FE494747FF4B4949FE5B5F + 5FFF7C9599FF4EA4C9FE1293D4FF0C95DBFE28A5E4FF73C5EFFEB1DFF7FFC2E7 + FAFEC3E7FAFFC3E7FAFFC2E7FAFEC3E7FBFFC2E8FAFEC3E8FBFFC2E8FAFEC3E8 + FBFFC2E7FAFEC3E7FBFFC3E7FBFFC2E7FAFEC3E7FAFFB6E2F8FE7FCAF1FF32A9 + E6FE0D96DDFF0F93D5FE3F9DC8FF739198FE595E5EFF4A4949FF494747FE4947 + 47FF484646FE494747FF484646FE494747FF484646FE494747FF494747FF4846 + 46FE494747FF494747FE4F4F4FFF7B9EACFEADE1F9FFACD9EEFE727B7CFF4C4C + 4CFF484646FE494747FF484646FE494747FF484646FE252424890000000D0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000E88C60638596A9C494747FD494747FF494747FF494747FF4947 + 47FF505050FF6A7475FF77A1ACFF42A2CDFF1293D5FF0C95DAFF179CE0FF42B0 + E8FF75C6F0FFA0D9F5FFBCE4F8FFC5E8FAFFC9E9FAFFCBEAFAFFCBEAFAFFC9E9 + FAFFC6E8FAFFBFE5F9FFA6DBF6FF7CC9F0FF4BB4EAFF1C9FE1FF0D95DBFF0F93 + D5FF379CCCFF6B9BABFF687272FF505050FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4949FF4D4D + 4DFF4D4C4CFF494848FF494747FF545758FF9CC9DDFFB6E4FAFF95ACB4FF5355 + 55FF494747FF494747FF494747FF494747FF494747FF1C1B1B6E000000070000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000E88C50338596B7D484646FA494747FF484646FE4947 + 47FF494747FF4A4949FE535555FF6D7878FE789EA7FF54A4C6FE279AD2FF0E92 + D5FE0C94DAFF0D96DDFF129ADFFE22A2E3FF2EA7E5FE35AAE6FF36ABE6FE30A8 + E5FF24A3E3FE149BE0FF0D97DDFF0C94DAFE0C92D6FF2198D2FE4AA0C6FF7099 + A6FE6B7677FF535555FE4A4949FF494747FE494747FF494747FF484646FE4947 + 47FF484646FE494747FF484646FE494747FF484646FE4A4848FF64747AFF8DA5 + AFFE7F8F94FF525353FE494747FF4B4A4AFE84A1ACFFBFE7FAFEA5BEC9FF585B + 5BFF484646FE494747FF484646FE494747FF484646FE0F0E0E38000000020000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000296A8B4D47494BE7494747FF4947 + 47FF494747FF494747FF494747FF4A4848FF515252FF616868FF76888AFF769F + ABFF5CA4C0FF43A1CCFF2C9BD0FF1C96D3FF1594D4FF1394D4FF1394D4FF1594 + D4FF1A96D3FF299AD1FF3E9FCCFF56A1BFFF6F9CAAFF748689FF616767FF5151 + 51FF4A4848FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF7B939DFFC7EA + FBFFB7D2DFFF676E6EFF4C4C4CFF505151FF98B7C3FFC7EAFBFFA5BCC5FF5759 + 59FF494747FF494747FF494747FF494747FF3F3D3DCF0101010D000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000097CDD11E5C6666AE4947 + 47FE494747FF484646FE494747FF484646FE494747FF494747FE4B4A4AFF5151 + 51FE5A5F5FFF666F6FFF728080FE798D8FFF799397FE77959CFF77959CFE7792 + 97FF788C8EFE717F80FF666F6FFF5A5E5EFE515151FF4B4A4AFE494747FF4947 + 47FE494747FF484646FE494747FF484646FE494747FF494747FF484646FE4947 + 47FF484646FE494747FF484646FE494747FF484646FE494747FF606B6FFFC7E9 + F8FECEECFAFFA4B9BFFE778588FF8CA0A6FEC9E9F8FFCFEDFBFE8B989CFF5050 + 50FF484646FE494747FF484646FE484646FD1F1E1E6100000002000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000008CB1B1015D67 + 674D494747D0494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF4A4848FF4B4949FF4B4B4BFF4C4C4CFF4C4C4CFF4C4B + 4BFF4B4949FF4A4848FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF4D4D4DFF8498 + 9FFFCFEAF7FFD7F0FCFFD6EFFBFFD7F0FCFFD4EEFAFFA7BAC1FF5D6262FF4A48 + 48FF494747FF494747FF494747FF393838B20302020600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000494747084846465F494747D0484646FE494747FF484646FE494747FF4846 + 46FE494747FF494747FF484646FE494747FF484646FE494747FF484646FE4947 + 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4846 + 46FE494747FF484646FE494747FF484646FE494747FF494747FF484646FE4947 + 47FF484646FE494747FF484646FE494747FF484646FE494747FF494747FF4E4E + 4EFE6A7477FF92A2A8FE9EADB2FF98A9AEFE7C888AFF5A5E5EFE4B4A4AFF4947 + 47FF484646FE494747FF434141D00C0C0C160000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000004947473E4947479D494747E6494747FE4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4A4848FF4C4B4BFF4E4D4DFF4D4D4DFF4B4A4AFF494747FF494747FF4947 + 47FF484646FC3D3C3CA618181811000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004947470C4947473F4947 + 477E494747B6494747E3494747F8494747FB494747FD494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FD494747F24846 + 46B2444242424442420200000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000D1D0D00DD1D1D127D1D0D036D1D1D13FD1D0D03FD1D1 + D13FD1D0D03FD1D1D13FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D0 + D03FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D1D13FD1D0D03FD1D1 + D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D1D13FD1D0 + D03FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D0D030D1D1D10A0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF00 + 0000FFFFFFFFFFFFFFFFFF000000FFFFFFC007FFFFFFFF000000FFFFFC00007F + FFFFFF000000FFFFF000000FFFFFFF000000FFFF80000003FFFFFF000000FFFF + 00000000FFFFFF000000FFFC000000007FFFFF000000FFF8000000003FFFFF00 + 0000FFF0000000000FFFFF000000FFE00000000007FFFF000000FFC000000000 + 03FFFF000000FF800000000001FFFF000000FF000000000000FFFF000000FE00 + 0000000000FFFF000000FC0000000000007FFF000000FC0000000000003FFF00 + 0000F80000000000003FFF000000F80000000000001FFF000000F00000000000 + 001FFF000000F00000000000000FFF000000E00000000000000FFF000000E000 + 000000000007FF000000C000000000000007FF000000C000000000000007FF00 + 0000C000000000000003FF000000C000000000000003FF000000C00000000000 + 0001FF0000008000000000000001FF0000008000000000000000FF0000008000 + 000000000000FF0000008000000000000000FF00000080000000000000007F00 + 000080000000000000007F00000080000000000000003F000000800000000000 + 00003F00000080000000000000001F00000080000000000000001F000000C000 + 0000000000001F000000C0000000000000000F000000C0000000000000000F00 + 0000C00000000000000007000000C00000000000000007000000E00000000000 + 000007000000E00000000000000002000000E00000000000000002000000F000 + 00000000000000000000F80000000000000000000000F8000000000000000000 + 0000FC0000000000000000000000FC0000000000000000000000FE0000000000 + 000000000000FF0000000000000000000000FF0000000000000000000000FF80 + 00000000000000000000FFC000000000000000000000FFE00000000000000000 + 0000FFF800000000000001000000FFFC00000000000001000000FFFE00000000 + 000003000000FFFF80000000000007000000FFFFF000000000000F000000FFFF + FC00000000001F000000FFFFFFE000000000FF000000FFFFFFFFFFFFFFFFFF00 + 0000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF + FFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF0000002800 + 0000400000008000000001002000000000000042000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000020000 + 00050000000A0000001000000015000000190000001B0000001B0000001A0000 + 0017000000120000000C00000007000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000020000000900000015000000230000 + 00310000003C00000044000000490000004C0000004D0000004E0000004D0000 + 004B000000470000004000000036000000280000001A0000000C000000040000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000121111040000001000000023000000380202024A131212772322 + 22A1323030C13A3939D9444242E9474545F4474545F4474545F4464444F0403E + 3EE1343333CC292828B01A19198B0707075F0000004C0000003E0000002A0000 + 0015090808072D2C2C0100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001616 + 160300000010000000280101014218171780323030C3464444F5494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF484646FD3A3939D6201F1F9B0605055C0000 + 0047000000300000001709080806000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000040404090000 + 00220303034422212198414040E9494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF474545F72D2B + 2BB70A0A0A68000000460000002B0000000F1B1A1A0200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000475F5F0200000012000000331D1C + 1C88424040EA494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4B4A4AFF4E4E4EFF515252FF545656FF555858FF545656FF525353FF4E4E + 4EFF4B4A4AFF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF474545F92A2929B10404045A0000003D0000001C232F2F05000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000272F2F040000001B0A0A0A51383737CE4947 + 47FF494747FF494747FF494747FF494747FF4A4848FF505151FF5F6565FF6A7E + 82FF5F8B9BFF5594AEFF4D99BBFF4B9DC2FF4A9EC5FF499DC3FF4B99BCFF5093 + B0FF598A9EFF667E85FF606767FF515252FF4A4949FF494747FF494747FF4947 + 47FF494747FF494747FF424040EB1616168200000048000000260B0F0F090000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000002F2F2F050000002018181876454343F2494747FF4947 + 47FF494747FF494747FF4C4B4BFF5A5E5EFF6B8389FF5497B3FF3D9FCEFF289D + D8FF2EA2DEFF32A6E1FF35A8E3FF36A9E4FF37A9E4FF37A9E4FF35A8E3FF34A7 + E2FF2FA3DFFF279DDAFF339DD0FF4A95B7FF62838EFF5C6161FF4C4C4CFF4947 + 47FF494747FF494747FF494747FF484646FE292828AD0101014F0000002C0000 + 000B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000002F2F2F040000002024232392484646FD494747FF494747FF4947 + 47FF4A4949FF5A5E5EFF698A94FF479EC5FF289DD9FF2EA4E0FF33A9E5FF37AC + E8FF3AAFEBFF3CB1ECFF3DB2EDFF3EB2EEFF3FB3EEFF3FB3EEFF3EB2EDFF3DB1 + EDFF3CB0EBFF39AEE9FF36AAE6FF31A6E1FF269DDAFF399AC9FF5C899AFF5C61 + 62FF4B4A4AFF494747FF494747FF494747FF494747FF363434CB030303560000 + 002E00080C0B0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00002F3F3F030000001D27262698494747FF494747FF494747FF494747FF5051 + 51FF6B7E81FF4C9CC0FF269DD9FF2CA4E2FF32AAE7FF36AEEBFF39B1EEFF3AB2 + EFFF3BB3F0FF3CB4F1FF3DB5F1FF3DB5F1FF3EB5F1FF3EB5F1FF3EB5F1FF3EB5 + F1FF3EB4F1FF3DB4F0FF3CB2EEFF39B0ECFF36ACE9FF30A7E4FF259EDBFF3998 + C5FF637F87FF525353FF494747FF494747FF494747FF494747FF3A3838D60504 + 04580000002C0B0F0F0800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000005F7F + 7F010000001625242490494747FF494747FF494747FF494848FF585B5BFF6892 + A1FF2D9CD3FF27A1DFFF2DA8E7FF31ADECFF34B0EEFF36B1F0FF37B2F1FF38B3 + F1FF38B3F2FF38B3F2FF39B3F2FF39B3F2FF3AB4F2FF3AB4F2FF3AB4F2FF3AB4 + F2FF3BB4F2FF3BB4F2FF3AB4F1FF3AB3F1FF39B2EFFF37AFEDFF32ABE9FF2BA4 + E1FF249BD6FF538FA9FF5B6060FF4A4848FF494747FF494747FF494747FF3837 + 37D30303035100000025232F2F05000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000D1A191970484646FD494747FF494747FF4A4848FF5F6464FF5E9BB3FF229B + D8FF26A3E3FF2BA9EAFF2FADEEFF30AFF0FF31B0F1FF32B0F1FF32B1F1FF33B1 + F1FF33B1F1FF33B1F1FF34B1F1FF34B1F1FF35B1F1FF35B2F1FF35B2F2FF36B2 + F2FF36B2F2FF36B2F2FF37B2F2FF37B2F2FF37B2F1FF36B1F1FF35B0EFFF31AC + EBFF2BA7E5FF229CDBFF4295BBFF60696AFF4A4949FF494747FF494747FF4947 + 47FF333131C4000000480000001B272A2A020000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000171F1F050D0C + 0C43464444F3494747FF494747FF4A4848FF606666FF569DBBFF1D9ADAFF24A3 + E5FF28A9EBFF2AACEEFF2BAEF0FF2CAEF1FF2CAFF1FF2DAFF1FF2DAFF1FF2EAF + F1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FAFF1FF2FB0F1FF30B0F1FF30B0 + F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF32B0F1FF32B0F1FF32B0F1FF31AF + EFFF2FADEDFF29A7E7FF219EDDFF3895C2FF616B6DFF4A4949FF494747FF4947 + 47FF494747FF242323A10000003C0000000F0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000242323010202021A3C3A + 3AD2494747FF494747FF494747FF5B6060FF5B9DB8FF1A99D9FF20A2E5FF24A8 + ECFF26ABEFFF27ACF0FF27ACF1FF27ACF1FF28ACF1FF28ADF1FF28ADF1FF28AD + F1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF2AADF1FF2AAEF1FF2AAEF1FF2BAE + F1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAEF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAF + F0FF2DAEF0FF2BABEDFF26A6E8FF1F9DDDFF3A95BFFF5E6565FF494848FF4947 + 47FF494747FF484646FB101010710000002A0908080500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000004040409242323854947 + 47FF494747FF494747FF545555FF6799AAFF1998D8FF1BA0E4FF1FA6EBFF21A9 + EEFF22AAF0FF22AAF0FF22ABF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF24AB + F0FF24ABF0FF25ABF0FF25ABF0FF25ACF0FF25ACF0FF26ACF0FF26ACF1FF26AC + F1FF26ACF1FF27ACF1FF28AAEDFF4B7185FF3D8BB2FF2CA7E6FF28ADF1FF28AD + F1FF28ADF0FF28ACF0FF27AAEDFF22A5E7FF1B9ADBFF4993B3FF565A5AFF4947 + 47FF494747FF494747FF3D3C3CDE010101470000001500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000010707072B474545F24947 + 47FF494747FF4C4C4CFF708A8FFF2098D3FF179DE1FF1BA4EAFF1CA7EEFF1DA7 + EEFF314855FF4C4A4AFF555353FF555353FF555353FF3484ADFF1FA9F0FF1FA9 + F0FF20A9F0FF20A9F0FF20AAF0FF20AAF0FF21AAF0FF21AAF0FF21AAF0FF22AA + F0FF22AAF0FF22AAF0FF338CB9FF585656FF595757FF57595BFF487287FF3591 + C0FF25A9ECFF24ABF0FF24AAEFFF22A8ECFF1EA2E5FF1897D8FF5C899AFF4E4E + 4EFF494747FF494747FF494747FF201F1F970000002E09080806000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000072E2D2D9E494747FF4947 + 47FF494747FF646B6BFF409EC9FF1499DDFF16A1E8FF18A5EEFF18A7EFFF19A7 + F0FF1E84B8FF3C3A3AFF4F4D4DFF525050FF525050FF4D565CFF1DA2E5FF1BA8 + F0FF1BA8F0FF1BA8F0FF1BA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1DA8 + F0FF1DA8F0FF1DA8F0FF456577FF555353FF555353FF555353FF565454FF5654 + 54FF525A5FFF407794FF2B95CBFF1FA8EEFF1DA5EAFF199EE2FF2396CEFF6371 + 74FF4A4848FF494747FF494747FF434242EE0303034900000013000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000007070725474545F5494747FF4947 + 47FF505151FF6998A9FF1094D7FF129EE5FF14A3ECFF15A5EFFF15A5EFFF16A6 + EFFF16A6EFFF264D61FF444242FF4E4D4DFF4F4D4DFF4F4D4DFF357394FF17A6 + F0FF17A6F0FF17A6F0FF18A6F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF19A7 + F0FF19A7F0FF2197D4FF504E4EFF525050FF525050FF525050FF525151FF5351 + 51FF535151FF525050FF454343FF2282B3FF1BA6EDFF18A2E8FF1498DCFF4892 + B3FF525454FF494747FF494747FF494747FF1F1E1E92000000261B1A1A030000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000327262684494747FF494747FF4947 + 47FF687272FF329CCEFF0F99DFFF11A0E9FF12A3EDFF12A4EFFF12A4EFFF12A4 + EFFF13A4EFFF168DCAFF323233FF494747FF4D4B4BFF4D4B4BFF4B4C4EFF1C97 + D6FF14A5EFFF14A5EFFF15A5EFFF15A5EFFF15A5EFFF15A5EFFF15A5EFFF16A6 + EFFF16A6EFFF347090FF4E4D4DFF4F4D4DFF4F4D4DFF4C4A4AFF494747FF4E4C + 4CFF504E4EFF4D4B4BFF343F46FF18A3EBFF17A6EFFF16A3ECFF139CE3FF1794 + D3FF65787CFF4A4848FF494747FF494747FF3D3C3CDD0000003B0000000B0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000009424040DC494747FF494747FF4E4E + 4EFF6C97A5FF0D92D7FF0E9CE5FF0FA1ECFF0FA3EEFF10A3EFFF10A3EFFF10A4 + EFFF10A4EFFF10A4EFFF1D5673FF3D3B3BFF4A4848FF4B4949FF4B4949FF3764 + 7BFF11A4EFFF11A4EFFF11A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4 + EFFF14A0E8FF464E52FF4C4A4AFF4D4B4BFF4B4949FF3B3939FF2C2B2BFF3534 + 34FF413F3FFF3F3E3EFF216385FF15A5EFFF14A5EFFF14A4EDFF119FE7FF0E96 + DBFF4B90AFFF505151FF494747FF494747FF494747FF100F0F690000001C2927 + 2701000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000013121239494747FF494747FF494747FF5D62 + 62FF459FC7FF0D97DDFF0D9EE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF1094D8FF2C3033FF454343FF4A4848FF4A4848FF4947 + 47FF1D8AC2FF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF10A3EFFF10A3EFFF10A3 + EFFF247FAEFF4A4848FF4A4848FF4A4848FF454343FF27485AFF14709FFF1A3A + 4BFF222121FF242425FF1492D2FF12A4EFFF11A4EFFF11A3EEFF0FA0EAFF0E99 + E1FF2195CEFF616969FF494747FF494747FF494747FF2E2D2DB8000000330908 + 0807000000000000000000000000000000000000000000000000000000000000 + 000000000000000000003F3F3F012726267F494747FF494747FF4A4848FF7383 + 85FF1A96D3FF0D9AE2FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF186085FF383737FF484646FF494747FF4947 + 47FF3D5663FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF395A6CFF4A4848FF4A4848FF494747FF3C3A3AFF1775A5FF0FA3EFFF0FA3 + EFFF1189C6FF136792FF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EEFF0EA1ECFF0D9C + E5FF0C92D7FF618490FF4A4949FF494747FF494747FF474545F7060606510000 + 0015000000000000000000000000000000000000000000000000000000000000 + 000000000000000000003F3F3F02383737B9494747FF494747FF4D4D4DFF6B98 + A7FF0C93D8FF0D9CE6FF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0E9CE5FF27343BFF424040FF484646FF4947 + 47FF484646FF247DABFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1692 + D2FF474545FF494747FF494747FF464444FF2E3539FF0E9DE6FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9E + E8FF0C96DCFF4A91B1FF4F4F4FFF494747FF494747FF494747FF2422229D0000 + 002B121111040000000000000000000000000000000000000000000000000000 + 000000000000000000003F3F3F05474545E6494747FF494747FF545656FF569F + BDFF0C96DCFF0D9EE8FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF156E9CFF353434FF474545FF4947 + 47FF494747FF424E54FF109DE5FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF2B6D + 90FF484646FF494747FF484646FF403E3EFF1E5978FF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0E9F + EAFF0D98DFFF3397C6FF585B5BFF494747FF494747FF494747FF413F3FE70101 + 01420000000F0000000000000000000000000000000000000000000000000000 + 000000000000000000004B4A4A14494747FF494747FF494747FF5D6262FF43A0 + CAFF0D97DFFF0E9FE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA0EBFF233B47FF403E3EFF4846 + 46FF494747FF484646FF2C7093FF0EA3EFFF0EA3EFFF0EA3EFFF0EA0EBFF404C + 53FF494747FF494747FF474545FF363535FF1287C2FF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0 + EBFF0D9AE2FF1F96D1FF626A6AFF494747FF494747FF494747FF494747FF1918 + 1882000000231B1A1A0200000000000000000000000000000000000000000000 + 000000000000000000005150502F494747FF494747FF494747FF676F6FFF319E + D1FF0D99E1FF0EA0EAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF137BB1FF323131FF4644 + 44FF494747FF494747FF46484AFF1596D8FF0EA3EFFF0EA3EFFF1D84B9FF4846 + 46FF494747FF494747FF444242FF27404DFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 + ECFF0D9BE4FF1092D5FF68787AFF494747FF494747FF494747FF494747FF3836 + 36CE0000003A0404040A00000000000000000000000000000000000000000000 + 0000000000000000000051515141494747FF494747FF494747FF6E7A7AFF259A + D3FF0D9AE2FF0EA0EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1F4559FF3E3C + 3CFF484646FF494747FF494747FF33647DFF0EA3EFFF0EA3EFFF31627BFF4846 + 46FF494747FF484646FF3C3B3BFF196B95FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 + EDFF0D9CE5FF0C92D6FF678086FF494747FF494747FF494747FF494747FF4846 + 46FE0E0D0D650000001B29272701000000000000000000000000000000000000 + 0000000000000000000052515143494747FF494747FF494747FF737F7FFF1F98 + D3FF0D9AE2FF0EA0EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1189C6FF2F2E + 2FFF454343FF494747FF494747FF484646FF1B8BC5FF0F9FE8FF434649FF4947 + 47FF494747FF464545FF313335FF0F98DEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 + EDFF0D9CE5FF0C92D6FF65828BFF494848FF494747FF494747FF494747FF4947 + 47FF2D2B2BB50000003209080807000000000000000000000000000000000000 + 0000000000000000000052515142494747FF494747FF494747FF727F7FFF1F98 + D3FF0D9AE2FF0EA0EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1C52 + 6EFF3B3A3AFF484646FF494747FF494747FF3C5867FF1F85BAFF484646FF4947 + 47FF494747FF424040FF215069FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 + EDFF0D9CE5FF0C92D6FF66838BFF494848FF494747FF494747FF494747FF4947 + 47FF464444F50505054F00000015000000000000000000000000000000000000 + 0000000000000000000051515140494747FF494747FF494747FF6E7979FF289B + D3FF0D99E1FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0F93 + D7FF2B2F32FF444242FF494747FF494747FF494747FF41525BFF494747FF4947 + 47FF484646FF383737FF147DB3FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 + EDFF0D9CE5FF0C92D6FF698085FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF2221219A0000002A121111040000000000000000000000000000 + 000000000000000000005151512C494747FF494747FF494747FF666E6EFF369F + D0FF0D99E0FF0EA0EAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF10A3EFFF16A6 + EFFF256789FF464444FF555353FF575555FF585656FF575555FF575555FF5553 + 53FF4F4E4EFF334148FF11A2ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 + ECFF0D9BE3FF1293D4FF6A7779FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF403E3EE5000000400000000F0000000000000000000000000000 + 000000000000000000004C4C4C10494747FF494747FF494747FF5C6161FF49A2 + C9FF0D97DEFF0D9FE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF17A6EFFF23ABF0FF29ADF0FF2AAD + F1FF2AA6E6FF404B50FF585757FF5E5C5CFF5E5C5CFF5E5C5CFF5E5C5CFF5E5C + 5CFF555353FF367494FF2AADF1FF25ABF0FF1BA7EFFF0FA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0 + EBFF0D99E1FF2497D0FF626969FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF1716167D000000221B1A1A0200000000000000000000 + 0000000000000000000000000000484646E7494747FF494747FF535555FF5EA1 + BCFF0C95DBFF0D9EE7FF0EA2EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF16A6EFFF2BAEF1FF32B0F1FF32B0F1FF32B0F1FF32B0 + F1FF32B0F1FF3982A8FF545353FF636161FF646262FF646262FF646262FF6361 + 61FF525252FF34A1D8FF32B0F1FF32B0F1FF32B0F1FF2EAFF1FF1BA8F0FF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9F + E9FF0D98DFFF3A98C4FF575A5AFF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF363535CB000000390404040A00000000000000000000 + 00000000000000000000000000003A3939B7494747FF494747FF4D4C4CFF759A + A5FF0C92D6FF0D9CE5FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF22AAF0FF3AB4F1FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4 + F2FF3BB4F2FF3BB2EFFF4E6069FF666565FF6B6969FF6B6969FF6B6969FF6665 + 65FF4D6A79FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF2BAE + F0FF0FA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0D9E + E7FF0C95DBFF5393AEFF4F4F4FFF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF484646FD0C0C0C620000001A00000001000000000000 + 000000000000000000000000000028272778494747FF494747FF494848FF7381 + 81FF259AD3FF0D99E1FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF26ACF0FF44B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7 + F2FF45B7F2FF45B7F2FF4C9BC4FF6D6C6CFF727171FF727171FF727070FF6766 + 66FF4B93B9FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7 + F2FF33B1F1FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0D9B + E4FF0E92D6FF6A858CFF4A4848FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF2B2A2AB10000003000000006000000000000 + 000000000000000000000000000016151531494747FF494747FF494747FF5B5F + 5FFF53A3C5FF0C96DCFF0D9EE8FF0EA2EDFF0EA3EFFF0EA3EFFF0EA3EFFF1CA8 + EFFF4DBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBB + F3FF4EBBF3FF4EBBF3FF53B1E1FF787777FF7A7878FF7A7878FF787676FF666B + 6EFF4FB7ECFF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBB + F3FF4EBBF3FF2BAEF0FF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9FEAFF0D98 + E0FF2E99CBFF606667FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF464444F30504044D00000014000000000000 + 000000000000000000000000000000000000444242DB494747FF494747FF4D4D + 4DFF7899A1FF1093D5FF0D9BE4FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF46B8 + F2FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF + F4FF59BFF4FF59BFF4FF6A9FBBFF818080FF828080FF818080FF7C7B7BFF648C + A1FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF + F4FF59BFF4FF54BDF3FF12A4EFFF0EA3EFFF0EA2EEFF0EA1ECFF0D9DE6FF0C94 + D9FF5993AAFF4F4F4FFF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF2120209600000029000000030000 + 0000000000000000000000000000000000002D2C2C79494747FF494747FF4947 + 47FF656E6EFF43A2CCFF0C97DDFF0D9EE8FF0EA1EDFF0EA2EEFF15A5EFFF63C3 + F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3 + F4FF64C3F4FF64C3F4FF80939EFF8A8888FF8A8888FF898888FF7E7D7DFF67B1 + D7FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3 + F4FF64C3F4FF64C3F4FF2AADF0FF0EA3EFFF0EA2EEFF0D9FEAFF0D99E1FF2096 + D0FF697577FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF3F3D3DE10000003F0000000E0000 + 0000000000010000000000000000000000000D0D0D15484646F6494747FF4947 + 47FF4F4F4FFF789BA4FF1293D5FF0D9AE3FF0EA0EBFF0EA2EEFF23ABF0FF6EC8 + F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF70C3EDFF74BDE2FF75BE + E3FF75BEE3FF77BADCFF919091FF929191FF929191FF8F8E8EFF7E8C94FF6EC8 + F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8 + F5FF6EC8F5FF6EC8F5FF3CB4F2FF0EA2EEFF0EA1ECFF0D9CE5FF0C93D8FF5B95 + ACFF515252FF494747FF4D4D4DFF535454FF545555FF545555FF545555FF5455 + 55FF535555FF4F5050FF4A4848FF494747FF494747FF16151579000000210000 + 000200000001000000000000000000000000000000004846468F494747FF4947 + 47FF494747FF616767FF56A5C6FF0C95DAFF0D9DE6FF0EA1ECFF23AAF0FF7ACC + F6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF82B5CFFF989797FF9B99 + 99FF9B9999FF9B9999FF9B9999FF9B9999FF9A9999FF949393FF80ADC3FF7ACC + F6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACC + F6FF7ACCF6FF7ACCF6FF3EB5F2FF0EA1EDFF0D9EE8FF0C97DEFF3199CAFF656E + 6EFF494747FF4B4949FF5E8FA5FF7BBBD8FF7CBDD9FF7CBDD9FF7CBDD9FF7CBD + D9FF7CBCD9FF7896A3FF4F4F4FFF494747FF494747FF353333C8000000370000 + 00090000000100000000000000000000000000000000575D5D18484646F24947 + 47FF494747FF4C4B4BFF758889FF2C9BD0FF0D97DEFF0D9EE8FF13A3EDFF80CE + F6FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF8CBBD3FFA1A0A0FFA3A2 + A2FFA3A2A2FFA3A2A2FFA3A2A2FFA3A2A2FFA2A1A1FF979898FF86CAEDFF85D0 + F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0 + F7FF85D0F7FF85D0F7FF2CADEFFF0D9FE9FF0D99E1FF1694D4FF6B8992FF4D4C + 4CFF494747FF4B4949FF609AB3FF80D1F7FF83CAEBFF81B8CDFF79ADC3FF78AC + C2FF78ACC2FF718B95FF4E4E4EFF494747FF494747FF484646FD0B0B0B5E0000 + 0019000000010000000000000000000000000000000000000000748B8B744947 + 47FF494747FF494747FF525353FF789BA4FF1A96D4FF0D99E0FF0D9EE8FF5EC0 + F2FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF96C1D7FFA7A6A6FFA8A8 + A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA6A5A5FF98AEB9FF90D4F7FF90D4 + F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4 + F7FF90D4F7FF7CCCF5FF10A0EAFF0D9AE3FF0E93D6FF6197ABFF545656FF4947 + 47FF494747FF494747FF545C5FFF72BFE2FF80D0F5FF83A1ABFF595D5DFF4F50 + 50FF4F4F4FFF4D4C4CFF494747FF494747FF494747FF494747FF2A2929AD0000 + 002C000000040000000000000000000000000000000000000000B6F3F3045052 + 52CB494747FF494747FF494747FF585B5BFF72A3B2FF1394D5FF0D99E0FF1DA4 + E9FF8FD3F6FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9EC3D6FFA5A4A4FFA5A5 + A5FFA5A5A5FFA5A5A5FFA5A5A5FFA5A5A5FFA4A4A4FF9DC8DEFF9BD8F8FF9BD8 + F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8 + F8FF99D7F7FF36AFEDFF0D9AE3FF0C93D7FF559BB8FF5C6161FF494747FF4947 + 47FF494747FF494747FF4A4848FF596E75FF78CAF0FF82CDF0FF76878BFF4E4E + 4EFF494747FF494747FF494747FF494747FF494747FF494747FF444242EF0101 + 013E0000000B000000000000000000000000000000000000000000000000A0D1 + D127484646F3494747FF494747FF494848FF5C6161FF71A4B4FF1595D5FF0D98 + DFFF33ACEAFF9FD9F7FFA6DCF8FFA6DDF9FFA6DDF9FFA7D1E7FFA8C2D0FFA8C2 + D0FFA8C2D0FFA8C2D0FFA8C2D0FFA8C2D0FFA8C3D0FFA6DCF8FFA6DDF9FFA6DD + F9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DCF9FFA5DB + F8FF53BAEEFF0D9AE1FF0D93D7FF559CBAFF606667FF4A4848FF494747FF4947 + 47FF494747FF494747FF494747FF4C4B4BFF5F8493FF7DD0F6FF85C6E4FF6B74 + 75FF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF1514 + 146F000000120000000000000000000000000000000000000000000000000000 + 000083A3A355494747FE494747FF494747FF4A4848FF5B5F5FFF76A0ACFF2198 + D2FF0C96DCFF30A9E8FF9CD7F6FFB1E0F9FFB1E1F9FFB1E1FAFFB1E1FAFFB1E1 + FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1 + FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1F9FFB1E0F9FFAADDF7FF4BB5 + ECFF0D98DFFF1294D5FF609BB2FF5E6464FF4A4848FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4E4E4EFF669DB4FF80D0F7FF85B9 + D1FF606666FF4A4949FF494747FF494747FF494747FF494747FF494747FF2625 + 259D000000160000000000000000000000000000000000000000000000000000 + 00000000000032607879494747FF494747FF494747FF494747FF555757FF7993 + 98FF3FA0CDFF0C93D7FF179DE1FF6DC3EFFFB4E1F8FFBBE4F9FFBBE5FAFFBBE5 + FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5 + FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE4F9FFBAE3F9FF84CDF2FF26A4E4FF0C94 + DAFF2999CFFF6C939EFF575B5BFF494848FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF535656FF8DC0D6FFA4DE + F9FF92AEB9FF565959FF494747FF494747FF494747FF494747FF494747FF3130 + 30B1000000140000000000000000000000000000000000000000000000000000 + 0000000000000000000032607887494747FF494747FF494747FF494747FF4E4E + 4EFF6C7778FF6AA4B8FF2499D2FF0C94D9FF1FA0E2FF66C0EDFFA5DBF6FFC5E8 + FAFFC5E8FAFFC5E8FBFFC5E8FBFFC5E9FBFFC5E9FBFFC5E9FBFFC5E8FBFFC5E8 + FBFFC5E8FAFFC5E8FAFFB3E1F8FF76C7F0FF2FA7E5FF0C95DBFF1695D4FF549D + BCFF6D7C7DFF505050FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF5B6568FFA4D5 + ECFFB0E0F7FF7A8688FF4C4B4BFF494747FF494747FF494747FF494747FF302F + 2FAA0000000D0000000000000000000000000000000000000000000000000000 + 000000000000000000000000000032607876494747FE494747FF494747FF4947 + 47FF4A4848FF565959FF76888AFF63A3BCFF2B9CD2FF0C92D7FF0C96DCFF24A2 + E3FF50B6EAFF71C4EFFF88CEF2FF96D4F4FF9DD7F5FF99D5F4FF8CD0F3FF78C7 + F0FF58B9EBFF2FA7E5FF0F98DEFF0C93D8FF1D97D3FF529FBFFF728A8FFF585C + 5CFF4A4949FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF515252FF5A5E5EFF525353FF494747FF4B4949FF7E9B + A6FFBAE6FBFF99B1BAFF515151FF494747FF494747FF494747FF494747FF2423 + 2387000000060000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002A698950494747F0494747FF4947 + 47FF494747FF494747FF4B4949FF565959FF717E7FFF729DA9FF53A3C5FF2E9D + D2FF1193D4FF0C92D7FF0C94D9FF0C95DAFF0C95DBFF0C95DBFF0C94DAFF0C93 + D8FF0E92D5FF2599D2FF48A0C7FF679AACFF718183FF585B5BFF4B4A4AFF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4A4949FF8EAFBEFFBFE5F7FF839195FF4D4D4DFF4A4848FF768B + 92FFC4E9FBFFA1B8C0FF525353FF494747FF494747FF494747FF494747FF1312 + 1240000000010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000074B4C422575E5EC24947 + 47FF494747FF494747FF494747FF494747FF494848FF4E4E4EFF5A5E5EFF6C77 + 77FF7A8F91FF7399A4FF689DB0FF619FB7FF5E9FB9FF5F9FB7FF659DB1FF6E98 + A5FF788F93FF6E7979FF5B5F5FFF4F4F4FFF4A4848FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF4A4848FF8198A0FFCDECFCFFB5CDD7FF6B7474FF626A6BFFAECC + D9FFCDECFCFF91A2A7FF4E4E4EFF494747FF494747FF494747FF3E3C3CCA0000 + 0006000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000099C5C5016675 + 7563494747E7494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF4A4848FF4C4B4BFF4F4F4FFF515151FF525353FF515252FF4F4F4FFF4C4C + 4CFF4A4949FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF55595AFFB4D0DCFFD6F0FCFFCEE9F5FFCFEAF7FFD6F0 + FCFFB9D0D9FF626767FF4A4848FF494747FF494747FF484646FA1414143A0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00004947470C49474776494747E4494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494848FF56595AFF87979CFFA3B3B9FFA3B4B9FF8C9A + 9EFF5E6364FF4C4A4AFF494747FF494747FF494747FE2A282867000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000004947470549474752494747AD494747F6494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF4A4949FF4D4C4CFF4D4D4DFF4B4A + 4AFF494747FF494747FF494747FF484646E93533335000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000049474709494747434947 + 477C494747AB494747CF494747E9494747FA494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747F1494747C1484646704442420D0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF8001FFFFFFFFFFFC00003FFFFFFFFFF0000007FFFFFFFFC + 0000003FFFFFFFF80000000FFFFFFFE000000007FFFFFFC000000003FFFFFF80 + 00000001FFFFFF0000000000FFFFFE00000000007FFFFC00000000003FFFFC00 + 000000001FFFF800000000001FFFF000000000000FFFF000000000000FFFE000 + 0000000007FFE0000000000007FFE0000000000003FFC0000000000003FFC000 + 0000000001FFC0000000000001FF80000000000001FF80000000000000FF8000 + 0000000000FF800000000000007F800000000000007F800000000000003F8000 + 00000000003F800000000000003F800000000000001F800000000000001F8000 + 00000000000FC00000000000000FC000000000000007C000000000000007C000 + 000000000007E000000000000003E000000000000002E000000000000000F000 + 000000000000F000000000000000F800000000000000F800000000000000FC00 + 000000000000FE00000000000000FF00000000000000FF80000000000000FFC0 + 000000000000FFE0000000000000FFF0000000000001FFF8000000000003FFFE + 000000000007FFFF80000000000FFFFFF0000000001FFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF2800000030000000600000000100200000000000802500000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000200000008000000110000001A000000210000 + 002400000025000000230000001D000000140000000B00000004000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000A09 + 0901000000090000001B000000310404044B1110106F1B1A1A8C2221219D2322 + 22A1232222A1201F1F98161616830B0B0B640101014700000036000000210000 + 000C050404020000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000A0A0A0A0000 + 0024080707502221219B393838D5464444F7484646FE494747FF484646FE4846 + 46FE494747FF484646FE484646FE484646FD424040EB2E2D2DBD1414147E0000 + 00470000002C0606060F29282801000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000191818040000001C0C0C0C59302E + 2EBD484646FA494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF3F3D + 3DE41E1D1D950101014A000000250F0E0E070000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000202B2B0904040435292828A9474545F94846 + 46FE484646FE494747FE4A4949FF525353FE5D6566FE5E7379FF5B7B87FE5B7F + 8DFE5A7D8AFF5B757EFE5E6A6CFE565858FF4C4B4BFE494747FE494747FF4846 + 46FE484646FE3C3B3BDE12111178000000380C10100F00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000001C1C1C0D0D0D0D533E3C3CDF484646FE494747FF4947 + 47FE4F5050FE617073FE548CA3FF439CC5FE32A0D7FE2FA3DDFF31A5E0FE33A6 + E1FE32A6E1FF30A4DFFE2FA0DAFE399DCEFF4990B0FE5A7884FE555757FF4948 + 48FE484646FE494747FF474545FB262525A7010101430A0A0A15467287010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001A1A1A0D16151568454343F3494747FF494747FF4D4D4DFF6174 + 79FF4C97B9FF2DA0D9FF31A7E3FF36ACE8FF3AAFEBFF3CB2EDFF3EB3EEFF3FB3 + EFFF3FB3EFFF3EB3EEFF3DB1EDFF3AAEEAFF35AAE6FF2BA2DEFF3A9AC9FF567F + 8FFF535555FF494747FF494747FF494747FF323131C50202024A000407160000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00002531310816161665464444F6484646FE494747FF585C5CFE588FA6FF2C9E + D7FE2DA6E4FE33ADEBFE37B0EEFF39B2F0FE3AB3F1FE3BB4F1FF3BB4F1FE3CB4 + F1FE3CB4F2FF3CB4F1FE3DB4F1FE3CB4F1FF3BB3EFFE38B0EDFE33ABE8FF29A1 + DEFE3E95BDFE5A6A70FF4A4949FE494747FF484646FE353333CB02020248080A + 0A11000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004F6A + 6A030E0E0E4A464444F4494747FF494747FF5E6869FF4699BEFF24A0DFFF2BA9 + E9FF30AEEEFF32B0F0FF33B1F1FF34B1F1FF34B1F1FF35B1F1FF35B2F1FF35B2 + F1FF36B2F1FF36B2F2FF37B2F2FF37B2F2FF37B3F1FF37B2F1FF36B1F0FF33AD + ECFF2BA6E4FF2C9AD1FF597884FF4C4B4BFF494747FF494747FF302F2FBF0000 + 003A171D1D090000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000505 + 0524403E3EE0494747FF494747FE5F6A6BFE3C9AC7FF21A0E1FE27A9EBFF2AAC + EFFE2BAEF0FE2BAEF0FE2CAEF1FF2CAEF0FE2DAFF0FE2DAFF1FF2EAFF0FE2EAF + F0FE2EAFF1FF2FAFF0FE30B0F0FE30B0F1FF30B0F1FE31B0F1FE31B0F1FF31AF + F0FE2FADEEFE29A7E7FF249BD7FE577C8BFF4B4A4AFE484646FE494747FF2221 + 219C000000292221210200000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000D0D0D092E2D + 2DA6484646FE494747FF5B6061FE4299C2FE1C9EE1FF21A7EBFE24AAEFFF24AB + F0FE25ABF0FE25ABF0FE26ACF0FF26ACF0FE26ACF0FE27ACF0FF27ACF0FE27AC + F0FE28ADF1FF28ADF0FE29ADF0FE29ADF1FF31A0DAFE30A3DEFE2AAEF1FF2AAE + F0FE2AADF0FE29ACEEFF24A5E7FE2299D5FF5A747EFE4A4848FE494747FF4644 + 44F80D0D0D650101011300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000111111474846 + 46FB484646FE505151FF5594AFFE179BDDFE1BA4EAFF1DA8EFFE297298FF4364 + 75FE48697AFE48697AFE2C94CAFF20A9EFFE20AAEFFE21AAF0FF21AAF0FE21AA + F0FE22AAF0FF22AAF0FE23ABF0FE23ABF0FF476E82FE58595AFE4C6D7FFF398C + B7FE28A7E8FE25ABF0FF24A9EDFE1EA2E5FF2A96CBFE596365FE494747FF4846 + 46FE373535CF000000331E1D1D03000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000007393737C34947 + 47FF4A4848FF658088FF1A98D8FF16A0E8FF17A5EEFF18A7EFFF1B93D0FF3C3E + 3FFF504E4EFF525050FF45616FFF1BA6EDFF1AA7F0FF1AA7F0FF1BA8F0FF1BA8 + F0FF1BA8F0FF1CA8F0FF1CA8F0FF239BD9FF525354FF555353FF555353FF5553 + 53FF53575AFF42728AFF298EC2FF1DA6ECFF189DE0FF448DAEFF4E4E4EFF4947 + 47FF484646FE1514147605040411000000000000000000000000000000000000 + 000000000000000000000000000000000000000000001111113E484646FE4947 + 47FE565959FE3F9AC4FF109BE2FE13A3ECFE13A5EFFF14A5EFFE14A5EFFF225E + 7CFE464444FE4E4C4CFE4E4C4CFF2A82B0FE16A6EFFE16A6EFFF16A6EFFE16A6 + EFFE17A6EFFF17A6EFFE17A6EFFE337699FF504E4EFE514F4FFE504E4EFF504E + 4EFE514F4FFE4D4C4CFF2B627FFE19A6EFFF17A1E8FE1796D7FE5B7179FF4947 + 47FE484646FE353434CA000000282D2B2B010000000000000000000000000000 + 000000000000000000000000000000000000000000022E2D2D9E494747FF4947 + 47FE67828AFE1095D8FF0F9FE8FE10A3EEFE10A3EFFF10A4EEFE10A4EFFF1297 + DBFE31393EFE494747FE4B4949FF44525AFE149FE5FE12A4EFFF12A4EEFE12A4 + EEFE12A4EFFF13A4EFFE14A2EBFE465158FF4D4B4BFE4C4A4AFE3B3A3AFF3534 + 34FE424141FE3E3D3EFF198BC5FE15A5EFFF14A3ECFE109AE1FE408EB2FF4D4D + 4DFE484646FE484646FC090808510F0F0F090000000000000000000000000000 + 0000000000000000000000000000000000000303030B444242E8494747FF4F50 + 50FF4C98B9FF0D99E0FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF19668EFF3F3D3DFF494747FF494747FF2C7297FF0FA3EFFF0FA3EFFF0FA3 + EFFF0FA3EFFF0FA3EFFF2183B5FF4A4848FF4A4848FF454343FF205F7FFF1569 + 93FF1D3642FF1E3C4CFF11A3EEFF11A4EFFF10A3EEFF0E9DE7FF1895D3FF5C65 + 66FF494747FF494747FF272525A50000001E0000000000000000000000000000 + 00000000000000000000000000000000000011101038484646FE494747FF5F66 + 66FE299AD1FE0D9CE6FF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 + EEFE0E9CE5FE2A3B44FE464444FF484646FE46494CFE1497DAFF0EA2EEFE0EA2 + EEFE0EA3EFFF0EA2EEFE365E73FE494747FF494747FE393939FE1191D3FF0EA2 + EEFE0EA1EDFE0F97DCFF0FA3EEFE0EA3EFFF0EA2EEFE0EA0EAFE0C96DCFF557D + 8EFE494747FE494747FF424040EC0303033E1B1A1A0500000000000000000000 + 0000000000000000000000000000000000002120206B484646FE494747FF687F + 85FE1095D8FE0D9FE9FF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 + EEFE0DA2EEFE1573A3FE3B3939FF484646FE484646FE336680FF0DA2EEFE0DA2 + EEFE0EA3EFFF1496D8FE464749FE494747FF464444FE274C5FFE0EA3EFFF0DA2 + EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA1ECFE0D99E1FF438C + AEFE4B4A4AFE494747FF484646FE1B1B1B880000001500000000000000000000 + 0000000000000000000000000000000000002E2C2C92494747FF4A4848FF618C + 9CFF0C96DCFF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA1EDFF264150FF454343FF494747FF484748FF1B8CC6FF0EA3 + EFFF0EA3EFFF297399FF484646FF494747FF403E3EFF1776A6FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0D9BE4FF3494 + C2FF505151FF494747FF494747FF3A3939D70000003024232302000000000000 + 000000000000000000000000000000000000313030AA484646FE4B4A4AFF5893 + ABFE0D98DFFE0EA1ECFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 + EEFE0DA2EEFE0DA2EEFE1380B7FF373737FE484646FE494747FF3A5A6BFE0EA1 + ECFE0EA1ECFF3E525DFE484646FE484646FF323B41FE0E9CE4FE0EA3EFFF0DA2 + EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EEFE0D9DE6FF2796 + CCFE555858FE494747FF484646FE484646FD1110106A0707070E000000000000 + 000000000000000000000000000000000000323030B1484646FE4C4B4BFF5496 + B2FE0D98E0FE0EA1ECFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 + EEFE0DA2EEFE0DA2EEFE0EA2EEFF214C62FE434141FE494747FF484646FE2281 + B1FE188ECAFF474546FE484646FE444343FF205C7BFE0DA2EEFE0EA3EFFF0DA2 + EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EEFE0D9DE7FF2196 + D0FE595D5DFE494747FF484646FE484646FE302E2EBD00000025302F2F010000 + 000000000000000000000000000000000000323030B1494747FF4C4B4BFF5596 + B1FF0D98E0FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF118CCAFF333537FF484646FF494747FF4150 + 59FF2D6F91FF484646FF484646FF3B3A3BFF1287C3FF0EA3EFFF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9DE7FF2296 + D0FF595D5DFF494747FF494747FF494747FF474545F90707074E100F0F090000 + 000000000000000000000000000000000000323030A9484646FE4B4A4AFF5B94 + AAFE0D97DEFE0EA1ECFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 + EEFE0DA2EEFE0DA2EEFE0EA3EFFF0EA3EFFE205A77FE464545FF4F4D4DFE504E + 4EFE4F4F50FF4E4C4CFE4B4949FE2C4654FF0EA2EDFE0DA2EEFE0EA3EFFF0DA2 + EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EEFE0D9CE6FF2A96 + CBFE555858FE494747FF484646FE484646FE494747FF252424A10000001C0000 + 0000000000000000000000000000000000002F2D2D8F484646FE494848FF658D + 9BFE0C95DBFE0DA0EAFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 + EEFE0DA2EEFE13A5EFFE1FA9F0FF26ACF0FE29A1DEFE464B4FFF5B5A5AFE5D5B + 5BFE5D5B5BFF5D5B5BFE575555FE327CA2FF22AAF0FE19A7EFFE0EA3EFFF0DA2 + EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EDFE0D9BE4FF3895 + C0FE505050FE494747FF484646FE484646FE494747FF413F3FE90202023B1918 + 18050000000000000000000000000000000023222268494747FF494747FF6B7F + 83FF1395D7FF0D9EE8FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF11A4 + EFFF27ACF0FF33B1F1FF34B1F1FF34B1F1FF34B1F1FF3D7D9DFF5C5B5BFF6563 + 63FF656363FF656363FF555759FF35A8E3FF34B1F1FF34B1F1FF2FAFF1FF19A7 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1ECFF0D99E0FF488D + ABFF4B4A4AFF494747FF494747FF494747FF494747FF494747FF1A1919840202 + 02140000000000000000000000000000000012111133484646FE494747FF5E64 + 64FE319DD0FE0D9CE5FF0DA2EDFE0DA2EEFE0EA3EFFF0DA2EEFE14A5EFFF38B3 + F1FE3FB6F2FE3FB6F2FE40B6F2FF3FB6F2FE3FB6F2FE40B0E9FF5D696FFE6E6D + 6DFE6F6D6DFF6C6A6AFE51778BFE40B6F2FF3FB6F2FE3FB6F2FE40B6F2FF3FB5 + F2FE23ABF0FE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0D9FEAFE0C95DBFF5C7E + 8BFE494747FE494747FF484646FE484646FE494747FF484646FE393737D40000 + 002F0000000200000000000000000000000003030305464444E8494747FF4F4F + 4FFE559AB7FE0D98DFFF0DA0EBFE0DA2EEFE0EA3EFFF0FA3EFFE40B5F2FF4DBA + F3FE4DBAF3FE4DBAF3FE4DBAF3FF4DBAF3FE4DBAF3FE4DBAF3FF648FA6FE7877 + 77FE787777FF706F6FFE529FC7FE4DBAF3FF4DBAF3FE4DBAF3FE4DBAF3FF4DBA + F3FE4CBAF3FE1EA9F0FF0DA2EEFE0EA3EFFF0DA2EDFE0D9DE6FE2097D1FF5D63 + 63FE484747FE494747FF484646FE484646FE494747FF484646FE484646FD0F0F + 0F660000000D00000000000000000000000000000000302F2F98494747FF4947 + 47FF6D8287FF1596D7FF0D9DE7FF0EA2EEFF0EA3EFFF29ADF0FF5BC0F4FF5BC0 + F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BBFF2FF7C888EFF8382 + 82FF828181FF717C82FF5BBEF0FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0 + F4FF5BC0F4FF4BBAF3FF0EA3EFFF0EA2EEFF0DA0EBFF0D98DFFF4B90AEFF4C4C + 4CFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2F2D + 2DBA000000240000000100000000000000000000000016151533494747FE4846 + 46FE545757FE4C9EC2FF0D98E0FE0DA0EBFE0EA2EEFF47B8F2FE69C5F5FF69C5 + F5FE69C5F5FE69C5F5FE69C5F5FF69C5F5FE69C5F5FE70B9DEFF8D8C8CFE8D8C + 8CFE8A8989FF729EB5FE69C5F5FE69C5F5FF69C5F5FE69C5F5FE69C5F5FF69C5 + F5FE69C5F5FE67C4F5FF15A5EFFE0EA2EDFF0D9DE6FE1A96D3FE607074FF4947 + 47FE4A4949FE4B4A4AFF4B4A4AFE4B4A4AFE4B4A4AFF4A4848FE494747FE4745 + 45F80606064B0000000800000000000000000000000000000000484646BB4947 + 47FF494747FF6B7F84FF1E98D5FF0D9CE5FF0EA1EDFF53BDF3FF78CBF6FF78CB + F6FF78CBF6FF78CBF6FF84AFC6FF959DA2FF959EA3FF979B9FFF999898FF9998 + 98FF909091FF7AC0E4FF78CBF6FF78CBF6FF78CBF6FF78CBF6FF78CBF6FF78CB + F6FF78CBF6FF77CBF6FF19A6EFFF0D9FEAFF0D96DDFF518FA9FF4D4D4DFF4C4E + 4FFF699BB1FF75A7BCFF75A7BCFF75A7BCFF75A6BCFF687B82FF4A4848FF4947 + 47FF2322229D0000001B000000010000000000000000000000005C6565384846 + 46FB484646FE4F4F4FFF6397AAFE0F95DAFE0D9EE8FF45B7F1FE87D1F7FF87D1 + F7FE87D1F7FE87D1F7FE93B5C7FFA3A2A2FEA4A3A3FEA4A3A3FFA4A3A3FEA3A2 + A2FE93A5AEFF87D1F7FE87D1F7FE87D1F7FF87D1F7FE87D1F7FE87D1F7FF87D1 + F7FE87D1F7FE78CBF5FF10A1EBFE0D99E1FF3396C5FE5A6061FE494747FF4D4E + 4FFE70BBDCFE82CDF0FF7EA9BAFE7098A9FE7098A8FF647278FE494848FE4947 + 47FF413F3FE80202023900000004000000000000000000000000000000006777 + 7799484646FE494747FF595D5DFE539EBDFE0D96DCFF19A3E9FE8AD1F6FF95D6 + F7FE95D6F7FE95D6F7FE9DBBCAFFA7A6A6FEA7A6A6FEA7A6A6FFA7A6A6FEA6A5 + A5FE99C2D7FF95D6F7FE95D6F7FE95D6F8FF95D6F7FE95D6F7FE95D6F8FF95D6 + F7FE95D6F7FE49B7EFFF0D9AE2FE2397CFFF627378FE494848FE494747FF4947 + 47FE586C74FE7ACAEFFF80ABBEFE545656FE4A4848FF494747FE494747FE4947 + 47FF484646FE1817177C0000000E00000000000000000000000000000000B0EA + EA10515353DB494747FF494747FF5F6667FF4D9FC2FF0D96DCFF38AEEBFFA0DA + F7FFA4DCF8FFA4DCF8FFA6C9DAFFA7BBC5FFA7BBC5FFA7BBC5FFA7BBC5FFA7BB + C5FFA4DAF5FFA4DCF8FFA4DCF8FFA4DCF9FFA4DCF8FFA4DCF8FFA4DCF9FFA4DC + F8FF74C7F2FF0F9BE2FF2297D0FF627C84FF4B4949FF494747FF494747FF4947 + 47FF4A4848FF5F8493FF7FCFF5FF79959FFF4E4D4DFF494747FF494747FF4947 + 47FF494747FF313030BD0000001A000000000000000000000000000000000000 + 00009DCBCB30484748F2484646FE494747FE5E6464FF599DB8FE1296D8FF36AB + E7FE9ED8F6FEB2E1F9FEB2E2FAFFB2E2F9FEB2E2F9FEB2E2FAFFB2E2F9FEB2E2 + F9FEB2E2FAFFB2E2F9FEB2E2F9FEB2E2FAFFB2E2F9FEB2E1F9FEAFE0F8FF69C2 + EFFE1199DEFE3098C9FF63777DFE4B4A4AFF484646FE484646FE494747FF4846 + 46FE484646FE4C4B4BFF6B9EB5FE8AD0F0FE718085FF4B4949FE484646FE4947 + 47FF484646FE413F3FE701010121000000000000000000000000000000000000 + 00000000000021729B4A484849F6484646FE494747FF555858FE69919EFF2C9B + D0FE179BDEFE62BEEDFEABDDF7FFC0E6FAFEC0E6FAFEC0E7FAFFC0E7FAFEC0E7 + FAFEC0E7FAFFC0E7FAFEC0E7FAFEC0E6FAFFBBE4F9FE86CEF2FE32A8E4FF1596 + D7FE4F96B4FE5F6869FF4A4848FE494747FF484646FE484646FE494747FF4846 + 46FE484646FE494747FF515354FE93C1D5FEA7D2E6FF606565FE494747FE4947 + 47FF484646FE464444F10303031F000000000000000000000000000000000000 + 0000000000000000000021729B49484748F1494747FF494747FF4C4B4BFF6570 + 72FF5E99B0FF2B9CD2FF1197DBFF39ABE5FF68C0EDFF8ACFF2FF9ED7F5FFA7DB + F6FFA3DAF6FF94D3F4FF78C7F0FF4FB5E9FF1E9EDFFF1696D6FF469ABFFF657E + 86FF515252FF494747FF494747FF494747FF494747FF494747FF494747FF4A48 + 48FF535555FF515252FF494747FF606C70FFB5E3F8FF86979DFF4A4848FF4947 + 47FF494747FF413F3FE00000000F000000000000000000000000000000000000 + 00000000000000000000000000001D77A52D444B50D7484646FE494747FF4947 + 47FE4D4D4DFE636B6CFE688E9AFF4F9BBCFE359DCEFE1E98D5FF1396D7FE1195 + D8FE1295D8FF1897D6FE2A9BD1FE429BC3FF5B91A6FE68787BFE525353FF4947 + 47FE484646FE494747FF484646FE494747FF484646FE484646FE494747FF4F51 + 52FEB4DBEDFE99AEB6FF4F4F4FFE595F60FEBFE5F6FF8FA0A6FE4A4949FE4947 + 47FF484646FE2F2D2DA000000003000000000000000000000000000000000000 + 000000000000000000000000000000000000A5E4E80D7084848F494848F84846 + 46FE484646FE494747FE4A4848FF4F5050FE5A5F5FFE677071FF6B7B7EFE6A7E + 83FE6A7C80FF687476FE5F6565FE535454FF4B4A4AFE494747FE494747FF4846 + 46FE484646FE494747FF484646FE494747FF484646FE484646FE494747FF4B4A + 4AFE9EB7C2FECBE6F3FF9CAFB5FEB1CAD4FECCE8F5FF707779FE494747FE4947 + 47FF474545F60F0E0E2E00000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000004947472A4947 + 47A7494747FA494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 + 47FF535656FF93A4AAFFB1C3CAFFAABCC3FF788284FF4D4C4CFF494747FF4947 + 47FE262424690000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00004846461C48464676494747C8484646F7484646FE494747FF484646FE4846 + 46FE494747FF484646FE484646FE494747FF484646FE484646FE494747FF4846 + 46FE484646FE494747FF484646FE494747FF484646FE484646FE494747FF4846 + 46FE494747FE4A4848FF4C4B4BFE4B4A4AFE494747FF484646FE474545E03C3B + 3B52000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000A3A2A211A3A2A23BA4A3A35FA3A2A276A3A2 + A27FA4A3A37FA3A2A27FA3A2A27FA4A3A37FA3A2A27FA3A2A27FA4A3A37FA3A2 + A27FA3A2A27FA4A3A37FA3A2A27FA4A3A37FA3A2A27FA3A2A27FA4A3A37FA3A2 + A27FA3A2A27FA4A3A37FA3A2A27FA3A2A27FA4A3A377A3A2A248A3A2A2080000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF + FFFFFFFF0000FFFE001FFFFF0000FFF00003FFFF0000FFE00000FFFF0000FF80 + 00007FFF0000FF0000003FFF0000FE0000000FFF0000FC0000000FFF0000F800 + 000007FF0000F000000003FF0000F000000001FF0000E000000001FF0000E000 + 000000FF0000C000000000FF0000C0000000007F000080000000007F00008000 + 0000007F000080000000003F000080000000003F000080000000001F00008000 + 0000001F000080000000000F000080000000000F000080000000000F00008000 + 000000070000800000000007000080000000000300008000000000030000C000 + 000000010000C000000000010000E000000000000000E000000000000000F000 + 000000000000F000000000000000F800000000000000FC00000000000000FE00 + 000000000000FF00000000000000FF80000000010000FFE0000000030000FFF8 + 000000070000FFFF0000000F0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF + FFFFFFFF0000FFFFFFFFFFFF0000280000002000000040000000010020000000 + 0000801000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000030000 + 000E0000001F0000002D00000033000000340000002F00000022000000110000 + 0004000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000252424040404041F121212672928 + 28AD393838D8444242F0484646F9474545F8414040EB353333CE2221219F0909 + 0958020202251F1F1F0700000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000B0B0B14181818763D3B3BDF494747FF4947 + 47FF494747FF4C4B4BFF4F4F4FFF4E4D4DFF4B4949FF494747FF494747FF4846 + 46FD323030C60B0B0B5F0606061A526262010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000BBC3C3011011112D343232C4494747FF494848FF565C5EFF507B + 8EFF4892B5FF429FCBFF40A3D4FF40A2D1FF439AC3FF4888A5FF526D78FF4E4E + 4EFF494747FF474545FA2221219D0304042A6183900300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000151515363F3E3EE3494747FF545858FF4D88A3FF33A2DAFF34AB + E7FF39B0EDFF3DB3EFFF3EB4F0FF3EB4F0FF3DB3EEFF3AAFEBFF31A8E4FF3A9A + C8FF51717EFF4B4A4AFF494747FF2F2D2DBD0103042F7FABAB02000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001E262625403E3EE2494747FF57696FFF379BCCFF2BA8E7FF32AFEFFF35B1 + F1FF35B2F1FF36B2F1FF37B2F1FF37B3F1FF38B3F2FF38B3F1FF38B2F1FF35AF + EDFF2BA4E2FF4488A8FF4F5050FF494747FF2E2C2CBA090C0C23000000000000 + 000000000000000000000000000000000000000000000000000000000000292E + 2E08363434C2494747FF586B71FF2B9DD5FF25A8EBFF29ACF0FF2AADF1FF2AAE + F1FF2BAEF1FF2CAEF1FF2CAEF1FF2DAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FAF + F1FF2EAEEFFF27A6E6FF3C8DB3FF4E4F4FFF494747FF1F1E1E920F0F0F0F0000 + 0000000000000000000000000000000000000000000000000000000000001E1D + 1D6B494747FF565C5EFF2E99CEFF1CA4EAFF2491C8FF397D9FFF3C7FA1FF26A1 + DFFF22AAF0FF22AAF0FF23ABF0FF23ABF0FF24ABF0FF29A3E1FF4E6A79FF3D88 + AEFF2BA5E3FF26ABEFFF1FA2E5FF4583A0FF4A4848FF464444F6080808493230 + 30010000000000000000000000000000000000000000000000000101010B4240 + 40E44B4949FF478DADFF149FE6FF16A5EFFF189EE1FF3D464BFF514F4FFF3B6E + 89FF19A7F0FF19A7F0FF1AA7F0FF1AA7F0FF1BA8F0FF357DA2FF545252FF5452 + 52FF535455FF40687DFF1E9EDEFF1A9BDDFF526871FF494747FF2C2A2AB21413 + 130F0000000000000000000000000000000000000000000000001A19195B4947 + 47FF5B686BFF1799DAFF10A2ECFF11A4EFFF11A4EFFF1D6E98FF474545FF4B4A + 4AFF1E91CBFF13A4EFFF13A5EFFF14A5EFFF15A4EDFF45555EFF4D4B4BFF3F3D + 3DFF454343FF384B55FF16A5EEFF14A1E9FF358CB6FF4B4949FF464444F60403 + 0333000000000000000000000000000000000000000000000000333131AD4947 + 47FF4C87A0FF0D9CE5FF0EA2EEFF0EA3EFFF0EA3EFFF0E9FE9FF30424CFF4947 + 47FF3B5B6DFF0FA3EEFF0FA3EFFF0FA3EFFF1F88BEFF4A4848FF454343FF1874 + A3FF176288FF16709EFF10A3EFFF0FA2EDFF1297DBFF555F62FF494747FF1F1E + 1E8D21202007000000000000000000000000000000009F9F9F02444242E74D4C + 4CFF3798C6FF0D9FEAFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1678AAFF4240 + 40FF484646FF2183B5FF0EA3EFFF0EA3EFFF34637BFF484646FF34444DFF0EA1 + ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9BE3FF497588FF494747FF3D3C + 3CE00404042000000000000000000000000000000000A6A6A610494747FF5558 + 58FF239CD7FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF2A49 + 5AFF484646FF41515BFF0F9FE9FF129AE0FF464849FF474545FF1F678DFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9DE7FF3E82A2FF494747FF4947 + 47FF1413136B2B2A2A03000000000000000000000000A8A8A821494747FF5D62 + 62FF1799DBFF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1385 + BFFF3E3D3DFF494747FF29769EFF247AA7FF484646FF3F3E3FFF1192D4FF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0D9FE9FF3989AFFF494747FF4947 + 47FF333131C60C0C0C15000000000000000000000000A8A8A820494747FF5C61 + 61FF189ADBFF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 + EFFF24536CFF474545FF454B4FFF3C5968FF484646FF2C5165FF0EA3EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0D9EE9FF3A89AFFF494747FF4947 + 47FF484646FC0A09094A353434010000000000000000A7A6A60F494747FF5557 + 57FF269CD6FF0DA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF10A3EFFF1AA7 + EFFF2498D4FF4D4E50FF5B5959FF5A5858FF565454FF2981AEFF17A6EFFF0EA3 + EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9DE7FF4083A1FF494747FF4947 + 47FF494747FF282727A81616160D000000000000000000000000454343E74C4C + 4CFF3B99C4FF0D9FEAFF0EA3EFFF0EA3EFFF0EA3EFFF20AAF0FF35B1F1FF36B2 + F1FF36B2F1FF457A95FF666464FF676666FF5A6064FF37AEEBFF36B2F1FF30B0 + F1FF15A5EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9AE3FF4D7587FF494747FF4947 + 47FF494747FF444242F104040430000000000000000000000000343232A94947 + 47FF51879EFF0D9BE4FF0EA2EEFF0EA3EFFF27ACF0FF49B9F3FF49B9F3FF49B9 + F3FF49B9F3FF4DB0E3FF747373FF757474FF5A879EFF49B9F3FF49B9F3FF49B9 + F3FF45B8F2FF15A5EFFF0EA3EFFF0DA1ECFF1598D9FF575F60FF494747FF4947 + 47FF494747FF494747FF1D1C1C880000000600000000000000001C1B1B554947 + 47FF5D6769FF1B9AD9FF0DA1ECFF0FA3EFFF59BFF4FF5EC1F4FF5EC1F4FF5EC1 + F4FF5EC1F4FF69ADD0FF858484FF818080FF62B0D8FF5EC1F4FF5EC1F4FF5EC1 + F4FF5EC1F4FF3DB4F2FF0EA2EEFF0D9EE7FF3C8DB3FF4A4949FF494747FF4947 + 47FF494747FF494747FF3C3A3ADD0000001E0000000000000000030303054846 + 46E14A4949FF508EA9FF0D9BE3FF18A6EEFF74CAF5FF74CAF5FF74CAF5FF80B3 + CDFF88ABBEFF8F9FA8FF969595FF88969EFF74CAF5FF74CAF5FF74CAF5FF74CA + F5FF74CAF5FF58BFF3FF0DA1ECFF1698D9FF56676DFF505B60FF678897FF6889 + 97FF688997FF585F62FF494747FF121212660000000300000000000000005E69 + 695F494747FF575B5BFF3399C9FF0F9EE7FF7CCDF5FF8AD2F7FF8AD2F7FF9BB0 + BCFFA5A5A5FFA5A5A5FFA5A4A4FF91B9CDFF8AD2F7FF8AD2F7FF8AD2F7FF8AD2 + F7FF8AD2F7FF4FBAF1FF0D99E1FF4D839AFF4A4848FF526168FF7DCAEEFF7699 + A6FF647E89FF555B5DFF494747FF313030C200000012000000000000000090B7 + B701606C6CB9494747FF5C6A6EFF2999CFFF3BAFEAFF9FD9F8FFA0DBF8FFA4BF + CCFFA6B4BAFFA6B4BAFFA6B3BAFFA1D6F1FFA0DBF8FFA0DBF8FFA0DBF8FFA0DA + F8FF8BD1F5FF179DE2FF458CACFF4E4E4EFF494747FF494747FF5F8291FF7EBA + D5FF535555FF494747FF494747FF474545FB0505053200000000000000000000 + 0000AFE8E815434D53DD494747FF5C676AFF3998C5FF3CACE6FFA1D9F6FFB6E3 + F9FFB6E3FAFFB6E3FAFFB6E3FAFFB6E3FAFFB6E3FAFFB6E3FAFFB5E2F9FF81CC + F2FF239EDDFF4D87A0FF4E4E4EFF494747FF494747FF494747FF4A4949FF71A1 + B6FF87ABBAFF4C4C4CFF494747FF494747FF1515155E00000000000000000000 + 0000000000001580B621434D53DC494747FF535555FF56879BFF2E9DD2FF49B1 + E6FF7FCAF0FFA1D9F5FFAFDFF7FFACDEF7FF97D4F4FF6DC2EDFF33A6E0FF3A95 + BFFF596F77FF4A4949FF494747FF494747FF494747FF4B4A4AFF4F4F4FFF4E4F + 50FFA3CDE1FF6C7578FF494747FF494747FF1514145100000000000000000000 + 00000000000000000000409FC71457686CB5494747FF494747FF565959FF5B7B + 86FF498DABFF3D97C1FF369AC9FF3799C7FF4093B9FF4D849CFF5C6D71FF4D4D + 4DFF494747FF494747FF494747FF494747FF494747FF69767CFFB1CCD8FF595C + 5DFFADCBD8FF757F82FF494747FF464444F10404041200000000000000000000 + 00000000000000000000000000000000000050525255494747D6494747FF4947 + 47FF494747FF4B4A4AFF4D4C4CFF4C4B4BFF4A4848FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF4C4B4CFF99ACB4FFB9CF + D8FF9EAFB6FF505050FF494747FE212020670000000000000000000000000000 + 0000000000000000000000000000000000000000000049474701494747404947 + 4790494747C9494747ED494747FD494747FF494747FF494747FF494747FF4947 + 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B49 + 49FF494848FB484646CC42404051000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF80 + 1FFFFE0007FFFC0001FFF00000FFF000007FE000007FC000003FC000001F8000 + 001F8000001F8000000F0000000F000000070000000700000003000000038000 + 0003800000018000000180000000C0000000C0000000E0000000F0000000F800 + 0000FE000001FF000003FFFFFFFFFFFFFFFFFFFFFFFF28000000180000003000 + 0000010020000000000060090000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006767 + 67066767670F6767671267676710676767076767670100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000021202002040404201616166F2928 + 28AC333232C9363434D0323030C6252424A510101064010101201D1C1C040000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000262B2B101F1E1E86424040ED494747FF5051 + 51FE535F63FF526269FF525B5EFF4D4C4CFE494747FF3B3A3ADD141313711A1D + 1D14000000000000000000000000000000000000000000000000000000000000 + 000000000000000000004A4A4A20363535C94A4848FE516872FF4590B5FF39A6 + DCFE37ABE6FF39ADE8FF36AAE5FF3CA1D3FE4583A0FF4F595DFE484646FE2827 + 27AB1521271D0000000000000000000000000000000000000000000000000000 + 0000000000004E6767153B3939D34E4F4FFE4789A8FE2DA7E5FE34AFEFFE37B2 + F1FE38B3F1FE39B3F1FE39B3F1FE39B3F1FE36AFEDFE31A2DBFE4A7183FE4948 + 48FE2C2B2BB42B39391500000000000000000000000000000000000000000000 + 0000171A1A022F2D2DAA4D4D4DFF3E8FB5FF23A7EAFE27ACF0FF29ADF0FF29AD + F0FE2AADF0FF2BAEF1FF2CAEF1FF2EABEBFE2FACECFF2DAEF0FE27A5E5FF4875 + 8AFF494747FE1D1C1C892B2A2A05000000000000000000000000000000000000 + 000012121245494747FE497F98FF18A1E7FF1E95D1FE46565FFF436B81FF1DA8 + EFFE1EA9F0FF1EA9F0FF1FA9F0FF3882A8FE535B60FF427793FE2D95CAFF1F9F + DFFF4D616AFE444242F30E0D0D2F000000000000000000000000000000000000 + 0000343333B6545A5CFE1C9ADAFE11A3EEFE12A4EFFE2B5C76FE4C4A4AFE2686 + B8FE14A5EFFE14A5EFFE15A5EEFE455862FE4A4848FE464444FE345E73FE16A4 + ECFE318CB9FE4A4848FE21202090333232020000000000000000000000007C7C + 7C11474545F9497A90FE0D9EE8FF0EA3EFFF0EA2EEFE1192D4FF3E4143FF4152 + 5CFE10A0E9FF0EA3EFFF1D8AC1FF494747FE2C5B73FF1478ACFE1386C1FF0FA3 + EEFF109AE0FE515C60FF3E3D3DE4151515180000000000000000000000008B8A + 8A3F494747FF398EB5FE0DA1ECFF0EA3EFFF0DA2EEFE0EA3EFFF216486FF4746 + 46FE29779FFF0EA3EFFF336580FF464444FE1682B9FF0DA2EEFE0EA3EFFF0EA3 + EFFF0D9EE8FE456F83FF494747FF16151569000000000000000000000000908F + 8F574A4848FF3296C7FE0EA2EDFF0EA3EFFF0DA2EEFE0EA3EFFF0F9AE0FF3942 + 48FE454B50FF1694D5FF45494CFF384851FE0EA1ECFF0DA2EEFE0EA3EFFF0EA3 + EFFF0D9FEAFE3E7894FF494747FF343333C91F1E1E0D0000000000000000908F + 8F564A4848FE3296C6FE0DA2EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE1D6F + 9AFE494747FE435762FE4B4949FE226A90FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 + EEFE0D9FEAFE3E7894FE484646FE484646FD0F0E0E4500000000000000008C8B + 8B3E494747FF3C8EB4FE0DA1ECFF0EA3EFFF0DA2EEFE15A5EFFF26ACF0FF2EAC + ECFE4F5F68FF615F5FFF5B5B5BFF2FA0DAFE22AAF0FF10A4EFFE0EA3EFFF0EA3 + EFFF0D9DE7FE476F82FF494747FF484646FE292828AA07060606000000007D7C + 7C0E484646F94D7A8EFE0D9DE7FE0DA2EEFE1CA8EFFE44B7F2FE46B8F2FE46B8 + F2FE5499BCFE737272FE607C8BFE46B8F2FE46B8F2FE3FB5F2FE12A4EFFE0DA2 + EEFE129ADFFE525C5FFE484646FE484646FE454343F304030329000000000000 + 0000363434B2555A5BFE1F9BD8FF0DA2EDFF4DBAF3FE62C2F4FF62C2F4FF62C2 + F4FE75A3BBFF878686FF6AA7C7FF62C2F4FE62C2F4FF62C2F4FE35B2F1FF0DA0 + EBFF348BB5FE4A4949FF4A4848FF4A4848FE494747FF1F1E1E88000000020000 + 0000292B2B3D494747FE4F7F94FF0E9CE5FF66C4F4FE7FCEF6FF85C0DEFF9CA0 + A3FE9E9E9FFF989C9EFF80CBF2FF7FCEF6FE7FCEF6FF7FCEF6FE46B7F1FF1799 + DBFF506167FE5D7C8BFF7AB1C8FF729FB2FE585F62FF3D3C3CE0000000160000 + 0000000000006C7F7FA14D4C4CFE438EB0FE3AAEE9FE9CD8F8FE9FCDE5FEA7B1 + B6FEA7B1B6FEA2BFCDFE9DD9F8FE9DD9F8FE9DD9F8FE91D4F6FE22A1E1FE4C74 + 85FE494747FE4D5153FE76B2CDFE596063FE494747FE484646FE121111580000 + 000000000000B5F2F20C3E525DCC4E4E4EFF4A87A2FE46AEE3FF9CD7F6FFB9E4 + FAFEB9E4FAFFB9E4FAFFB9E4FAFFB8E3F9FE86CEF2FF37A1D6FE4F707EFF4947 + 47FF484646FE494747FF546167FF8DB9CCFE4F4F4FFF494747FF232222860000 + 000000000000000000001184BF123C5461BD494848FE56676DFF428BADFF49A9 + D7FE56B5E5FF5BB8E7FF54B3E3FF42A0CCFE467F99FF525859FE494747FF4947 + 47FF484646FE687277FF606567FF8BA5B0FE6A7275FF494747FF1C1B1B640000 + 00000000000000000000000000007B9EA1035459596C484646E8494747FE4F4F + 4FFE595E5FFE596264FE56595AFE4C4B4BFE494747FE484646FE484646FE4846 + 46FE484646FE61676AFEAABFC7FEA8BCC4FE535455FE3F3E3ED70303030B0000 + 00000000000000000000000000000000000000000000767575077675754F7675 + 7590767575B4767575BF767575BF767575BF767575BF767575BF767575BF7675 + 75BF767575BF767575BF777676BF777676BD7674748C58575714000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FF03FF00F800FF00F0007F00E0003F00C0001F0080000F0080000F008000 + 0700000007000000070000000300000003000000010000000100800000008000 + 0000C0000000C0000000E0000000F0000000FC000100FFFFFF00FFFFFF002800 + 0000100000002000000001002000000000004004000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001B1A1A01050505221818186D2322 + 2292222121911615156802020220191818010000000000000000000000000000 + 00000000000000000000000000006C7B7B0B2827279349494AF74A6774FF4777 + 8EFF47758BFF4B606BFF444343F01F1E1E844E63660B00000000000000000000 + 0000000000000000000073959509373636BF4B6876FF37A0D4FF36AFEDFF3AB3 + F0FF3BB3F0FF37AFECFF3B97C5FF4A5A62FF292929A94E5F5F09000000000000 + 000000000000000000003131318D496A79FF249EDCFF3295C8FF27AAECFF27AC + F0FF29ADF0FF359BCFFF31A2DCFF2AA0DBFF49585FFF1F1E1E78000000000000 + 000000000000565656194C4E4FF8219AD6FF14A3EBFF3D525DFF2F7CA3FF16A6 + EFFF17A6EFFF475C67FF4B4A4AFF2B7DA7FF2D8CBBFF413F3FE9282727100000 + 0000000000006D6C6C65466C7EFF0DA0EBFF0EA3EFFF187FB4FF434A4EFF139B + E0FF1C8CC5FF434547FF1386C2FF1196DAFF0F9EE6FF4C585EFF201F1F650000 + 0000000000007877778C3B7C9BFF0EA2EDFF0EA3EFFF0EA2EEFF315467FF306B + 8AFF316986FF2E5F79FF0EA3EFFF0EA3EFFF0DA0EBFF426678FF363434CB3231 + 3106000000007877778B3C7C9AFF0DA2EDFF0EA3EFFF0EA3EFFF1C8DC7FF4D4E + 4FFF4D5357FF1E87BCFF0EA3EFFF0EA3EFFF0DA0EBFF436677FF484646FE1F1E + 1E40000000006E6D6D64486D7DFF0DA0EAFF14A5EFFF3AB3F1FF40B6F2FF5B80 + 94FF647077FF40B5F0FF35B1F1FF0FA3EFFF0F9DE6FF4D585DFF494747FF2B2A + 2AAA00000001575757164E4F50F72199D4FF3DB5F1FF69C5F5FF71B8DDFF8599 + A4FF78A4BBFF69C5F5FF69C5F5FF2CAEF0FF2D8AB8FF525D62FF58686FFF494A + 4AF60404042200000000667474864B6976FF3CADE6FF95D6F7FFA3B2BAFFA6AC + AFFF97CFEBFF95D6F8FF90D4F7FF2E9FD8FF4B585DFF5E7D8CFF6B8996FF4C4C + 4CFF1F1F1F8000000000A4D6D605395869B64C6773FF58AAD2FF8DD0F2FFAFDF + F8FFABDEF8FF83CBF0FF4E9BC1FF4C595FFF494747FF4B4A4AFF7A9AA8FF5253 + 54FF2F2E2EAB00000000000000005897AD05586263824C4B4BF44E6570FF4372 + 88FF437085FF4F6067FF4A4848FF494747FF494747FF808E95FF97A9B1FF5557 + 58FE1B1A1A5A00000000000000000000000000000000A4A3A310A4A3A356A4A3 + A37AA4A3A37FA4A3A37FA4A3A37FA4A3A37FA4A3A37FA4A3A37FA4A3A37EA2A1 + A147000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFF0000E01F0000C00F00008007000080070000000300000003 + 0000000100000001000000000000000000008000000080000000C0000000F001 + 0000FFFF0000} + OldCreateOrder = False + Position = poScreenCenter + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object bvlSpace: TBevel + Left = 0 + Top = 314 + Width = 527 + Height = 3 + Align = alBottom + Shape = bsBottomLine + end + object jplWizard: TJvPageList + Left = 0 + Top = 0 + Width = 527 + Height = 314 + ActivePage = jspWelcome + PropagateEnable = False + Align = alClient + OnChange = jplWizardChange + object jspWelcome: TJvStandardPage + Left = 0 + Top = 0 + Width = 527 + Height = 314 + Color = clWhite + object imgInstall: TImage + Left = 0 + Top = 0 + Width = 164 + Height = 314 + Align = alLeft + AutoSize = True + Picture.Data = { + 07544269746D6170AE5B0200424DAE5B0200000000003600000028000000A400 + 00003A0100000100180000000000785B0200C40E0000C40E0000000000000000 + 00008C00018900028400047800036E02085F06094B02043500003404022F0401 + 3100004303024D00006200007300008304068000018200008600008700008700 + 018400018000047800046700016508094D00004D01024300004400014804053E + 00004300033C00003E00004302043D00004201034403053E00004201033C0000 + 3E00004302043D00004201034403053E00004201033C00003E00004302043D00 + 004201034403053E00004201033C00003E00004302043D00004201034403053E + 00004201033C00003E00004302043D00004201034403053E00004201033C0000 + 3E00004302043D00004201034403053E00004501023F00004100004603024000 + 004502014504033F00004302013C00003E00004104023900003E030140050338 + 00003B03023300003800003F04023B00004302014D03014C00005D0302570000 + 7002027A03047C00008702058700008A00028400018200018000018000018000 + 018000018400018400018300008000017B00027101016705055D08064E03013F + 00004003003F02004100004D02005200005E00006A00007A05087B00027F0002 + 8200018200018200018000018001008001008601008700008900008700008400 + 017D01017201046604045300014300003E00003F03043D00014300064B000845 + 00014C06063C00004F0A074000008A00018700028000047500046A03085D0609 + 4903043500003303013606043000004908074C00006701027000008405078000 + 018200008600008700008700018400017D0004760104640000680B0C49000051 + 07073E00004804054501024100003F0000420103390000500F113900004E0D0F + 3E00004201033E0000420103390000500F113900004E0D0F3E00004201033E00 + 00420103390000500F113900004E0D0F3E00004201033E000042010339000050 + 0F113900004E0D0F3E00004201033E0000420103390000500F113900004E0D0F + 3E00004201033E0000420103390000500F113900004E0D0F3E00004202024100 + 004502013C000053100F3C0000510E0D3F00004302013F00004202013900004E + 110F3700004C0F0D3C00003E03013800003C03013500004E110F3A0000530E0B + 4800005300005F03025A00007002027B03047C00008702058700008A00028600 + 018200018000017F00017F00017F00017F00017F00017E00017B00027601026A + 03016206055809064904013D0000420200490401430000580704520000670102 + 6800007D06077D00028000028200018400018200018200018001008001008200 + 008401008400008200007F00017801026D02046205044E00004901013900004E + 0F11390000510B124500024B00034D01024300005609074A0000880006820004 + 7D01076D00026403074F00004301023800003403013401003A00004A00005D03 + 036E03057B02068000028301028301018600008500008500007F000079000470 + 02046200015600004F01024500004701024100004600014300004100013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100024000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000004300004200004502014100004302013F000042010041 + 00004000003E00004303023F00004404034000004303024101003E01003E0100 + 4101004300004700004C00005100005900006804046D02047402027B00028000 + 028600028700028900018700018400007F00007C000078000176000076000074 + 00007502056B00006400005600005001004200003C05003C0200480000520000 + 5A03016104036A04057103037801027C00018300038500028700028600018400 + 018100008100007F00007E03017C03017E06067903027606066900005F000051 + 00004C00014500004300033D00004300054000004700034B00005400005B0000 + 6101016303037D00047D04086B00006D06095100005006063D00003A02013802 + 013900004200004F00006202027103037E010382000183010183010184000084 + 00008100007E00007500036D02045C00005704034500004C06063C0000490506 + 3F00004501024000004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004101014000004704033D000048 + 07063A00004706053D00004101003E00004404033B00004908073B0000480706 + 4000004502014300004300004800004C00005201005601005E01006400006D02 + 047201047801027D00028200028600028700028700018600008300007E000078 + 00007301016F01016E01036A0203680203670505550000570402400000440802 + 3500003F03005300005F00006602026D03027303037902037F00028100018500 + 028700028700028600018400018200018000017D01017501007708066B000073 + 0C0A6000006407065100004F00004A00004A04043C00004702054000004F0307 + 4800005801056200006A00006E00027002027602076900006E070C5200005908 + 0B3E00004405073800003D01014100004A000058000069010277020380010382 + 00018301018301018200008200007F00007A00007100036602025A0202480000 + 4F09093A00004B090A3A00004905064200004300033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004301023B00004A09083A00004B0A093900004606053E00004202013B0000 + 4A09083C00004F09093E00004C04044600004900004E00005300005700005D02 + 006403006904027004037402027801027D000280000282000284000286000286 + 00018500008100007A00007302006C02016703036302046104055F0505530000 + 5A0706470000520B083A00004309034400006102006E01007202027703027D03 + 038001028200018300008600018600018600018500028101028001027E020279 + 03026F05046200006B0C09540000630C0A4A00005106044700004C0404420000 + 5006064300005605084900005D080C6102066F00017900007D00027E02026500 + 016906085000005B080A4000004A08093700004203054100004A000055000162 + 00006E00027901028000018400018102018102018001008001007C0000740000 + 6D00026101015100005107053A00004A0D0B3700004B0B0B3B00004503043E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004202023E00004707063A00004C0C0B390000480B09 + 3700004003013F00004807063C0000500A0A4000005208084300005000005500 + 005B00005E00006400006902006F03027404047A03047B00027D000280000282 + 00028400028400028400028400028301017E03017602016E03006402025D0302 + 5603025503025000005704064A00005C0A09470000590E0C4700005806016F04 + 017A02027D03037F03038202038301028400018600018600018400018200017F + 00017C02027903027703027103036200006309094C00005E0C0B430000540A08 + 3F00004904014700005105064900005F0909500000690A0E5E000172070A7B00 + 028301028402038402035C03064D00005608094000004B090A37000045060840 + 00004900005300016000036B00027500037C00018200018400008001007F0100 + 8002017D02007800007001006700005C00005202013F00004B0B0A350000480C + 0C3700004808084100004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420202370000 + 4A0A093700004A0D0B3500004308063C00004404033B00004F09094000005509 + 0A4500005505065200006302006A01006D02006F02007302007802017C010380 + 01038200028200028400028400028400028400028400048000028204037A0502 + 6F04016504005A03015102004A00004900004D00014900005E05085200006B0D + 0E5A00006A0D0C6702007B030382030282030284020286020285010184000184 + 00018100007E00007B01017802017203017003016D04016804025E04044E0000 + 57090A420000500A0A3C00004B08074600004B00004A0000630909570000760D + 106500007A090C7700018102038602028602028602024A00004E06063C000047 + 0A083500004408083900004601044D00005900016700057300037A00017F0000 + 8300008400008001007F01008002017C03017802016D00006300005700004900 + 00470703350000430C09330000460A0A3C00004604053E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004202023C0000440705370000460B09350000450A083600004003014000 + 004807063E00005208084500005808094D00005D03036D030274030176020179 + 01017D0101800001820002860002870002870002860002860002840002820002 + 8200047F00027A03017305006804005C03004F02004500004200004300004800 + 005702065300006F080D6500007F0C0F7300017F050584020285010187010187 + 01018701018701018500028101027E00007800007501006F0200690200660300 + 6302005E02015200005405084200004C08093A00004808073E00004B03034C00 + 005F05045D0000790C0E6D0000830B0C77000080010282030283010183010183 + 01014302013D00004206063300003E08083400004304064700015000005F0002 + 6E00067901057E00018200008500008400007F00007D02007E03017A03017602 + 016C01005E00005400004B01003C000040070530000040080736000044060642 + 02024100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00003F01013800004207053300004108 + 063400004005033D00004303024000004D05054300005606074D00005D060960 + 02037203017B02007D01018000018200018600018700018900018B0002890002 + 8700028600028400028200028000047B00027100006702005E02005301004801 + 004001003D00004000005104085400016A030A6A000085070D8000008E02098A + 0000870000860100870000860000860000840000830101800201790101750100 + 6D02006602006002005A02005700005300005000024700004D03093A00004706 + 083B00004805044900005A04045F000075070972000087080A7F00008B030584 + 00008001007F01007F01007F01003F00003F02003900003D05043701003E0504 + 4000004A00015400006300027201057C01058000018200008500008400007F00 + 007D01017A02027504026F03026302005700004C00004500003F02003800003B + 03023800003F03033F01014404044000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000013E00013D01023C00004201033E0000430003 + 4000004100014100014200023F00004201033E00004001033D00003C00013901 + 003A03003700003B04013800003E03013D00004100004600004C01004C000055 + 00005600006103046401036D05067501007A01007F0100800001840001880002 + 8A00028C00038B00028900048600048000047D00047900047800057002046100 + 005A00005600005100004B00004A00004A00014D00015C05096605096D00057B + 03087F00038A01058B00008B0000890000860000860000860000860000860001 + 8301027F03037801026F01016602025E02015302004B01004500004500004C00 + 004E00024900004C01034600004D03034E000057000068060672060576000080 + 01038000008700028700008701018001007C01007E00007C0100430000400000 + 4002023A00003C03023C00004401004A00005E04046802037301017B01018000 + 018301018501018301018301027D00027806066800015F02034F00004A000142 + 00004000013D00004001033C00004002023E00003F02003E00004000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100023E0001390100360000 + 3C03023C00004301024100004600024700014700014400004500053F00014000 + 053800013A01043501013202013000003403013200003D04023C00004502004A + 00005000005800006301016A0203730205770205790102780000770500770500 + 7A04007D020080010083000086000086000187000484000582040A7901067303 + 0A6600026000025400004C00004A00004E00005200005800005F00016700066F + 03096F01057201047402027802017B01017D0200820100840100820000850000 + 8700008800018800028800038500057F00047A04096900055A00034800004201 + 033400002F03043100004600005100005500005900005F02016703016E040374 + 04047801027B01017F00018000018200018200018200018200018000017F0001 + 8000017F00014400004703043A00004507073500004606054100004F00006004 + 036A03017301017B01018001008301018301018301018100018205076E00006C + 0A0A4E00004F05053D00003F00023B00024003073A00004706083A0000460606 + 3C00003F02003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00003D01023600003B05043300004307073900004905064100004800024600 + 004902053D000047050A3500003F06093300003402023101003606042D00003E + 09063500004906034600005200005B00006300006D01007601027E0103810003 + 8400018100007A04007705007A04007B03008001008200018400028400028000 + 0580040A6E000172060C5C00005F03084E00004C00034300034400044E000558 + 00026200026D00037600057C00067B00047B00027901017902007902007B0300 + 7F02008002008401008600008701018500028500038000027C00047600036D00 + 056402084C00004C040A34000039070B2800003200004A00005700005E000064 + 01006B02007203017A02027F0303800001820001820001820001800001800001 + 7F00017F00018000018000018000018000014701023D0000490909370000480B + 093900004D06034E00006104036A03017402027B010180010082000083010183 + 0101820104760000790B0D5A00005E0A0C4000004605073B00003E0105360000 + 49080A3900004B090A3900004606053C00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073C00003B0302330000430A093500004A0A + 0A3A00004904074100004500033D00004A070A390000460A0B3300003F060735 + 0000390302340000430A083700004D0A09420000560403530000610101690200 + 7202027A02038102038301028600018300007F02007D02007F01008002018101 + 028101028100037E01037D03096C000070060C5500005F050A47000051040846 + 00024200024801045200055E00056700047100047A00047E00057D00027D0002 + 7D01017D02007F01007F02008201008401008802028801038402038001027901 + 027200006A00026200015E00044D00005506094000004F0A0D3A000045050A40 + 00005601006002006502006902006F02007602017C0202800102800001820001 + 8200018200018000018000017F00017F00018000018000018000018000014300 + 004A06073900004A0C0C3700004B0A094200005200006404046D03027601027D + 01018001008200008200008001007D00007F08096500006D0D0D490000510909 + 3A00004004053A000145050A3900004C0B0D3A00004A0A0A3900004003013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004001033A00 + 00410807350000480C0C370000480A0A3900004201033E00004706083900004A + 0B0D370000460A0B3500003E02023C00004707033C0000540D0A4500005C0B08 + 5300006203006904027103037803047D03038202038500028700018600008400 + 008201008200008001008001027E02027A02037702056C00026C07095200005C + 080A4300004E08093B00004503044502014D03035804066403076F0105770004 + 7D00048100038000028000027F00018000018001008200008600008600008902 + 048502057F02047702036C02016000005700004F000049000050060642000055 + 080B4500005D090D4E00005C03066303036804006C0300700301740301790101 + 7E02028101028200018200018200018200018000017F00017D01017D01018000 + 018000018000018000014501023C00004A0A0A3900004C0C0B3C00005106044F + 00006604046F03027801027D01018001008200008001007F01007F02046F0000 + 760B0D5300005B0B0C3E00004807093C00013E01053700004A090B3A00004D0B + 0C3900004707063C00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E0000400202370000480A0A350000480C0C35000041080738 + 00003C0302350000460A0A3700004A0C0C390000470707410000490000450000 + 5809064A0000650E0C5500006C0B086801007205037804037D03038103028402 + 028701018700008700008600008500008400018000017D00027801027002046B + 030460000150000059090A4000004D0B0C3700004007063B00004A0300560502 + 6206056B05067502057B00028000028301028200018200018000018000018200 + 018400018700018600018400067C01057502056A02035C02015101004401003F + 00004205013B000050090647000062070A59000074060C6F0004700403700502 + 7304027703027A02027E02028000018200018200018400018200018200018000 + 017F00017D01017D01018000018000018000018000014100004705063900004A + 0A0A3900004E08084600005700006905057103037901027F0001800100820000 + 7F00007C01007600007707075E0000640A094500004D07073B00004105063A00 + 014404093900004B080B3A00004909093A00004003013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033F000046060639000048 + 0A0A330000420A093300003B03023700003F0706350000480A0A3A00004C0809 + 3F00004C00015000005D04005300006A0C075C0000740D0A6B00007708067804 + 037A02028002018102018501018701018800018800018600008300008100007C + 00007400006D01006501015E02014C00004F04023E00004C0C0B350000420A09 + 3000003E01005204006105006B07037205037A02028000018400018500028400 + 018200017F00017F00018000018200018400028000027700037000036600025E + 01024F02004502003A02003602003901004809054200006009075A0000780508 + 79000085050A7902037504027903027A02027E02028101028200018400018400 + 018400018200018000018000017F00017D01017D01017F000180000180000180 + 00014200013D00004606063900004807064100005402015800006C0405750303 + 7C01038000018200008100007F00007A01007601026A00006907075100005004 + 053C00004304063E02033F00043A00004605073A00004806073A00004404033D + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A000044030540 + 00004400023F00004605073700004108073300003B0504360000380300350000 + 4207053900004C06064300004E02035000006102006200007007046700007609 + 076F00007B08057A03017D02007F010080010082000084000084000087010185 + 01018200017E00017700007100006700005F00005500004E01004700003C0000 + 4407053400004209083400003C04034100005E03006C04007504017A03018001 + 008600008700008802028200017F00017B00027901027901027901027B000478 + 00046600005D00005700015000014701013F02003902003801003C0200410000 + 5B0A075C00007606067500008B02068800037F00017B01017D01017F00018000 + 018200018500028700028600018400018200018000018000017F00017D01017D + 01017F00018000018000018000014100004200013E00004301024100004B0101 + 5000005C00007003057902038001038200018200008100007E00007A01007000 + 006B04025D00005502004600004201003E00014004053E00034100043F000043 + 00033F00004202023D00003E01004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004100014300014400023F00004001033800003B0302 + 3600003701003902003B02003E00004502014700005000005000005900006D03 + 027605037401007B06037700007D04027C01008002018001007F00007F00007F + 00007F00008001008102017F03037801027301016D00026600015C0000520000 + 4A00004500003F00003D03003700003C03013700003E02023E00004C01006703 + 007804007C04008103008500008800008700008602027F000179010174020270 + 02027002047002047002046B02055500004E00004900004700004201003F0200 + 3E01004001004000005103005F0400710A077802018402038700008900018100 + 007F00007F000082000184000186000187000287000286000184000182000180 + 00018000017F00017D01017D01017F0001800001800001800001420202410101 + 4404044000004701014A00005901016300027002047901028000028400018400 + 008200007F01007902007103036400005B01004E00004A02023F00003D01023A + 00003E00033F00024300034100004301023E00003F02003E01004000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E0000410002410001440002420000 + 4300033E00003E02023800003B02003900004005034202014400004700004E00 + 005600005E01026804047403017B02007D02007D02007F010080010080010082 + 00008001007F00007E00007C01007B02007A03017A02027605036D0506640202 + 6103045400005000004500004502003F02003C01003900003C03013A00004202 + 013F00004400015100006F03007D010080000084000087000088000088000281 + 01027901027101016F07086503036706085F00005F00005600004C0103430102 + 4400014300004200004500004700004D00005D06046405026D03027403017B01 + 0182000086000087000084000184000184000186000186000186000186000186 + 00018400018400018200018000018000017F00017D01017D01017F0001800001 + 8000018000014000004606063C00004907084000005404055600006801047401 + 047D00028200028400018400008200007F01007803006C02016506034F000053 + 06033F00004707063800003B01023D00024402073B00004A05083A0000460606 + 3A00003D02003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004200024200004702053B00004805083900004305053900004000004502 + 014801004C00005000005A00006000006703037004037B010180010080010082 + 00008200008200008400008200007E00007C01007C03017A0502750402720301 + 6E01006601005F02035B08074B00005207053E00004607033B00003D05003900 + 003E05033600004707063C00004D050545000056000074060281040085020087 + 01018700008600008100007A00017202026E08095C0000620A0A5100005A0608 + 5100004E00014100003C00004000004600004B00005200005900006000006B04 + 027002027602017B01017F010080010082010084000086000186000186000186 + 00018700018600018600018400018400018200018200018000017F00017F0001 + 7D01017F00018000018000018000018000014103033A00004B0B0B3C00005309 + 094900006305066900017800047F00028400028600018400008200007D020076 + 03006B06045800005B08064300004E0B0A3700004206073800004000053A0000 + 4A070A3C00004B090A3900004407053A00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004401063C00004A070A3A00004C08 + 093C00004903034500004D00005200005800005F00006600016C020171030379 + 05047F01008200008200008400008400008400008200018000017D0000790101 + 7804037205036E04036702006000005700005404034400004F09093A00004909 + 083500004108063A01003C0301360000470A083A000051090943000052040553 + 00006F04017A03018103028303048402038201047B00027300036F07085C0000 + 610B0B47000057090A4300005104074700003E00003C00004300004C00015700 + 036201036D02057502057901027D00027F00018000017F01007F01007D02007F + 0100840001870001870001870001860001860001860001840001840001820001 + 8200018000017F00017F00017F00017F00018000018000018000018000013C00 + 00460808390000500C0D4300005C080A5900007002067B000482000286000287 + 00018600008200007D0200740300650100600905470000550C083A0000480D0B + 3400003C02033C000147050A3A00004F0A0D3A00004A0A0A3700003E03013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 0147050A3A00004F0A0D3E00005207094500005200005900005D00006501016B + 01007202027703027903027D0303800100840000840000840000840000820001 + 8000017F00017B01017702036F03026903046101015A00005300004C00004400 + 00480706390000490C0A350000460B093400003E05033A00004508063900004F + 0C0B4000005309094300005300006100006A00007000007702037B0307790407 + 7204066D04075F0102600A0A450000560C0C42000051080A4200004A01034400 + 004700004E000159010165020470030579040781030880000284000284000182 + 00018001007F01007B02007D0200840001870001870001860001860001840001 + 8400018200018200018200018000018000017F00017F00017F00017F00018000 + 018000018000018000013E02023800004C0C0C3C0000560A0B4C00006906086D + 00027D00048400028700028900018600008200007D0200720400670603500000 + 570A074000004D0D0C3500004208093800004000053900004B080B3C00004D0B + 0C3900004508063A00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083C00004101063700004A090B3C0000550A0C4700005C030658 + 00006601036C01037201047702037A02037E02027F00017F0000820001820001 + 8200018200018200018000027F00027B00027803046F02046501015C00005300 + 004E0000480000450000430201390000470909370000490B0B3700004507073D + 00004202013900004B0A093C0000510B0B3E00004C06064800004F0000570000 + 5D00006402026803056803056502046002065801044A0000560B0D400000560B + 0D4200005104074B00005600005B01006100026701027002047702037F020483 + 02058400028600028600018400018200017F00017D01017F0001840001860001 + 8600018400018400018400018400018200018200018000018000018000018000 + 018000018000018000018000018000018000018000013A000044060639000050 + 0A0B4300005D06095F00007403077D0004860002890002890001860000800100 + 7D02007204006001005A08034300004F0B06370000450C0A3500003D03043C00 + 014604093C00004D080B3A00004909093800003E03013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A000040010338000140050939000050 + 090C4500005F080C5A00006900037001057702057C0103800102810102820001 + 8100008100008200018200018200018200018000027F00027B00027801027002 + 046701025C00005000004800004300004000004002023D00004505053900004A + 0A0A3A00004A08093C00004301023F00004706053C00004B0A093A00004A0908 + 3A00004302014401004800004D01025101025600025500015400015100004A00 + 004F0406400000530A0C42000057080B4C00005A00026802036E020171000374 + 02027801027C0103800103830003840002840002840001840001820001800001 + 8000018000018400018400018400018400018400018200018200018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00013D01013A00004707073F00005305065100006A03067300047F0004870002 + 8B00028B00018600008001007D02007204006104014F00004F06023C00004609 + 073600003F06073A00013F00043C00004904073C00004806073A00004205033B + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053D + 000039000335000045060841000059080B5700006C050A6E00037800057D0004 + 8200028400018600018600008701018501018200018000018000028000027F00 + 027D00027900047401046800006000005500004B00004300003D00003A02013C + 02034201033E00004A05083D00004D07084000004B02044300004600013F0000 + 4706053900004508063600003E05033601003704023903023E02024200014800 + 014900004900004900004A00024300004C03054200005405084D00005C050963 + 00047800047F00017F00027F00017F00017F00017F0002800002800002800002 + 8200028200028400028400028400028400028400018400018400018200018200 + 018000018000017F00017F00017F00017F00017F000180000180000180000180 + 00018000018000018000018000013E00003F01013F0000460203480000590003 + 6700017901068400048900028900028700018400008001007D02007203015C03 + 004E04004500004303003D00004005033B02013E02034000014200023F000043 + 01023F00004202023D00003E01004000004101013E00004202023E0000420202 + 3F00004000004000014101013E00004202023E00004202023F00004000004100 + 014200013E00004202023E00004001033D00003C00013E00013F00023C000042 + 01033F00004300034200004100013E00004200014600005404055A0002690406 + 7201057B02067E00028200008500008800008900008800018901028703037F00 + 017B00027B00047900047601047201046F02046902055800005200004D000047 + 00004200013D01013A02013900013F0002430204410001470205420000480203 + 4500004700004700004600014100004202023C00003E02023800003502003002 + 013002013301013900014000014400024900024D00034B00014D00014B000052 + 00005300006100026702047406087E0001850000840001820001800001800001 + 8001038001037F00027F00028000028200028400028400028600028600028400 + 018200018200018200018000018000017F00017F00017F00017F00017F00017F + 00018000018000018000018000017F00017F00017F00017F0001460001400000 + 3F03033B00004701015200006E00047F00058900048D00028700028200017F01 + 007D02008001007403015100004200004303003F00004202013E000041010040 + 00004100004000004301023E00004202013C00003F02003E01004000003F0000 + 4301023F00004301023F00004200014100004100004000004301023F00004202 + 023E00003F01014000004300004200004301023E00004002023800003A020137 + 01003C03043A01023F03043E00004500034500004B00054A00004D0000540000 + 5E02016703017004037902037F00028500008900018D00008C00008A00008800 + 008700008502008203027800047100047304086C01046805075B00005400004B + 00004A00004400004502013E00004003013C00003D02003A0100390100380000 + 3C03023A00004202023F00004600024700014700014600004700034100004300 + 033E00004100023A00013503053001033604043800004103034200004C000150 + 00005600005D00006600016E02017503037903027B01017E0000800001820001 + 8200018000018000018000018000018000018000018000018000018000018200 + 0182000182000182000182000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000017F00017D00027B0002 + 7B00027B00024600004703043500004108073C00005804066C00008400078D00 + 048F00028600028000017B02007B02008200007602014F00004404033A000047 + 07063A00004706053D00004201004000004504033A0000470706370000440705 + 3A00003F02003F00004404033B00004807063A00004706053F00004201004000 + 004504033B00004707063900004407053A00004101004200004903033B000047 + 07063500004007053300003802013701013E0405380000480508400000530308 + 4C00005700045B00006100006902007203017A02028101028600008A00008D00 + 008F00008D00008900008600008302008102017C020272010571050B62000067 + 060A510000570406460000470101400000420503360000430806370000440705 + 3C00003F02003900003D05043400004307073700004606063F00004400024400 + 004902053F00004A040A3A00004704093C00003D00043700033B060933000042 + 08093A00004D05054A00005600005E0000660000700000790101800201830101 + 8601008500008200018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000017F00027D00027F00027D00024900023E0000430A093300004D0A + 094A00007504088100048D00048F00028600028000017B02007B020082000076 + 02015200003B00004A09083A00004B0A093A00004706053F00004302013B0000 + 490908390000480B093700004407053C00004202013B00004A09083A00004B0A + 093A00004706053F00004302013A0000490908370000480B093500004207053C + 00004301023D00004A0809390000460A0A3300004007063800003D0101390000 + 4B070842000059080B4B00005F050A5D00006501006B03007004007704017F04 + 028301018700008800008B00018900018901038602028102037C030179010173 + 01017305096300016A060B5200005B0407450000500606440100420201380000 + 450A08350000480B093900004706053F00004301023A00004A08093900004B09 + 0A3A00004704073F00004201033A000049080A37000048090B3500004206073A + 00003D030437000048090B3A000052090B4500005805045900006501016B0100 + 7402027A02028103028301018401008300008200018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018200018600028600028700028600024500 + 004A0607330000460D0C3C00005D090B6700008501088D00048D000286000280 + 00017B02007D02008200007602014F00004807063A00004D0C0B3A00004B0A09 + 3A00004302013F00004807063900004C0C0B370000480B093700004202013F00 + 004807063A00004D0C0B3A00004B0A093A00004202013E000045080637000048 + 0D0B350000460B093500004003013F00004806073900004C0C0C370000480A0A + 3700004202023C00004C04044300005C090B4E0000690B0C5E00006B05066F04 + 017504017A05027D040282030285010186000087000087000185000284020380 + 03057B04057303036E00006A000165000268070B5200005F0609490000520607 + 3F00004605043E0000450806350000480D0B3900004A0A093A00004502014500 + 004E05073E00004F0B0C3C00004B090A3900004001033A000043070833000046 + 0C0D330000440A0B3300004001033D00004B0407420000570A0D470000610A0D + 5700006604046B03047103037804037B03038103028102018401008400008200 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018200018900 + 018B00018B00028B00014A01033D0000450C0B3300004C0B0A4A00007305097E + 00038B00048D00028600027F00017B02007D02008200007802015500003C0000 + 4D0A093C00004F0C0B3C00004807063F00004202013900004A0A093900004C0C + 0B3900004707063E00004302013C00004D0A093C00004D0C0B3A00004707063C + 0000400301350000460B09350000480D0B3300004108063A0000420103390000 + 4A090B3900004C0C0C3A00004A07064300004C00014700005E0808520000700B + 0D5F000076090B7301017B04027F040081040082040086020285010186000184 + 00018200028001037B03047704076F04066802036000005D00005E0004500000 + 5E070A49000055090A4000004906053E0000400301350000460B093500004C0C + 0B3900004807064300004C000245000054070A4000004F0B0C39000045070738 + 00003B0302300000410B0A300000450D0C3300004108073F00004B00004A0000 + 5D060A4E00006A0C10590000700B0D6B03047204067604047A04037D03037F04 + 0281020182000082000080000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018200018900018B00008B00018B000045000049050633000044 + 0B0A3A00005A07096700008201088900048B00028400027F00017B02007D0200 + 8200007802015100004B05053E00004D0A093C00004C09083B00004302013E00 + 004606053900004A0A093900004909083A00004302014100004906053C00004D + 0A093A00004909083800003E03013A0000420705350000460B09330000430A08 + 3400003E02023C00004604093900004B080B3C00004E08094300004E00015200 + 00600605570000700B096400007C0A0A73000081050582040085020085020085 + 02008701018501018301028101027D00027901057103056A03066302045C0104 + 5500015100004E0000560305450000560A0B4000004C09083A00003F02003A00 + 00420705350000480B093900004909083B00004701014A000054030643000051 + 080A3C00004709093400003B03023500003B0806300000430B0A350000470909 + 3A00004B00025200006400055800006F090E5E0000750C0F6D000278070A7604 + 047902037A02027C02027E030180020181020181020180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000182000186000086000087000086 + 00004B00024000004007063200004606054A00006E03067C0004870004890002 + 8200027D01017B02007D02008200007802015600004300004D05053E00004A07 + 063D00004504034000004101003C00004407053700004707063A000044040340 + 00004401004100004906053C00004807063A00004205033B00003D0200360000 + 4007053300004308063600004005033B00003F00023C00004704093C00004E05 + 074400005401035400006305066400007408076C00007E080777000085060584 + 01008700008701008700008700008600008200008001027C0103770205700305 + 6702045F01055700034E00024A00014700004A00004500004D05053F00004B08 + 073B00004306043B00003D02003800004407053700004707063A000045040344 + 00004B00014800004F03073C00004707073600003D0504360000380300330000 + 4007053700004A07064100004D03035000006801066A00007405096B00007908 + 0C7000007C070A7901057901027901027B01017D01017F00017F000180020181 + 0201800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00017F01007D02007F01007D02004900004501023900003B03023D0000510102 + 6700017C00068700048900028200027D01017B02007D02008200007901015700 + 004A00004700004901014300004502014000004000004000004101003C000040 + 03013E00004202013F00004100004300004600004100004302013F0000400301 + 3D00003C01003A01003B02003800003E03013A00004003013D00004000004100 + 014400044300014B00034A00005300015600005C00006C06077406067602017E + 05037D00008403008500008902008901008800008800008500008100007F0001 + 7A02037603067104066803055D02055400044C00024600024100014000014400 + 014701014100004302013E00004104023D02004005033C01003D02003C000040 + 03013E00004202014000004300004700014800024100004201033A00003C0302 + 3600003701003902003D02003F00004901014A00005300005400005E00007403 + 077D03097900057D04087800037D02067A00037B00027D00027C00017C00007C + 00007E00007F0001800201810302800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000017F00017B0200790200790200790200490000430000 + 3E05043800004205034D00006902057A00068600048700028000027D01017B02 + 007D02008400007B01015F02034E00014C00014600004701014100004302013F + 00004000003D00004003013C00004202013E0000420100410000430000440000 + 4502013F00004302013C00003F02003C01003D02003B00003F04023D00004404 + 034000004403024400014801044900034900004C00005300005C00026502046D + 05066F01037500017A00008001008400008702008A01008A0200890000860000 + 8500008100007F00017A02027503036F04065E00005600005200014700004500 + 033E00013D00043C00014000004000004202013C00004003013A00003D02003C + 01003C01003B00004003013C00004202013E00004201004100004100023D0000 + 3F03043900003D05043800003C05023B02004303024701014B00005100005900 + 006100006A01047403067B000480000480000480000480000480000280000280 + 00027F00027F00017F00017F00017F00017F00017F00017F0001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000017F00017F04027D0402 + 7C03017B02004800004804053600004109083800005406076300007A02078400 + 048600027F00027B01017902007D02008400007B010161000255050646000050 + 04054000004906053D00004101003D0000420503380000450806390000460605 + 3D00004401004400004903033D00004807063900004407053800003D02003B00 + 004205033B00004807063D00004C06064400004B01014B00004E000052000158 + 00025F00046601036D02047303037700017A00007E0000820000860100880100 + 8A02008801008400008100008101027F03037903027202026901026300025600 + 005401034400004A06073900004205093500003A01023B000042050338000045 + 08063500004207053800003D02003B0000400503380000450806390000460605 + 3D00004101013900003B05053400004007083300004108073B00004302014600 + 004E00005800006100006A00017000027601047C010382000484000284000484 + 00028400028200028200028200028200018000018000017F00017F00017F0001 + 7F00017F00018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000017D00007E00007F00018002014C0002400000440B0A320000490C + 0A4400006B06087400038200048400027F00027B01017902007D02008400007D + 01016603054F00005707084500005309093E00004706053E0000400301360000 + 450A083700004A0A093900004706054100004701013F00004C09083A00004A0A + 093700004207053A00004104023B00004A09083E00005309094300005404054E + 00004F00005400005C00026302046B04077104067502057901027C00017E0000 + 8200008400008401008601008702008502007D00007901017A03047404047004 + 036701025C00005500005200014400004E0809390000460A0B3300003F060937 + 00003E0202360000450A08350000460B093500004407053C0000400301380000 + 4909083900004A0A093900004706053C00003A04042E00003E0A0A300000440B + 0A3900004B05054800004D00005800006400006F01037803067D020480010382 + 0001860002860001860002860001860001840001840001820001820001800001 + 8000018000018000018000017F00017F00018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018200018300008500008500018500004800 + 004D0708330000440E0D350000550B0B5C00007802078000048200027D000279 + 01017902007D02008400007D01016400015E070A490000580A0B420000500A0A + 3B00004104023C0000430806350000480D0B3900004A0A093C00004502014300 + 004A07063A00004C0C0B390000480B093500004003013E00004807063E000055 + 0B0B4500005B080A4D00005A00025A00006000006701026E0305750407780304 + 7C01037F00018000018200018400008200008201008201008002007D02007601 + 027103056D02046902056100025A00005100004A00004700004A07063A00004A + 0C0C350000440A0B3200003C02033A0000430806350000480D0B370000480B09 + 3700004003013C00004508063900004C0C0B3900004A0A093A00004002023300 + 003A080A300000460C0D39000052090B4800005800025C000065000070000279 + 0203800305820203830102840001860001860001860001840001860001840001 + 8400018400018200018200018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018200018400 + 028400028500038300014D00033F0000460D0C300000480D0B42000068050770 + 00017F00048200027D00027901017902007B02008400007D0101690406530000 + 5D090B470000560C0C3E00004908073C0000400301350000460B093500004C0C + 0B3900004A07064100004502013C00004B0A093900004C0C0B3700004508063C + 00004403023F0000540A0A4700005F0B0D4E00006204085E00006802036C0201 + 7002027402027901027D01018000018400018400018400008400008001007F01 + 007D02007B02007602016D05066403055F01025A00025100004E000048000045 + 0000430102390000480A0A350000480C0C3500004307073A0000400301370000 + 480B093700004C0C0B3900004707063E00004202013900004A0A093900004C0C + 0B3900004707063C00003C0304310000470B0C3A0000570C0E4A000062040861 + 00006E00047300037900047D00027F0002800001800001820000820000840000 + 8400008200008400008200008200018200018200018200018200018200018200 + 0182000182000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000017F00027A00017900027C00047C01054900004C060733000041 + 0B0A3500005008085900007300047F00048000027B00027901017803007B0200 + 8400007D010166000260070A4A000059090A430000500A0A3D00004104023A00 + 00420705350000460B093900004909083D00004502014100004906053A00004A + 0A09390000470A083800004202014100004D05054500005D090B50000067080C + 5E00006B02057305057605027802017900007D00008000008500008700018701 + 018701018200008001007B02007902007502006E02016204055902065300024D + 00004700004300004100004202023C0000420606350000460A0A350000470909 + 3A00004202023C00004407053900004A0A093900004909083A00004202013E00 + 004606053900004A0A093900004909083A00004002023A00004205093A000055 + 090D4A000067070D6300007201057B03087D02067F00027D00007D00007D0000 + 7C01007F01008001008001008001008001008200008200008200018200018200 + 0182000182000182000182000182000182000182000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000017B00027100046C01046D00056A + 00024C00024200004108073000004007054100006201036D00007D0004800002 + 7B00027901017803007B02008400007F00016C03065800005B04074800005206 + 074400004706053E01003D02003600004207053500004707063A000047040342 + 00004401003F0000470605390000470706380000440403400000450000450000 + 5505064F000065070B5F000070060C6F01057703027903007C01007E00008200 + 008400008800008900008800018701018301027F000179010175010071020068 + 03015600034E00034A00014600004100003F00003D01023C02033B0201360000 + 4207053500004508063A00004504034000004101003C00004706053A00004807 + 063B00004504034000004201003D00004706053A00004707063A00004205033D + 00004000013F00005004084C000065070C62000177050C7900057E0006800004 + 7F00017E00007B00007700007702007902007D02007F02007F01007F01008001 + 0080010080010080010080000180000182000182000182000182000182000282 + 0002800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000178 + 01026201035602045600035200004A00004802033B00003B0401380000460100 + 5A00006C00017900047F00027D01017B01017B02007D02008200007D01016F01 + 036502045900005400024800004805043F02003C03013A01003B02003A000040 + 02023E00004301024000004100004000004101013E00004202013F0000430201 + 4400004900004C00005200005600006201036500017204087302067A05087800 + 007B00007F01008100008601008700008900008700018700028101027C010376 + 01026F03026802036503035C04044800004400004200004100004100023F0101 + 3D01023C00003C00003D01013C00004202013F00004502014400004300003E01 + 003D02003C00004202013F000043020142000045000045000044010043000045 + 02014100004303003F00004300004A000052000156000062010567000375030A + 7901068103097C00017E00007F00007F00007D02007902007803007902007D02 + 007F01007F01007F01007F01007F010080010080010080000180000182000182 + 0001820001820001820002820002820001800001800001800001800001800001 + 8000018000018000017F00018000018000018000018000018000018001007F01 + 007F01007F01008001008001008001008000018000017F00017F00017D01017D + 00027B00027901027901026F02044F00004600004800014A01034B0002450000 + 4303023C00004104024400005401005F00007302057D02048202038301027E00 + 007C01007C03017C04047800037502056B04075100004600003A000039060333 + 03003701003900004201033F00004300033F00004100043C0003380000360000 + 3E04054000004802024600005000005500006605026B04027002027402027900 + 047B00047F00047F000481020382030284020285010186000086000085000081 + 000183030879010672040A6200035902054B00004800013F00004100003F0000 + 4202023E00004202023F00004200014100004300004200004502014300004701 + 014300004800004100003901003500003C04033B00004404044300004802024A + 00004900004A00004B00004A00004700004400004200004A0000680404720104 + 7401047402027801027901027B00027B00027D00027F00017F00017F00017F00 + 017F00017D01017F00017F000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001820001820002820002 + 8200018200018000018000017F00017F00017F01007D02007F01007F01007F01 + 007F01007F01007F02007E04007C04007D03007F03008002007F01007F00007E + 00007D01017B00027D06077502057305076800006300005600004D0003430003 + 4100013E00004700004A04053C00004707063900004906034B00005C00006F03 + 027B03048202038500028200007C01007904017A04037C000081060A6700005E + 04033E00004008033101003405013401003E05043A00004A040A3C0000470409 + 3C00003D00053600023C06063800004806074300005603015600006502006F04 + 017602017901017F000180000282000284000484000282020381020182000081 + 000083000083000182000480000578000774060C5F00015F080C460000480508 + 3600003900013B00004205033800004707063A00004706053F00004600004400 + 004903033F00004C06063E00004B05054100004201003A00003D050435000044 + 08083800004707073E00004701014902004A00004900004A00004D0000500000 + 5201005D00007601027F00017F00017D01017D01017D01017D01017D01017D01 + 017D01017F00017F000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200028400028200018200018000018000017F00017F00017F01 + 007F01007F01007F01007F01007F01008002007F02008004008004007F030080 + 02008002008002007F01007D01017901027B06076A00007008095C0000620405 + 5400005200024000003D00003F00004302044903043F0000490909370000480B + 093C00005306045700006C02017902038102038301028001007E00007A03017B + 0303800103760000770A0C5000005208063500003C0906320200390302340000 + 49080A3A00004D070D3A000046030A3C00024003073B00004E0A0B4200005A08 + 075000006908056B02007403017902007D010180000182000284000286000284 + 00028101027F01007E00007D00007E00017F00027F01067B0307720007610000 + 66080D4A000055090D3A00004005093800004002023A00004909083900004B0A + 093A00004706054100004502013D00004C09083C00004D0A093C000047060541 + 00004701024000004C0809390000460B093300003E0704370000400300410100 + 4700004E00005600006000006901027202027B00028000018000017F00017F00 + 017F00017F00017F00017F00017F00017F00017F000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018200018200018200018000 + 0180000180000180000180000180000180010080010080010080010082000082 + 01008402008601008702008502008302008102017E03017A0202780606690000 + 6E070A5500006106094A00005703074B00014702054201034000013D00004000 + 004907083700004A0C0C3700004C0B0A4500005901016701027402027E010381 + 01028000017E00007B02007D04027D00008207096400006A0D0C4300004A0B07 + 3300003B06033700004307073900004D0A0D3C00004B080D3900004200054100 + 00500709450000610E0D5200006D0C096600007807047902007D020080000182 + 00018400028400028600028200027F00017B02007B0101790101790102760102 + 7300036E00046100006304084C00005A0B0E4000004B0A0C3600003F03043C00 + 004707063900004C0C0B3A00004B0A093A00004202013E00004707063900004C + 0C0B3900004A0A093700004302014900005304074200004E0A0B370000430A08 + 3200003B04013C02004200004C00005700006400006F00017900047F02048000 + 018000018000018000018000017F00018000017F00018000017F00017F00017F + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0182000182000182000180000180000180000180000182000182000182000082 + 00008400008400008400008600008900008900008800018701018301017E0202 + 7903027303036A00016A07095200005E070A4700005306094100004903043E00 + 003E0000400001430204440404390000470B0B3500004A0D0B3A000051070552 + 00006400006E00007A02038001028000018000017F0100800201830205760000 + 7A0C0C5600005F0E0B3E00004508063A01003C03023500004A090B3A00004D0A + 0F3A000047050A4100014C00004C0000650C0F56000075100E6400007B0A0877 + 00007F01008201008400008400008600018600018400028200027A0000780201 + 7803047604047103056B00026200005C00005A00024B000057080B4200004F0A + 0D39000045050A3C00004202023A00004B0A093A00004C0C0B3900004707063C + 0000400301370000460B09350000480D0B3500004308063E00004E0104480000 + 5408093E00004C0B0A3900004508043F00004300004C00005A00006501017201 + 047B000483000384000282000182000182000182000182000180000182000180 + 00018200018000018000018000018000018000017F00017F0001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000182000182000182000182 + 00018400018400018400018400018600018600018600018700018C00018C0001 + 8700018400017F00017700016F01036801045E00014E000059090A420000510B + 0C3A00004605073B00004302044201034000013D00003C000043070733000044 + 0B0A3500004A09084500005502015F00006A00017601027F0204810102820001 + 8001008101028100008205076A0000720E0C4D00005208043D00004306043C00 + 004406063900004B080B3A00004A070C3A00004900034E00006204055D000078 + 10116800007F0C09740000810201840100860100860000860000840001840001 + 8200027F00027700017402027103036E04036703035D00005400004D00004A00 + 004F05053E00004D090A3A000049080A3B00004302043F00004706053A00004B + 0A09390000470A083800003E03013A0000400705330000440B09330000430A08 + 3400004003014500005005074200005008084200005309094900005604035500 + 005E00006901027302057B020681010684000282000084000182000182000182 + 0001820001820001820001820001820001820001820001800001800001800001 + 7F00017F00018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000017F00017F000180000180 + 0001820001820001840001840001840001840001860001860001860001860001 + 8600028700028800038700038200027C00037400026C00016400015A00004C00 + 004E04043E00004C0C0C37000045090A3300003A00013A00003E000040000143 + 02043D03043700003F06073300004307073B00004C04044E00005B0000660001 + 7202027B03048001028200018400018400018503047800007B0607650000660A + 094A00004C02004502004101003C00004606063900004706083A000045020748 + 00005A00006200007407096C00007F0908770000830403820000870000870000 + 8600008400008200018000017F00027B00027301016B00026600015F00005900 + 005200004C00004600004502013D00004707073800004706083B000044030540 + 00004200013F00004706053A00004707063800004005033900003B0200350000 + 3F08053200004009063300003E05033900003F04023D00004906054200005906 + 055600006A05076D00037100017600027B00047E00058102048001037E00017D + 0000820001820001820001820001840001840001840001840001840001820001 + 8200018200018000018000017F00017F00018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00017F00017D01017F0001800001820001820001840001840001860002860002 + 8600028600028400028400028400048200048101067A01057601046E00036500 + 015C00005300004C00004500003B000042060734000041080B3400003C030638 + 00014304064302044100023D00003A01023C03043800003D03043A0000430303 + 4500004E00015400006000006D02047604047C01038000018400018600018301 + 027D01017500007307066400005800004B00004B04014300004101003E000042 + 02023E00004201034000024A00015E00006D00026E0000790302760000800100 + 8200008702008700008700008400008200017F00017D00027901027601046C01 + 036501015D00005300004E00004900004502014404033D02003D040239000040 + 04043D00004302044000004200014300004401003F00004202013E00003E0301 + 3B00003A01003902003A03003800003C03013800003E03013B00003C01003B02 + 004003014300005000015800006A01047400037F010784000687000587000584 + 00027F00017E00017C00017D00027F0001800001800001820001820001840001 + 8600018600018400018400018400018200018200018000017F00017F00018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000017F00017F00017D01017F00017F0001800001820001 + 8400018400018400028400028400028200028200048000047F00047900047203 + 076A03066502045E00045500014E00004500003E00003B00003A020136000039 + 03033400003B02053900033C01053B00003E0000400001430204370003380002 + 3B02033800003E02023E00004401004900005100005A00006301016F03027902 + 038001038500008400008200017F00017A02027403016B010061000054000049 + 00004901014100004303033C00004302043F00004401044B00016502046F0103 + 7200007600007B00007F00008401008601008802028300008202037B00007C04 + 057601047605087005086000005800005700014E00004C00014100003F02003A + 01003901003600003B03023800003E02033E0000420002430000430000420000 + 4302013E00004202013A00003D02003A01003B02003A01004005033E01004205 + 033F00004201004000004101004300004B00005800006500027200037C000384 + 00048A00058C00058C00038700028400027F00007C00007A00008004047F0303 + 8001028000018200018400018700028700028600018400018400018200018200 + 018000017F00017F000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000017F00017E00007C0100 + 7E00007F00018000018101028300038300038300057E00028100057B00007C00 + 067700037B03087203075A00004F00004E00014700004701023F00003F010139 + 00003C03043802023B05053500003B02033700003B0002390000430204420103 + 4000013D00003600023D04073400004307083700004606063F00004800004B00 + 005300005E02016802037503037D00028500008600008200017F00017E020279 + 03027101016700005B00005000004A00004805043B0000450707390000460507 + 3E00004D00036201036D00027000027500017B01017F01008200008200008200 + 008505067500007C07086A000072070A6500016504085800005700034A000051 + 05063E00004606053600003A03003600003B0504310000400807350000460507 + 3D00004400014200004504033B00004707063700004407053800003D02003C01 + 004306043B00004908073F00004D05054600004C00015101005401005B010163 + 00026D00037600057D0004850005870004890002880001860001830000810000 + 7F00007C00007B03037A02027C02027D01018000018200018500028700028600 + 018600018600018400018400018200018000017F000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000017E00007C01007E00007F00018000018101028100038100037D00 + 0281030876000080080D6E000075060A6A00006302064900004504033A000045 + 07073500003F06053400003901003700003D0405340000410708350000440507 + 3C00004100023B00003D00003F00004302043B020533000045080C3700004A09 + 0B3A00004705064100004800004E01005702006303037002027B000284000286 + 00008100008001008001027E02027801027000006500005A0000500301410000 + 490908350000480A0A3900004806074A00005C00006500006B00027202027702 + 037A02027E02027D01017F05057400007C0A0A6300006F0A0C57000060040954 + 00015200024600005207093E00004B090A370000400706370000390302310000 + 420A09330000480A0A3900004705064100004302013B00004A0908390000480B + 093700004407053C00004303023E00004E08084200005608094900005A030659 + 00006702046C01046E00047001057201047502057901057A01057B00007D0000 + 8100018100008300008500008500008100007802017203017602017901017D01 + 0180000183010287000286000186000186000184000184000182000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000017E00007E00008001008001008000 + 018000018001037E01037C01057200007E0A0F660000730C115B00006203074F + 0000430303320000400A09320000420A093300004004043800003F0000390000 + 4806073A00004D090A3E00004D07084500014502054201034000013D00003700 + 0141060A3700004C0A0F3A00004B080B3A00004301024300004800005202015D + 03026C01037901028400028600018100008001008200018101027E0103780102 + 6E01036303034F00004F0805390000480D0B3700004B0B0B3C00004D02045400 + 005D00006601036C040571040674040477020376010273010177090B5F00006E + 0B0D5000005C070B4500004C00034700004E05073E00004D0B0C390000460A0A + 3300003C0302370000410807330000480C0C3900004B090A3A00004301023F00 + 004707063900004C0C0B370000480B093700004202014200004E06064500005C + 090B4E000066070B5800006900057701067C00067A00067A0006790105780004 + 7601047800047800017800017C00007E00008000018400018600018000016F00 + 006B02006F02007403017901017D010180000184000186000187000186000186 + 0001860001840001820001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018001 + 008001008001008001008000017F00017D00027901027500037A090D61000071 + 0D125200005F080C4900004800013800003A0907300000450D0C350000490909 + 3C0000460001460000500306430000560A0B430000540A0A4500004B02043E00 + 003E00004000014302043C00063500004A080D3A00004F0A0D3C00004806073E + 00004000004201004B01005702006701027601048200028700028100007F0000 + 8400008501018301027E02027303036905055502014200004B0B0A350000480C + 0C3700004B07084600004D00005200005B01016104036905056C04056F02046E + 01036F0406610000690A0E4C000058080D4000004603083B00004300033A0000 + 4A090B3900004A0B0D3700004307083A0000400103370000480A0A3900004C0C + 0C3A00004806073F0000420201370000480B093700004A0D0B37000047070641 + 00004A02024600005C080A5200006C080D5D000074040B7100027F0005820004 + 8000048000047E00037C00037A00017A00017901027901027901017A02027C03 + 017C03017E03017904016800006401006902006F02007602017A02027F000182 + 0001860001860001870001860001860001840001820001820001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018001008002008001008001007F00017D01017B000276 + 010475060A6500006B0A0E4E00005A090C4200004A05083C00003C0403320000 + 460B09390000530B0B4300005704065100005D020554000062090C4C00005D0A + 0C4700005204054600004602034201034000013D00003A000242040A3A00004D + 070D3E00004E070A3B00004002023C01003E0100470200510100630101730003 + 8100038700037F00007F00008300008600008600018101027902036C05035300 + 00500604390000460B093500004709093F00004B02044800004B000051010258 + 02025F02036202026501016501016100006305094D000057070C3E000046060C + 3200003A000538000142060735000048090B37000047080A3A00004201033F00 + 004704073A00004B090A3A00004A08093B00004202023C000044070537000048 + 0B093700004909083B00004701014800005703055300006F090E6300007B070E + 7200007E00067E00048100038100038300038300038300038400008200008300 + 038001037C02027802017403006F03006E03006804005C00005E00006401006C + 03007203017903027D0101800001840001860001870001870001860001860001 + 8400018200018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180010083010183020082000080 + 01007F00017D01017800037300036C01046A07094E00005405083E0000450608 + 3400003E05063A00004606053C000055090A4A000063080B5A00006600056700 + 056E070A5C0000690B0C4E00005A07064700004900003F00003E000040000143 + 02043F00053A00004903093E00004E040A3F00004503043D00003900003A0100 + 4202004F02006101017100038000058601047F00007F00008500008600008600 + 008200017901026E040358010046000046070333000043080639000048040545 + 00004300004600004A00005000005500005A00005D00005D00005B0003510000 + 5504073E000045050B31000036030A3200063801043500004005093500004505 + 0A3A00004502054200004600024100004905063C00004806073B00004404043F + 00003F02003800004207053500004508063A00004704034600004E0000520000 + 67060A6600007D091077000385020C7D00037800047800037E00038300038A00 + 018E00019400029400029100028900018200017600006802005E030056030054 + 03005200005800006002006804006F04017504027B0101800001840001860001 + 8700018700018600018600018400018200018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 01008301018302008301018001007F00017C00007700036F0103660002570000 + 5603054000004203053000003706083602024000004500005505065100006706 + 0863000073040872000378040970000373080B5F00006408074F000052030047 + 00004804054302044100023D0000400003410004410000470003430000470003 + 4000003E00003900003C01004101004C01005901016802037501067D02067C00 + 007F00008200008500008700008500007C00017202025F000054010048000044 + 04003E00004303024100004301023F01014101014300004700004C0000510000 + 5500015500015100005000024700004300033A00013802073300073503073900 + 033D01023A00014001033E000143000344000045000147000146000243000045 + 01024100004301024000003E00003C00003B02003A00004003013F0000470101 + 49000050000055000061000069000177060A7A020783050B8000058100067C00 + 037C00017F00018600028900028E00039000038E000389000281000176000068 + 01005C01004F01004501004501004A00005100005D00006902007403017C0202 + 8000018300008400018400018400018400018400018400018600018400017F00 + 027B00027D00027D00027F00027F000180000180000182000182000182000180 + 00018000018001008000018001008301018301018001027B01017601026F0101 + 6802036104035200004C00004400004301023900003B02033501013C02034700 + 005400005900006700036B00007702057800047B02067E03077D040877000374 + 03066400005F03025100004B01014000003E0000400001430204410000400000 + 4301023F00004301023F00004101004000004101004000004603024500005000 + 015000005D02056803057801027F00008300008400008500008500008300017C + 00017705056C05035F03025201004900004000003C00003900003B0203390001 + 3F03043C00004601044400004C01034B00014900004600004701023F00003E02 + 0337000038020239000140000142000045000341000047000343000046000245 + 00014600024400004700034100004500054100004400043D00003D0504390302 + 3B00004000004800005200005F01026902057001057401047800047900047B00 + 027B00027B00027F00028600018800008600008500008200018001037A020374 + 03066D04076201035C03064D00004901013F00004002023F01014502014E0100 + 5D00006D00018000028B00038E00028D00008700008200007F01007D02007F00 + 018200018700028400027800047201057401047800047B00047D000280000282 + 00028702048601038501018200007F00007E00007D00007E00008202037F0002 + 7901056A00006202025000004A00003E00003A01003A03003A03003B02003E00 + 003F00004200004800005C04046802037101017901027F00018001027C02027C + 02027D01017E00008300018000047901056A0104540002460000440104420103 + 4000013D00004200004504033B00004707063900004606053C00004101004000 + 004605043E00004C06064200005105064B000060060675030380000182000183 + 00008600008600008500018100017F02047601026901025D0100520100470000 + 3F01003800003900013E050834000043060A3700004704094000004601044200 + 004702053B00004707073700004206063600003D01014200004B02043F00004C + 06073E00004B05063F00004400024200004702053D00004A040A3C0000480208 + 3E00004100013C03023D01014100004900005400006000016C01047702057B00 + 047D00027F00027F00027D01017B01017901017F00018700008C000088000184 + 02027C02027402026901026101015B02055808094600004B0708370000420607 + 3700003D03043E02034901015B00016D00018400049100039300028F00008700 + 008001007902007803007D010180000187000286000478000572010574000578 + 00057B00047F00048200028400028500028500028400018200007F01007D0200 + 7D02007B02007700027703086500006507084C00004C07043800003503003405 + 013404003601003A00004200004A00005200025A00026503036F01017A000082 + 00018600008301017E03017C03017D02008100008800018700028000066E0004 + 5600034600003C00003D00003F00004302044302013B00004A09083900004A0A + 093700004407053C00004202013C00004D0A093E000051090942000053070859 + 01017103037E02028001028200018600028500018500018300017F0002780102 + 6E02016403005902004E010047000040000042040438000045090A3700004A09 + 0B3900004805084100014300033A0000490909370000480A0A3500004206063A + 00004202023B00004A08093A00004A0A0A3900004605073E00004401043C0000 + 4A070A3A00004C070A3C00004902054100004600014A00004F00005800026300 + 046C01047701067E03078000048200028200028200018000017F00017B02007D + 02008200008400008202037D03037702036D0100620000590000570305490000 + 51080A3C000049080A35000043060A3A00013C02034201005500016800017F00 + 048B00038E00028B00008400007D02007803007603007B01017F000186000286 + 00027F00047B00047D00047F0004800004820004840002840002830001810000 + 8000018001027C02027A03017903027203016B00035C000065070B4A00005509 + 0A3C00004407053800003C04003C02003F00004700004F000057000060010568 + 03056A02037101017D01018400018600008400007E03017C03017D0200810000 + 8600018600027E00066C01045400034400004502054201034000013D00003F00 + 004707063900004A0D0B370000480B093700004003013B00004808073A000050 + 0D0C3E00005109094500005805046E04037903027C0202800102830003840002 + 8500018300017F00017B00027402026B04026202025902005201004A00004400 + 004906093A00004C0B0D3900004B0A0C3900004203053C000045060835000048 + 0C0C370000480A0A3700004002023C00004507073700004A0C0C350000460A0A + 3500004001033C00004706083A00004F0A0D3E00004E070A4000004B00015300 + 015A00006100046700037001057901057E000584010484000286000286000184 + 00018200017F00017D02007B02007D02007C03017802017403016C0000640000 + 5A00005300004F00005105064000004E0A0B39000048090B3800003E04053802 + 023F02005000016200007800048500028800028600008200007B020078030076 + 03007901017D0101840002860002840002840002840004840004860004860004 + 8600028400027F00017F00027C01037A02027702037203016F01016702005500 + 00570406450000550B0B3E00004B0A093900004303024300004600004E000055 + 00005F00006600016F02047204066F03027402027F0001860001870000840000 + 7D02007B02007D02007F00008600018600027E00066C01045400034400003E00 + 003E00004000014302044202013900004A0A093700004A0D0B3500004308063A + 00003E03013800004C0C0B3A00004F0C0B3E00004D07074F0000670303710101 + 7601027A02037E01038000028400028300018100017F00027A02037303036D03 + 026602005E010057000052020344000052090B3E00004D0B0C37000044080839 + 00003B0302320000440B0A330000480C0C3700004707073E00003E0202350000 + 440B0A330000460D0C3300004108073A00004103033900004D090A3E0000530A + 0C4300005304075100006601036E01037201057702057E000581000386000286 + 00018900028900018700018600018200007F01007D02007902007605036F0401 + 6A00006400005E00005900005200005000004C00014000004E08093C00004B0A + 0C39000047050A3B00003602023B02004A00005D01007100037E020284000183 + 00008001007B02007803007603007901017D01018200028600028B00028B0001 + 8B00028B00028900028700028400028000027F02047902037503037002026B00 + 026601006100005900004A00013900004909093900004C0C0C3A00004C060647 + 00004C00005300005D00006601007002047801027C01037B0002760102780102 + 8200018700018700008600007D02007B02007D02007F00008600018400027C00 + 066A01045300034200004401044201034000013D00003E000046060537000048 + 0B09350000450A083600003E03013900004207053700004B0B0A3A00004B0807 + 3E00005003015D00006700006D01007202027902037E01038000028100018500 + 038100038001037A02037601026F01016B010066020257000058030747000053 + 080A3C00004909093600003D05043500003D0706300000440B0A350000490909 + 3B00004202023C0000400706330000430B0A320000420A093400003E02023C00 + 004705063E000054090B4700005C080C5100006201057401047C010380000581 + 00038500038700028800018A00018900018700018600018200017F01007B0200 + 7902007403006905016203005C00005600005100004E00004C00004B01004400 + 004A04043C00004B090A3A000049080A3B00003E02033802013902004800005B + 01006E01037901018000018100008001007D02007902007902007B01017D0101 + 8200028700028D00019000018F00018D00018900028400028000027B00027904 + 057103036A02036301015D00005800005600004D00003A00003B050533000045 + 09093900004E08094500005401005900006200006D01007503037D0204820203 + 8400017E00007A02037A02038400018900018900008600007C01007801007B02 + 007E00008500018400027C00066A01045300034200003D00003E000040000143 + 02044101003C00004407053700004308063600003E05033900003A0100380000 + 4409073900004707063A00004403024800005200005B00006400006C01037302 + 057A01057F00028200028601048601048301028000017D010179010178020171 + 03036300005600005B02054700004E06063C0000410604370200360301310000 + 3D07063200004506083A00004702054000004100023800004206073300004108 + 073400004004043D00004000004100005105064C000060070A59000067060A6B + 00037D00028600018600028700018900018900018A00028A0002870001840001 + 8000017D01017902007603007403006B04015C01005300005000004D00004800 + 004800004600004502014302013E00004806073B00004906093C00004502053C + 00003901003A01004800005801006C0103790101800001820000820000800100 + 7D02007D02007F00018000018200028700028F00019000008D00008900008600 + 017F00017901027202026E03056503035D00015400004F00004A00004A000043 + 01023900013000003E05063700004A06074400005501035900006600016E0002 + 7801027E02028202038501018600008200007E02027E01038800028B00018B00 + 008500007C01007801007B02007E00008500018200027A00066A010453000342 + 00004603064302044100023D00004000004101003E00004003013A00003E0301 + 3900003A01003800003C03013C01004005033B00004101003F00004500004B00 + 005200005C00006402026D02047502057B000280000287020586010487000283 + 00008100008000018102037C04056900006300005900005600024A0000480202 + 3E01003B04013701003603013500003B03023C00004300034200004300014100 + 014100023E00004001033A00003E02023D00004000004100004A00004F00005D + 02056100026C03066F01077A0207820000870000870000880000890001880002 + 8801038702048000017D01017901017602017003016D05006B04016406014E00 + 0048000048000047000044010042020041010040000041010043030240000045 + 03044000004401044100004000013A01003E01004A00005A00006B0002780201 + 7F00008200008400008400008200008200008200018200018400028600018B00 + 018B00008700008400007D01017802017002026904026205045803014F000047 + 00004200004000004202024004043800003A01043C0000450003480000530001 + 5900006200007403067902037E02028001008300008500008500008400007E02 + 028001038A00028D00018D00008600007E00007801007B02007E000083000182 + 00027A00066A01045300034400003E00003E0000400001430204430201400000 + 4303023C00003F04023B00003D04023B02003A01003900003E03013A00004003 + 013C00004101004300004A00004B00005300005500006501016B00007A050681 + 04068100038500038700028600018600008500008300007F00007B0307700305 + 6700035C00005100004900004100003D00003B04013702003C04033800004102 + 044000004601044600024500014400004500033F00004202023E000042010043 + 00004900004F00005800006300026B00037401047900057F0004870002890001 + 8900018700018500008100007D00007800007C05067303037206056500006403 + 005900005A00004F00004900004000004302013E00004202013C00003D02003C + 01003C00003D00004202023F00004300034100004600024100014002023F0000 + 4C00005500006C01037500008000018300008800018800018800018600008600 + 018300008300018300008500028301018405067A02027606066700005F000053 + 00005200004A00004701013E00004002023900003B02013B00003D0000410000 + 4900015000035A00056302066C03067403077800047B00027F00018001008200 + 008201008201008002007D01018000028900018D00018D00008700007F010079 + 02007C03017F0100830001820002790005690003540003450000440104420103 + 4000013D00004300004605043C00004707063700004207053900003D04023900 + 003E05033600004308063700004407053C00004201004200004B040144000058 + 05045500006D07086D00017D06077E0103830102870002870000870000860000 + 8600008300007D02047601046D00026400005B00005000004800004100003E01 + 004106043500004307073700004704074000004801044800004D01054100004C + 05083C00004705063F00004600004A00005200005D00016701027201047B0004 + 8000048400028700028600008400008200007E00007A00007802017303036D03 + 026E09075D0000630A064F00005805034A00004A000042000042050338000043 + 08063500004207053600003B02003B00004004043A00004707073C0000490407 + 4100004400024100004603024500005E04036100007C08077C00008701018900 + 008B00008800008800008500008300008100017F00017C00007D070670000077 + 0B0A6000006308044F00004D00004500004603003B0000440907340000400706 + 3500004000004900005000005500035D00046600056D02057501067A02067D00 + 027F00027F00018001007F01007F02007D02007D02007D01018000028B00018F + 00018D00008700007F01007902007C03017F01008500018400027B00056B0003 + 5600034700003C00003D00003F00004302044903033F00004C09083A00004A0A + 093700004308063C01003E0301360000450A08350000480B093700004606053E + 00004202013B00004D0707450000600A0A59000071090A7202027A0203800102 + 8200018600008600008601008600008300007F00017901027500016D01006400 + 005B00005000004900004903033D00004909093700004A090B39000048050A43 + 00034C000546000052060A4000004D090A3C0000490605430000490000530000 + 6100026D02047702058001038700038700028600028300017E00007B00007700 + 007402026F05046B07076205045700005E0B09470000560B094000004D060341 + 0000420201380000470909350000460A0A3300004007063800003E0202360000 + 4909093900004D090A3C00004B05064300004501023F0000560607500000700A + 0B6A00008408088300008700008900008A00008800008500008100007E000178 + 00017404046500006F0B09550000630C0A480000500604410000410100370000 + 470A083500004A0D0B3700004505044300005A00026200036600056B00057100 + 067600057A00067E00057F00027F00027F00017F01007D02007B030079030079 + 02007D01018000028B00018F00018D00008600007D02007803007A03017F0100 + 8500018600027F00056F00045B00044A00014702054201034000013D00004600 + 004D07073E00004F0C0B3A00004B0B0A3900004005033A000043080635000048 + 0D0B370000480B093900004003013900004308063A0000540C0C490000650B0B + 5F00007105047601027B01018001008200008401008401008601008401007F00 + 007D01017901027402026D00026400005B00005100004B00004F07073C00004D + 0B0C3900004B0A0C39000045020747000153030A420000510A0D3C00004B090A + 3A00004502014800005201005F02016D03027803048102038700028700018200 + 027F00027D00027801027202026D020465030360030453000057070643000055 + 0D0D3C00004C0B0A3A00004303033E0000450707370000480C0C350000440B0A + 3300003C03023A00004307073700004C0C0C3A00004D090A3E00004501024000 + 004B0505450000610C0A570000790E0B74000085060585000088000088000085 + 00008000017D01017801027002026400006508094E00005E0D0A430000520B08 + 3B00004405013B00004407033900004D0C0B3C0000520B084400005502016801 + 047100047300047600057900057D00048000058000058000028000027F00017F + 00017D01017B02007902007902007B01018000028900018D00018B0000860000 + 7B02007803007A03017F01008600018700028100067100045D00044E00024000 + 003E00004000014302044D0303440000520A0A3E00004F0C0B3A00004808073D + 0000400301370000480B093700004C0C0B3900004807063C00003B0302320000 + 460B093A0000580D0B4A00006508076300007002027602017B02007F01008002 + 008201008402008201008100008001007E02027A02027402026D01006400005C + 000057000349000054090B3E00004C0B0D37000044070B3D0002490005430000 + 51070B3C00004A0C0C3500004308063C00004300004B01005902006703017503 + 037E02028500028600018000027C01057A02067704076E03056601035B000051 + 00004F0102430000500A0B3A00004C0C0C3700004506083C00004300033A0000 + 4B080B3900004A0B0D3500004307083A00003E0203350000480A0A3900004D0B + 0C3A00004A06074100004200013C0000540A0A490000670D0C5C00007A0B097B + 02008001008400008400008102017C02027504027004036905055E04044D0000 + 57090A4000004E0B0A3900004609073B00004205013B00004E09064200005909 + 084C00006309096501017502057C01057C01057E000580000580010380000280 + 00028000028000028000027F00027F00027D01017D01017D01017B0002800002 + 8700018B00018900008400007B02007803007A03017F01008700028900028300 + 067600056100055100034801044201034000013D00004A000051050642000051 + 09093E00004C09083D00004404033E0000440705370000480B09390000490908 + 3B00004003013400003A07053300004B0B0A4000005808075300006201006C02 + 017102007803007B02007D02007F02008103008103008301018301018001027E + 02027901027500016D00026701025A00005C030647000051080A3A000045090A + 3500004003074300014D03093C00004A090B330000400A093100003B04003E01 + 004801005402006103006E01007800008200008200017D000279010578030672 + 04066801045D00005200004A00004700004B05063A000048090B35000045080C + 3700004101064100014904073C00004B080B39000047080A3800003E02033A00 + 004206073700004A0A0A3A00004A08093D00004301023D00004606053E000056 + 0C084A0000660A056600007706037E03018002018002017B02007403016C0300 + 6703015E04034F00005106083E00004A09083700004409073700004005034102 + 004C07044300005B08065200006B09096500007606067C010381010281000381 + 0003810003810003800002800002800002800002800002800002800002800002 + 8000028000027D00027F00028700018900018700008200007902007803007902 + 008001008900028A00038400077901066400065400044100003E000040000143 + 02044F01024700005004054200004C06063E00004605044000004101003C0000 + 4606053900004807063B00004704033D00003701002F00003F07063800004D08 + 054700005902005B00006803016E03007302007803007903007C04007E040080 + 04008402028402028301018001007D0101790102760104700305630002560000 + 5702064200004805083700003E05083A00034200044100004605073500003E08 + 072D00003707033402003B03004202004D01005901006600007401007F010081 + 01027C01057600057200036C00026300025A00005100004B0000490003400000 + 47050A38000043060A3700004002083F00024600044300004B03093C00004805 + 0A3A00004403053D00003F00023A00004606063900004806073B000047030440 + 00003E00003B00004808074000005306035000006704006C0100790401790200 + 7902007401006C01006401005C01005401004B00024000004704073700004307 + 073700004106043E01004502004600005906045700007008096C00007D06077D + 0002820001840000840001820001800001800001810102810102800002800002 + 8200028400028400048600048600048400027D00027D00028600018900018700 + 008200007902007603007902008001008900028C00038600077A000667000755 + 00044A03064302044100023D00005600005600005000005101004800004A0300 + 4300004202013E01003F02003C00004202023F00004301024200004000003700 + 003603013500003D04033E00004702004A00005100006005016504016A030070 + 03017603007A04007C0400800300830403840202830101810000810000800001 + 7F02047B03076B00006600005900005400024800004602033E00014001034300 + 014400023E00003E02033500003704023202003502003A030040020048000050 + 00005B00006501007101017303037103076A01046300005C00005300004F0000 + 4C00024A01034200024302043D00024003073D00024101073D00034200044900 + 014D00024A00004E00034A00005000024D00005000005000005100004C00004E + 00014800004901014400004100003E0000400301410000490401460000520000 + 5700006103006904026804006702006302005D00005800005100004A00004100 + 004001033D00004103033D00004404034300004901014900005500005D00006E + 06077302057D06077D0004800002830000830000830000820000800001800001 + 8101028101028000028000028200028400028600028600028700048400027F00 + 027F00028400018600018400008001007902007902007D02008200018900018A + 00038400067A02076801045801044400003E00004000014302047207046E0502 + 6602005B00005100004900004100003D00003E03013A01003F03033C00004302 + 044200004800064400043C00033800003902053700003B02033800003F010141 + 00004B01005000005E02016200007002027600007F02048001028001007F0000 + 8100008200008500008500008500008300017F00027900047302056903045F03 + 025401004B00004600004A01034400014703043F00004103033A00003B020139 + 00003E03014000004603024700004F01024F00005800025400005000004B0000 + 4C00014700004701013F00003F01013C00003C02033A00013D03043B00004102 + 043F00024200054500014D00005600005C02026103046905056E040374020277 + 00017B03047901027301016B00025F02015300004700003E0000430000440000 + 4901014700004E01004A00004D00004C00004A00004700004C02024600004D03 + 034A00004F00034800013D04023904013B02003E01004400004800004E000054 + 00006603056B02057001057400057800057900047B00057D0004800001820001 + 8200018000018000018000018000018000018000018000018000018200018200 + 018200018200028200018000018000018000017F00017F00017D01017D01017F + 00018100008700028700028300007D00027503036902005800004A0103420103 + 4000013D00007B04027603006E01006501005B00005000004600003E00003C01 + 003F06053500004307083900004903094200014800073F000240030734000040 + 070A3000003D07073500003B02014100004D05054D00006306075F0000740608 + 7300007A02037C02027D02008000018300008600008800008800008800008600 + 028000027C01037303036A03016001005800005000004900004B02044000004A + 06073B00004707073B00004103033E00004305053B00004806073E00004B0506 + 4400004A01034200004404033A00004508063500004007053500003A02013900 + 014006073800004607093B00004904074100004B00015700015F00006602026B + 04027503037C02028200008600008C00018900008100007800006A02035C0201 + 4C01004400004400004903034100005006064300004F05054100004200013C00 + 003E05043500004408083A00004A05084400004701023C01003902003E010044 + 01004D00005700005E00006500007201057600057900057B00057D00057D0005 + 7D00057D00047F00028000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302047F00017B01017501006B02006001 + 005501004A000042000044040338000045090A3500004A080D3A00004A040A43 + 00034300053A000047080A350000440A0B3300004206063C0000450403430000 + 570A084A0000660A095900006B05066900007504027A02027E02027F00018400 + 018500008600018600018500018200027E01037702036F03026702006200005A + 00005100004300005106084000004E0A0B3A00004808083F0101400404380000 + 4709093700004B090A3A00004A06074300004301023A0000490909370000460A + 0A3500004206063A00004103033B00004D090A3E000054090B43000053040751 + 00006300026900036D02047103037803047C0202820000850000890000860000 + 8100007901016E03056105045303024902004502013B00004C09083C00004F09 + 093C00004706053C00003C0302340000420A09330000480A0A3A00004A040544 + 00004100004100004900005001005902006202026B03047302057800047B0004 + 7D00047F00048000048000047F00047F00048000028000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00008300 + 008000017B01017203016902005D02005300004900004200004808073700004A + 0B0D3900004B090E3C00004701074100014A040A3A00004C0B0D39000048090B + 3900004202024000004D0707400000570C0A4700005C09074D00005D00006E04 + 037504027703027C02028001028200018500018500018500018400027F00027C + 01037702037002026E0103670303530000580408470000570A0D420000510B0C + 3C00004404043D0000460808350000480C0C370000490B0B3B00004404043E00 + 004707073700004A0C0C370000480A0A3900004301023F00004D050543000059 + 0B0C490000610B0B5300006204056F01057501067603067803047B03047E0202 + 8001008400008700008500007F00007901016F02046303035701014B00003F00 + 004508063900004C0C0B3A00004A0A093700003E030139000041080733000047 + 0B0B3900004C08093E00004B01014B00005000005700005E0100670303700305 + 7704077D04087D00048000048200048200048200048200048200048000028000 + 0280000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302048800008600018101027A02027202026602005D010052 + 00004E02034000004E0A0B3A00004C0B0D3900004807094000004500033E0000 + 4D080B3C00004F0B0C3C00004806073F00004504033B00004E0B0A3C00004F0C + 093E00004C07044900006304016C02017002027503037A02037F000282000283 + 00018500018300018200028100037E01037A0203790203710305650106550000 + 630A0D4A00005C0C0D4300004E06064300004504033B0000490C0A350000480D + 0B3500004209073B00004001033700004A090B3900004C0C0C3A00004C060645 + 00004900004700005B08075000006B0D0E5B0000700C0C6F02047B01077F0107 + 7F01067D02047D02047E02028001008200008501018400007E00007800006F01 + 036501015B00004D0000430201350000460B09350000480D0B35000043080638 + 0000400503360000480B093900004C0B0A3E00004E06064D00005C0000640000 + 6600016D00027401047901057F01068302078400048600048600048600048600 + 0484000484000482000280000280000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00008E00028C000287000281 + 01027801026E02016602025D03025100005305064000004F090A3A00004A070A + 3C00004502053F00004904073C00004D080B3E00004E08093D00004501024200 + 00470605390000490C0A350000450B063600004502005601006201006701026D + 03027303037902037D00027F0001830001830001830001840002820002810003 + 8001037A01056D00036D070C5C0000690A0E5000005E070A4B00004E00014700 + 004A07063A0000480B09370000450A083600004004043C00004604093900004B + 080B3C00005007094400005000014E00005D03025400006F0B09600000790D0C + 7000007E07088400068700068300058100038001038001028002018102018301 + 018200007E00007800007100036800015D00004F000041000042070533000044 + 0B09330000430A083400003E03013E01004707063C00004E0808420000540809 + 4700005903036802037100037300037800047B00048000058300058500058600 + 0487000487000486000486000484000484000482000280000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02049200039100038A00038400027D00027601026F02046905055C00004E0000 + 5204054200004C06063E00004604054000003F01013A00004606063A00004A06 + 073D00004903034200004502013D00004606053600004209073400003C07043E + 01004D00005800005D00016503036C04057302057800047D00047F0003810003 + 8300018500018500018600028400028100057A02076F000275060A6700006D06 + 095D00006104055700005301004900004D06033E00004808043B00004306023E + 01004100023D00004903093E0000500507460000540103540000610304620000 + 7107066900007B0A087400008108068101028900048B00058700048400028000 + 027F00018002018002018102018001007E00007B01017702056E010365000159 + 00004800003A00004207053300004108063400004005033F0000460300440000 + 5205034900005906054E00005B08076002037201047B00027D00027F00028200 + 0284000286000286000287000287000286000286000284000282000282000280 + 0002800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00009300049100038C00038500018100017B0002 + 7803067205076100005C00005200005101024800004A02024500004301023C00 + 003A02013A00004002023E00004501024200004500004200004401003E000041 + 04023900003B06033803003F04024600004F00005600005D03036403056C0405 + 7002047601047A00037E00038000008200008400008600018600018600027F00 + 037E00067900037A02077100027102066800026702045B00005800005000004F + 02004800004A03004700004701014500014600044500014C00034C0000530001 + 5600005C00006B05067307067403017C07047C01008104008100008600008D00 + 048C00048800038300017F00017D01017E03017F04027E00007F00007E00007E + 02027B03077403066D02055F01024A00004200013C00003E03013800003E0301 + 3F00004300004B00005300005500005C00005B00006303036002036B05067700 + 017F000180000282000284000286000287000387000386000286000284000282 + 00028200028000027F00027F0002800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017B01017D01017F00018200018500008700028700027F + 00007901017304026B02005A00004600003E00004000014302048D00028A0001 + 8A00018500008200007E00007A00037300037003056804046104035A02025301 + 004D00004900004100003D04023603003D06033900004104023E000044010042 + 00004500004200004501023E00004002023800003B02013C0000460001490000 + 5202035200005E03066100026A03066F01057502057B02068102048401048601 + 048800038700018600018800058700058500058200047F00047A000375000371 + 00036C01036602026101015D01005700005100005000004D00004D00014E0003 + 5000035300035900045E00046401036901026F01037500017800007D02008200 + 008502008702008A00018F00068C00068600038000007B00007A00007C03017D + 04027F01007F01008000018001027B02067601046C0001610000500000440000 + 4301023E00004003013E00004401004A00005200005D00006800016E01037003 + 057004036D02046F01017B000282000282000282000284000284000284000284 + 00028200028200028000027F00027F00027D00027B00027B00027F0001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018000017F00017D01017B01017D01017F000182 + 00018500008700028700027F00007901017304026B02005A00004C0103420103 + 4000013D00008800038700028700028500018300018100017E00037800037702 + 056F02046802036202025D01005500005100004A00003C02003C070434000042 + 09073600004606053D00004502014400004903033D00004A06073A0000460606 + 3A00004101014100004B02044400005406074C00005F06095B00006601036D02 + 047201047902037E01038100038500038600018700018A00038A00038A000587 + 00028600048100017E00037A00017601047101016E01036902006400005F0000 + 5F00005B00005700015600035800035D00036100046700036C01037101017500 + 017800007C010080010084010087020088020088000188000587000683000580 + 01037901027802017801007A01007F01008001008000018001027F0106780004 + 7100026300005200004D02043D00004707073700004606054300005100005E00 + 006800007400027901027A02037A02037601027700017F000282000282000282 + 00028200028200028200028200028000027F00027F00027D00027B0002790102 + 7801027901027F00018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302048001038100038100038200028200 + 028100017F00017E00017B00027801027101016C02016602006102005E020154 + 0300430300360000450B06350000490C0A3900004706054000004501023D0000 + 4E08093E00004D080B3C00004904074100004400023C00004D06094200005607 + 0A4900005A03065800006301016901026E00007301017901017D010180010283 + 01028800028A00028900028900018700028600018300017F00008001037C0202 + 7801027403017101016E03006D01006902006200016100046300046700036C01 + 046F01037401047801027A00017C000080010082000084010086010087020085 + 01018000047E00067B02067A0304780304760201760100780000800201820000 + 8200018101028101067900047300026600005700024400004E0809390000480B + 093900004D06035100006600017400027F00048300038401048101027D01017C + 00007F00018000018000018000018000018000017F00017F00017F00017D0101 + 7D01017B01017B01017901017802017901017F00018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00007702 + 037902037A02037E01038001038000028100018100018000027D000279010276 + 01027002026B04026804026106024900004C07043E00004F0C093C00004E0B0A + 3B00004504033F00004806073C00004F0B0C3C00004D080B3E00004500033E00 + 004704073C000050090C4000005306094500005300015800005D00006400006A + 00006E01007403017903027D0303820001860001860001860001870001860001 + 8600018400018200018000017F00017D01017901017903027703027304026D00 + 026C01036E01036F01037401047801027C01037E02027F000180000182000082 + 00008201008201008201007F01007901057302067002046F03026F0302710200 + 7502007A01008102018400008400018400018000057C01057400036900035300 + 005104073C00004A0C0C350000480B094000005500006D02047A02038601048B + 00038B00038701018200007F01008000018000018000018000017F00017F0001 + 7D01017D01017D01017D01017D01017D01017B01017B01017B01017B01017F00 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302046A02036C01037002027702037C01037F000282000283 + 00018500018400028000017D01017903027504027205036B06045C00004D0000 + 5C0907470000570C0A4000004D070740000042020239000048090B3900004C0B + 0D3A00004A040A4100014502073B00004C090E3C00004F0A0D3E00004D050547 + 00004F00005200005800005E00006401006902006F04017304027902007F0100 + 7F01008001008200008200008400008400008300008300008100008001007F01 + 007D02007E03017A02027602017601027801027901027C010380010281010283 + 01028200018200008200008001008001007F01007F01007802016D0506660305 + 6301016100006400006A01007403007D04028402028600008600008600018100 + 057C01057600056900055500024200004A0A0A330000430E0B3300004C070451 + 00006F04067D02048900048F00038D00038A0001820000800100800001800001 + 7F00017F00017F00017F00017F00017F00017F00017F00017F00017F00017F00 + 017F00017F000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00005D000062000067020070 + 02027902037E01038400028600018800018700028600018200018001027A0202 + 7A04037405036700006B0506590000660A094A0000570A084300004504033C00 + 00420606330000440A0B35000047080A3A000043000541000348050A3A00004C + 090E3A00004B080B3C00004603024801004A00005000005300005B0000600200 + 6403006B04017103007502007803007B02007D02007F01008301018501018300 + 008300008300008300008200008001008001007F01007D02007D020080010281 + 02018301028500028500028700028501018501018001007F01007D02007B0200 + 7A01007102006205045802025600005600005C00006501007305017F06048402 + 028800018800008700018300057D02067701066A00064F00004B040735000041 + 0B0A2C0000400B083B00005201006D05067C01038800028E00018E00018A0100 + 8302008103008001008000018000017F00018000017F00018000018000018000 + 0180000182000182000182000182000184000184000182000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02045400005800006201006C02017503037E01038400028900028B00018B0001 + 8900018700018400018001027E03017A02027A02037100007605085F00006306 + 074D00004D05054000003D01013500003D070730000040070A3400004003073D + 00024300063E00014704093A0000480709390000430505400000420200450100 + 4800004D00005100005701005E04006204006A04006E03006F03007403007803 + 007C030180020181020183010184000084000084000084000082000082000082 + 0000820000840100840000860100860000870000870000870000870101850101 + 8101027D01017B01017701007701006C02015500004B00004B00005000005700 + 006401007004007E05038602028A00018800008700018300057D020678020769 + 02074F00013D00003F07062B0000350B062C00004205014D0000690304790102 + 8700018D00008D00008700008103008003008001008200008200008001008200 + 0080010082000082000082000084000086000086000087000087000089000087 + 0000820001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00004700004D00005600006003026D0204750205 + 7D00048400028900028B00018B00018900018600018400018001008000018100 + 038102047700027401046500006100025300004E00014700004200013E000040 + 01033A00003E02033B00023C00033C00013E00033B00003E02033A00003F0304 + 3C00003E02023F02004001004200004500004900004F01005302005804005E05 + 016105006504016B04017003017703027A02027C02027F030381020382020383 + 0101850101840000840000860000870000870000870000890000890000870000 + 8700008600018301028001027C01037601027202026E01036C01036104034700 + 004100004500004C00005501006001006E03007901018503048800028A000086 + 00008300037F02047A02066C03065000004200013700003505012E0100350501 + 3D00004E00006903047800018500008A00008A00008700008103008104008001 + 0082000082000082000082000082000082000082000082000084000086000086 + 0000870000870000870000860000820001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017B01017D01017F00018200018500008700028700027F + 00007901017304026B02005A00004600003E00004000014302043E02033F0000 + 4701024A00005B00036200017102067A00067D00018200008600008600008700 + 008800018802028602028200018000017F00027D00027B00027800047201046D + 02056200005B00015500015000024B00024400014200023F00023B0203370101 + 3A04043500003B03023600003901003800003B02013B00004202013E00004401 + 004100004600004400004A00004A000055010357000067020469000171030575 + 02057400007600007B00027B00008402038400008B00038B00008A00008A0000 + 8A00008900008900008700028300038101067D02067600057002086400026001 + 055600005400014A00004400013F000046030244000050000056000068020374 + 01047F00028600028900018900018400018000017B01016F0302530000450000 + 4102003700003D06033A01004701014F00006A03067A02078600068A00038800 + 0085000083010183040380010080000180000180000180000180000180000180 + 0001800001820001820001820001820001820001820001820001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018000017F00017D01017B01017D01017F000182 + 00018500008700028700027F00007901017304026B02005A00004C0103420103 + 4000013D00003700033E05083800004B04074800006004096300017102067800 + 057D000482000284000186000186000087010187010182000182000182000182 + 00018200028200027F00047B00047400036C00026500035D00025300024D0001 + 4A00014300003B00003E05043400004108073500004206063800003D01013B00 + 004004043800004507073700004505053C00004101013D000045030443000058 + 04085200006504086200006A01046F01057507096F00007F0809760000850506 + 8100008700018600008600008500008500008300008000027D00047800047000 + 0570040A5E000062060B4C00005104084500004300013D00004204043B00004C + 06074300005A03066200007403077D0004840002890002890001860000820000 + 7D02007203015600004D03003C00004508043700004808074300005300006B01 + 077A020784000788000387000285000083010182030280000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302043D04073500004807093E00005607 + 0A4C00006504086500007102067702057C01037F000180000182000181000081 + 00008200008001008200018200018400018200018000027D00027A0105740104 + 6E00046601035E00035700015200004D00004B00024100005007094000005108 + 0A3E00004905064200004301023A0000490909370000490B0B3500004307073B + 00003E02033700004B07084200005A060A4E00006002065C0000680507620000 + 730B0C6400007C0B0E6F00007E06077800007E03017D02007D01017B01017901 + 027801027300036E01036700055A000063070C49000055080C3E00004903093E + 00004001033900004909093E00005408094C00006906086F00047B0004820002 + 8700028700018600008200007D02007203015D02004700004D0805390000490C + 0A3900004D05054E000068010677010682000787000387000285000083010182 + 0302800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00003B00 + 0246060B3900004E090C42000058070A4F00005D00026702046C010371000376 + 01027901027D01017F00017F01007F0100800100800001820001840001840001 + 8200028000028000057A01057601046F00046900036300026000035D00035700 + 005E04094E000060090D4A00005A060A4500004C00024600004B05063C00004D + 0B0C370000470B0B3600003D04033800004307083900004E0A0B420000570609 + 4900005500015400005F05055200006D0D0D5A0000750D0E6A00007406067205 + 037206027205037104026F03026D03026802036502045700005A030647000055 + 0A0C3E00004A090B3700003F03043A00004507073900004F0B0C4300005F080B + 5D00007304087B00048200028700028700018600008200007D02007203015B00 + 005607044000004D0D093700004C0C0B41000053000166000576000581000687 + 0003870002850000820000820302800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302044301063A00004B080B3C0000500A0B4200005204054E + 00005A00005D00006400006B01007101017703027A04037B03037D02007F0100 + 8001008200008400018400018400018400018300017F00017C00017900047601 + 047201047001056F010570020864000072080E5A00006C080D5300005D02054F + 00005200014500005309093E00004D0C0B3900004508063900003E0405350000 + 490A0C3900004C090C3E00004E05074700004A00004500005808094A0000640B + 0E52000066090A5F02016304016305006304016003005F02015E02015B010157 + 01015100004300005007093A00004A0B0D33000040070A3700003F0304380000 + 4B0B0B3C000055090A4A00006807096D00037900048200028700028700018600 + 008200007D02007403016304014C00005309073A00004B0E0C3900004D07074D + 0000620003720003800006850003860002840001820000810201800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00004100014704093A00004B + 080B3C00004B07083F00004A00004C00005100005900006000006701026D0302 + 7103037605037902007B02007D02007F01008200018400018600018600018400 + 008500018300018200028001037E01037D02067B02067800047E050D6C00007C + 080F62000070040A5D00005F00025900005A030649000057090A4200004D0707 + 3F000042000140000146060B370000490A0C37000049080A3B00004503044200 + 004B0506400000540A0A43000055070848000052000052000054000052000052 + 00005100004E00004E00004A0000430000470403390000450909330000400A0A + 3200003A04043A00004406063900004D090A4200005B07095C00007204087900 + 048000028600028700018600008200007D02007403016201005C07054300004D + 0A073700004A0A094000005000016100026F00027D0005860104870003840001 + 8200008102018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02044600023F00004704073B00004808083900004306043F0000420000470000 + 4D00005300005D01006101016602026C02017403017803007902007B02007F00 + 0182000184000186000187000187000189000187000187000187000287000383 + 00038100067B000182040A7300007F050B6D00007203076A00026801045E0000 + 6306075200005C06064C00005402014B00004A00044000004704093900004306 + 0A3700004105063D01024302043F00004A05083D00004C05083F000048010444 + 00004800004900004900004900004900004700004700004300004100003B0000 + 4105053300004007083100003B05053600003E02023B00004606063C00004F05 + 054C00006305066C01047800048000028600028700018600008200007F010076 + 02016A05035800005505043E00004707063900004805044B00005E00016D0002 + 7B00058401048500038400018200008001008000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00004400004400024000004403053C00003E0504 + 3A01003C03013C01004000004601004B00005200005801005C00006100006D04 + 017004007403017602017901017D01018000018400018800028A00028A00028B + 00018B00018A00008A00008600018100018000057D00028100077B00037D0309 + 7701067504087102066F04076900036803056000006100025C00005900015000 + 004D00044400004400043B00003C01053900013D03043B00004100023F000044 + 0104400000450205410002440203450000470000480100470200470200460300 + 4403024403023F00003F02003A00003E02023800003C02033800003A01023C00 + 004002023F00004301024400005101025D00016C03067601047F000284000286 + 00018400008200007F01007802016B04026003024F00004B01003E0000410402 + 4100004B00005A00006900017900058201048500038400018200008001008000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017B01017D01017F00018200018500008700028700027F + 00007901017304026B02005A00004600003E0000400001430204450001420000 + 4300033C00003C03023700003802013701003902003900004202014100004B01 + 014C00005200005700006605026703006E04036B00007402027400007A00017D + 00008300008500008800008A00008A00008C00008C00008700008200047F0004 + 7F00047D00047D00047B00047900047800047800047601047401047401047201 + 047201047201046D02056400065800025000014500004302043A00013B020339 + 00003E00013F00004500054100014300053E00013F0004400001430000440000 + 4701014300004701014100004201004100004000003F00004002023C00004001 + 033C00003F00023E00013F01014000004303033F00004901014D00005F020369 + 02057401047D00028200028400018400008200007F01007802016C00005E0000 + 5400004500004201003C00004201004700005C01046A01047A02078102048300 + 0384000182000080010080000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018000017F00017D01017B01017D01017F000182 + 00018500008700028700027F00007901017304026B02005A00004C0103420103 + 4000013D00004200004702053A00004506083300003F07063300003802013601 + 003D06033600004707063E00004F05054600005100005600005F02015900006B + 07056200007408077100007C04057D00028000018400018600018900018B0001 + 8B00018700028000027B00027B00047D00027D00047D00027D00047D00027D00 + 047D00027D00047D00027D00047D00027D00047900046E000668010851000052 + 03063D00004307083700003B01023D00004502053F00004C040A3C0000470409 + 3A00003F00024200004903033F00004C06063C00004906053D00004201003F00 + 004404043A00004806073A00004704073D00004200023F00004505053B000048 + 06074000005305065800006904067401047B0002800002840001840000820000 + 7F01007901016F00006802035200005205033A00004508063D00004800005900 + 036801047501067F020481000382000182000080010080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302044301023A0000490909370000440B + 0A3200003F07063700003B03023300004509093700004B090A3C00004B050647 + 00004D00004A00005E0606500000690B0C5C000071090A6E0103750205790203 + 7C01038001038300038500038700038500037D00027901017901027B01017B00 + 027D01017D00027F000180000280000182000282000184000284000186000282 + 00027F020B6B00006A060C4A0000500A0B3700004007063700004202023F0000 + 52060A42000051070B3C00004404093E00004701024100005007093E00004D09 + 0A3C00004705063F00004301023B00004A08093C00004D090A3C00004B050641 + 00004301023B00004A0A0A3A00004F09094500005E0606620001720104790102 + 8000028200018400008200008001007B01017803046400006306074500004D0C + 0B3500004508064400005501036401037302067D020481000382000182000082 + 0000800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00003C00 + 00450707370000480C0C350000460A0A3300003C03023800004307073500004A + 0C0C3700004A0A0A3900004501024500005206074500005B0B0C4A0000610909 + 5400006300026B02056F02047201047702037A02037C01038102047F02047B01 + 017901017901017B01017B01017D01017F00017F000180000182000184000186 + 000186000186000187000186000283000580080D5D0000620C0C400000470C0A + 3300003C03023E00004C060743000056090D4200004D080B3700004001034300 + 00500507400000510B0C3C00004B090A3A00004202023F00004806073A00004F + 0B0C3C00004F090A4000004701023E00004808083900004E0C0D3E0000540809 + 4F00006502047002047901027F00028200018400008200008001007D01017600 + 007306085300005B0B0A3A0000480D0B3800004502015300026100027001057A + 02037F0002820001820000830101800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302043C0302330000460A0A3500004A0C0C3700004706083E + 00004201033900004A090B3700004A0B0D3500004307083A00004504063C0000 + 4F0A0D3E0000550A0C4500005501054E00005F01056302046801046C01036F02 + 047002047502057702037901017B02007B02007D02007D02007F01007F01007F + 01008001008200008200008400008400008400008600008400018A0508760000 + 770C0E4E0000520D0A3300004009043700004202013E000054070A450000550A + 0C3C00004307083C000047000342000051070B3E00004F0A0D3A00004706083C + 00004201033900004A0A0A3A00004F0B0C3C00004C06074300004301023B0000 + 4C0C0C3A00004F0C0B4300005B05055D00006F02047801027F00028200018200 + 008200008001007D01017B03046800006807094900004F0C0B3500004207053F + 00005000015E00016F00047A02037F0002810000820000830101800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00003500003F070633000046 + 0A0A3900004A08093D00004500034100004904073A00004A090B35000043090A + 3300003B020338000142050935000048090B3A00004B06094100004C00025300 + 035700035D00036100026401036602026A02036F01017901017F01007F01007F + 01007F01007F01007F01007F01007F0100800100800100800100800100800100 + 80010082000084000185080A640000630C0A3C0000400A032F00003A06003C00 + 004B050543000056070A4200004C08093600003E02034100004D03073E00004D + 080B3A000049080A3800003E02033A00004206073700004A0A0A3A00004C0809 + 3D00004501023E00004705063900004C0A0B3C00005107074C00006000016F02 + 047801027F00028200018200008001008001007D01017900007704075700005A + 08073C00004409073500004100004F00005D00016E00047801027F0002810000 + 8200008301018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02043603013300003F07063500004707073D0000490205460000480002410000 + 49030939000043060A3300003B04073400023500043200003C04093200004306 + 0A3900004603064500004900004C00005100005500005A00005D000160000168 + 00017B01018400008400008200008200008001008001007F01007F01007D0200 + 7D02007D02007B02007B02007B02007D02008301027A00007009065000004708 + 003000003608003405003D03003F00005004054300004E05073B00003E050439 + 00004200024100004B03093C000047050A3800004004053900003B0102360000 + 4206063500004507073A00004503044000004100003D00004808083C00004A07 + 064200005401005900006D02047601027D00028000018200008001008001007F + 00018003057100006904064B00004D07073700004005033D00004C00005C0000 + 6D00037801027F00027F00008200008301018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00003701003802013800004002023F0000450102 + 4400004700014700014600024100014300053C00013C01053800023700033900 + 043B01063700023D02063800013E01053C00004100014300004700004B000051 + 00005600005B00005F00006800007D0101860000860001840000820001820000 + 8000018001007F00017D02007D01017B02007901017803007901017802017600 + 007103035F02005206003D00003703003102003606003A020041020041000047 + 01013F00003E02023600003901004000014600044100014300053F0001420005 + 3D00003C00013C00013D01023A00004002023E00004202024000004100003F00 + 004202023E00004205033D00004600004C00005700006903047201047B00027F + 00018200018200008000017F0001800305780306630000560302450000420503 + 3A01003E01004A00005800026900037601047D00028100008400018501018200 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017B01017D01017F00018200018500008700028700027F + 00007901017304026B02005A00004600003E00004000014302043C00013B0000 + 4001033E00004201033F00004200024100014100014000004300033E00004201 + 033C00003F00023E00014100034200024300053E00014000053C00003F000240 + 00014501024900025000015400005A00006200016800047302067F0002840001 + 8400028400018200028200018000028000017F00027D01017D00027B01017B00 + 027901017B00027202025D01005202014C02004502003F02003A020039020036 + 01003B04013B04013A03003A03003803003303003203003502003F0000420000 + 4200004200004200004200004200004000004300034100014401044200004601 + 044100004400024200004000003B00003C03013600003C03013C00004601004F + 00006205046D02047601047D00028000028200018200028000017C0001720000 + 6804025400004A03003B00003B02003C01004400005300026502047302057D00 + 028500008A000089000184000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018000017F00017D01017B01017D01017F000182 + 00018500008700028700027F00007901017304026B02005A00004C0103420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004200024400024B01073F00004A + 05083900004405073A00004101014501024C02025300025A0002600001680002 + 6E00057800058000048400028400028200028200028200028000028000027F00 + 027F00027D00027D00027B00027B00027B00027002045700004C00014B000049 + 00004800004500004300004000004302014202013F02003D02003B02003A0100 + 3A01003C01004101014200014200024200014400024400014400024400014500 + 034A06074000004C08093E00004A060740000043010240000043060437000042 + 09073400004508044200005000006205046D02047601047D0004800002820002 + 8400028000027B00007706046200006009054100004306023600003C03014200 + 005101026302047103057D00048500018C00008D000184000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073F + 00004700033F00004C070A3A00004A0A0A390000460606410000480000500203 + 5B02056201036900036F00027700047B00058000048200028200028200028200 + 028000028000028000027F00027F00027D00027D00027B00027B00027B000276 + 01046600006000006000005D00005C00005A0000580000560000580000560000 + 5300005200005200004F00004F00004B00004200003F00003F00003F00003F00 + 003F00003F00003F00004204043A0000480A0A370000490B0B3700004406063F + 00004701014100004C09083A00004B0B073E00005005035100006604046F0204 + 7801027F0002820002840002820002800002800102720000740A09510000540A + 083900004007053B00004200005101026103047103057D00048500018C00008B + 0001840001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004300034100004A06073A00004D0B0C3900004A0A09 + 3A00004701014B00005502016104056A03067302067700037E00048000048200 + 028200018200028200018200028000018000028000018000027F00017F00027D + 01017D00027B01017D00027901027500037300037300047200026F00026F0001 + 6D00026B00006B00036901026600026501016400016400006400015E00015100 + 004B00004B00004A00004B00004A00004A00004A00004600004F080540000053 + 0C09400000510A074000004B01014D000056030545000055090A430000550806 + 4A00005B00006B03047401047B00028000028200028400028200028200027D00 + 008208086400006B0E0B4500004B0B0736000040050342000051010261030470 + 03057B00048300018A00008B0001840001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E00004301023A0000 + 4A0A093900004C0C0B3A00004A07044700005100005C02016905057305077B02 + 0680010386000486000284000184000084000182000082000182000082000180 + 01008000017F01007F00017F01007F00017D02007F00017F0001810204810003 + 8000058001038000057D00027B00047901027A01057902037800047601027500 + 037301017300037100036D020469030469020568040469020568040468030566 + 0404630204590000680A0B530000690B0C5300006305065A0000610002570000 + 6508094E0000630B0B5000006306056100007002047800047F00028200028400 + 028400028200018200018601037900007C0C0C5500005C0C0B3E00004609073E + 01004400005101026103047003057B0004830001880000890001840001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004202023C00004407053700004A0B073900004A0A063F00004E01005500 + 005F02016C04057604048102048400028B00028C000287000084000086000084 + 0000840000840000840000820000820000820000800100800100800100800100 + 8001008001008400018400028200028200028200028200028000027F00028102 + 047F02047F02047E01037C01037B00027B00027B00027E01037E01037E00057C + 01037C01057C01037C01057A02037700037D08096E00007F0D0D6A00007C0A0A + 6C00007302056D000274060A620000710C0E5B0000700B0D6400007103057800 + 047D00028200028600028400028400028000018200018400008707086B000070 + 0C0A4A00005009063B0000440403440000510102610304700305790004810001 + 8600008700018200018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003D02003800004208033700004708 + 043D00004B04004D00005801006302006F03027903028200018700018F000190 + 0002890000860000870000860000860000860000860000840000840000840000 + 8400008400008400008400008400008200008100007F00007F00007F00007E00 + 007E00007E00007C00007E02027C02027C02027B01017B01017B01017A00007F + 00008800008C00008C00018A00008A00018800008800018600008A0206820000 + 8C070A7F00008A070A7D00008603067F00017D02067500027A060B6C00007609 + 0B6A00007605087700037D000282000286000287000186000184000180000182 + 00018901038100007E07086000005C0606440000460504410100440000510102 + 6103046E03057800047F00018500008600018200018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003C01 + 003B03003A00004003003E00004503004800004E00005A01006302006F020079 + 01018100008600008D00018E0002890000870000870000870000870000870000 + 8600008600008600008600008600008600008600008600008600008400008000 + 017F00017F00017F00017D01017D01017D01017E02027D01017D01017D01017C + 00007C00007B00007B00008000008C00029100029000029000028E00028E0002 + 8C00028C00028900018800028500008801038300008500028300008300018000 + 027F00057900017A00067200007601047600017C000182000286000289000189 + 00018700018400018000018200018900018902047700006B04025300004C0200 + 4100004303024400005101026103046E03057800047E00018300008600018200 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017B01017D01017F00018200018500008700028700027F + 00007901017304026B02005A00004600003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003A01003901003E04003C00004204004100004A01004E + 00005A0300620100710603770100830405830000890001860000870000850000 + 8500008400008400008500008500008600008600008600008600008600008700 + 008700008700008400008000017D01017D01017D01017D01017D01017F00017F + 00017F00017F00017F00017F00017F00017F00017F0001800001860103870002 + 8400018300008100008100008100007F00008000017F00017F00017D01017D01 + 017B01017D01017F00028200028200028000027E00037A00037A00037D000280 + 00028600028900018B00018B00018700008400007F0100800100890001850000 + 7C04056700005802024700004100003E00004701014E00015C00006800017601 + 047F020483010284000182000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018000017F00017D01017B01017D01017F000182 + 00018500008700028700027F00007901017304026B02005A00004C0103420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013900003E060136000045 + 08043900004907024300004D00005400006205026400007A0B09730000840808 + 7F00008301028301028001008100008100008100008100008200018301018100 + 008100008100008100008300008300008300008100007E00007E00007E00007E + 00007D00007D00007E00007E00007F00007F0000810000810000810000810000 + 8300008100008101028001027F00017E00007B00007B00007C00007C00007C02 + 027C02027C02027A02027A02027A02027A02027E020284000486000482000480 + 00047D00047E01038001038300038700018B00018D00018B0001870000820000 + 7F01008001008600008B0406740000710A084F00004D06033C00004101004502 + 014E00015900006600017401047D020481010282000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003E0301340000450A083700004A0B073A00004B0603470000520100510000 + 6909095E00007A0E0D6A00007D08097600007801027802017800017800007800 + 017800007901027901017B00027B01017B00027B01017D00027D01017D00027D + 00027E00017F00017F00017F0001810001810001830001830001860002860002 + 8700028700028700028700028900028600028101027E02027D01017C00007C00 + 007C00007C00007C00007E02027E02027E02027C02027C02027C02027C020280 + 01028200048400048000027F00027D00027D00027F00028200018700018B0001 + 8D00008B00008600008200007F01007F0100890204800000800B0C5D00005F0C + 0B3E00004606053D00004502014B00005700006501017201047D020481010282 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004001033A00004308063500004A0D0B3700004A0B07 + 3C00004702004700005607044C0000670D0C5300006D0C095F00006A03016B00 + 026B01006A00016A00006C00016C00006D00026D010071030571030371030573 + 03037302057303037302057702037A01057C01037C01057E01037E0005810204 + 8201068201048200048200028400048400028600048600028600048400028001 + 037E02027D00027C00007C00017D01017D00027E02027E00017E00007E00017E + 00007E00017E00007E00017F00017F00017F00037C00017A0001790000790000 + 7D00008000008700018B00018B00008900008600008001007D02007F01008300 + 008808096B000071100D4900004E0B083700004106044201004B000057000064 + 00007201047A0203810102810000800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000400103370000 + 480A0A3700004A0C0C3900004707063F0000480202410000550A084500005D0B + 0A4A00005A04045200005A00005A00005B00005B00005B00005B00005D00005D + 00006201036202026201036402026401036402026401036701026B00036D0002 + 6E00046F01037201057201047501067702057800057800047900057B00047D00 + 057D00047D00057D00047C01057B00027B00047A00017D00047D000280000580 + 01037F00037F00018100038100018300038300018300038100017F00027B0002 + 7901027801027700017800017C00007F00008600008900008B00008900008601 + 008002007D02007D02008503047700007A0C0C5300005A0D0B3A0000430A083B + 02004101004A00005400006200007100037A0203800001810000800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E0000440507370000480A0A3700004709093800004202013F00 + 004706053C00004E09063E00004D06034200004800004B00004B00004C00004C + 00004C00004C00004F00004F0000510000510000520000520000520000520000 + 5400005600005800005A00005A00005B00005D00006000016000016200016601 + 036700036900036B00036D00036D00036E00036E00036E00036E00026E00026F + 00017000027300037300037601047901057A01057C01057C01057E00057E0005 + 7E00057E00057901027601027503037503037503037803047B03038102038400 + 008700008900008900008401008002007B03007B03007D000080060665000067 + 0C08430000490A063500003E07043F0200470000540000620000710003790102 + 7F00018100008000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100043C00004604093700004506 + 083600004004053B00003E02023900004407053700004407053700004303023E + 00004101004101004000003F0000400000410000440001440100450000450000 + 4700004700004900004900004900004700004200004200004300004600004700 + 004A00004B00004E000151010253000254000256000258000258000258000258 + 00005700005700005700005900005900005C00005E0001610002640103660103 + 6700036900036B00036B00036B00036D00026E00006F00006D00006E00007003 + 017304027903027F03038400008700008900008700008401008002007B03007B + 03007D01017200006E07055200004F05033700003C07043904013E0100470000 + 5400006100006F01037901027F00018000008000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 034100043F00014300033E00004201033D00003E00003C00003B02003800003B + 04013800003E05033B02003E05033E03013D02003B02003A01003A01003D0101 + 3D01014002024202024301024500034501024501024501024301024202023900 + 003800003A00003B00003E01003F020042020143020143000045000045000047 + 00004900004900004A00004900004800004800004700004700004900004A0000 + 4D00005000005200015300005500015700005700015900005900015B00005B00 + 005D00005C00005E00005F00006302006901026E020174020278010278010278 + 01027602017203016F04016F04016D00006C01035E00005401004300003E0100 + 3801003C05023E01004700005200006100007000007B01018300008400008200 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017B01017D01017F00018200018500008700028700027F + 00007901017304026B02005A00004600003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000013E00013F000043000343000049000345000046000143 + 00004000003B00003B04013501003B04003700003B03003C02004004003E0200 + 3F05003800003B03023600003A00013A00004100014200004700054300004701 + 023F00004101003E01003D01013C00003F03033B00004204043D000041030341 + 0101410101400000430102410000460203410000470102430000460203440100 + 4703044200004602034200004701024500004700004600004B00024700004B00 + 024800004B00014A00004900004600004900024500004B00024700004B00014C + 00004E00004F00005200014E00005200014C00004F0000500000510000500000 + 5200024800004900033F00003F00023E00004301024600005300005D00007302 + 007D00008C00018C000084000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018000017F00017D01017B01017D01017F000182 + 00018500008700028700027F00007901017304026B02005A00004C0103420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F00023D00004203053D00004E + 04084300005003064500004600013F00004005033300003E0A043000003F0803 + 3800003F0300410100450700370000420A053300003F07063600003E02033F00 + 024701073F00004C05083C00004705063A00003F02003E00004305053A000046 + 08083900004507073C00004103033D00004303033900004606063A0000460405 + 3C00004000003F00004204043800004507073700004305053B00004101013F00 + 004404043B00004806073A00004705063D00004101013D000040040536000043 + 07083500004206073A00003F00023D0000420305380000450608370000440507 + 3C00004200024400004B01054100004C05083C00004704093C00003F00024000 + 004903034A00006405026800008506058900008E000086000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00004001033800004A070A3E000053080A4300004F0406430000420201360000 + 420B06300000430C073300004407033F00004404003C0000480C06350000450E + 0B3200004108093A00014000053A00004A070A3A00004A0A0A3700004207053A + 00004303033C00004A0A0A3900004B0B0B3900004707073F00004101013A0000 + 4808083900004A0A0A3900004505053D00003E0202360000440808350000460A + 0A3500004206063A00003E0202360000450909350000460A0A3500004206063A + 00003C020334000043090A330000440A0B3300004206073A00003E0203360000 + 45090A350000460A0B3500004206073C00004202023B00004A070A3A00004A09 + 0B3700004206073800004004043C0000530806500000740B087000008C070485 + 0000840001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004001033C00004506083A0000510A0D42000053080A + 4000004501023E0000430806320000450E09330000480B073A00004503004300 + 004C08013A00004D0F09350000460D0B3500003E04053A000145050A3700004A + 0B0D370000460A0A3500004003013F00004C06073E0000510B0C3E00004D090A + 3C00004301024000004907083A00004E0C0D3A00004C0A0B3B00004404043C00 + 00440808350000490D0D350000460D0C3500003F060538000041080733000045 + 0D0C320000430B0A3200003B0302380000430708350000480C0D350000440A0B + 3300003C0203380000410708330000460C0D330000430A0B3300003C03023A00 + 004507073700004A0B0D370000460A0B3200003B02033800004508063E00005F + 0D085700007C0E0A780000840300820001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C0000400103370000 + 4B080B3E0000530A0C4200004E0507410000420201350000440C073300004A0D + 093A00004C07044700004D0300440000520B073E00004E0D0C3700004607093A + 00003E0203350000460A0B350000480C0C3500004308063E00004A0202440000 + 54080943000055090A4200004E04044300004A0202410000500A0A3E0000500D + 0C3C00004B08073F0000430302370000490C0A3700004B0E0C3500004409073A + 00003C0301330000430C09320000450E0B3000003E09063700003E0202370000 + 480A0A3700004A0C0C3500004307073A00003C0302330000430B0A320000450D + 0C3000004008073700003C0302330000460A0A330000460C0D3200003E080835 + 00003B05043400004B0B074500006A0F0A6200007F0A057A0000800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004001033C00004405073A00004F080B4000005007093F00004301023C00 + 00420705350000480B073A00004E09064400005001005200005907024A000058 + 0B084200004E08083E00004201033C0000420607350000460A0A370000470A08 + 3A00004701015100005B04074C00005F080B4A00005A06084A00004F00004B00 + 005103044500005408094300005107074300004A00004500004B05053E00004E + 08083E00004A07063A00004100003E0000460605370000460B09350000450A08 + 3600004003013F00004905063E00004D090A3C00004A08093B00004202023C00 + 00440606350000440B0A330000430A093400003C030138000040070535000046 + 0A0A35000043090A3300003903023702004008033A0000560C06520000710D08 + 6E00007D05007F00018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003F00023A00004704073E00004E05 + 074100004703044000003F02003800004208033900004C070444000054020154 + 00006205025F01006508055500005D07074D00004F02054500004200023A0000 + 4406063700004707073D00004B03034D00006204056300006A07095C00006706 + 085900006002035A00005C00005500005D05054E00005C06064D000057040352 + 00005603025100005906054B00005705044800004E01004900004B0000460000 + 4F05034000004E07043F00004904014600004B00004800005404054500005105 + 064300004D03034600004600004100004906053A00004807063A00004404033F + 00004101003C00004707033A00004807063A00004204043B00003F04023B0000 + 4B0603470000650A066300007608047701007F00018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000013E00 + 013F00023F00004500034300004701024000004000003E01003D02003C000043 + 03004700005000005400005C00006D06047007046C02016A05036100005F0203 + 5200014F00034500014200023E00004301024300004C00014F00005700006E03 + 067504086F00047203076C00026F010569000168000267000368030564000167 + 04066000016403055F01026302046904066A0507660103670406600000610002 + 5B00005B00005900005800005300005500005100005300005000005100005500 + 005800005500005900015300005500015000005100005000004F00004A00004C + 00014800004B01014800004700004700004801004700004B01004700004B0101 + 4600004500004401004702004800005503005E00006E05027302007902007F00 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017B01017D01017F00018200018500008700028700027F + 00007901017304026B02005A00004600003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000013E00013D00004300034100004501024100004200013E + 00003D02003B0000420300430000510402560000630506690304730200790302 + 7902037500017201056C03066200065400014B00014400004501024500005103 + 045600006205066902057800047D00047B00047B000479000479000478000476 + 01047401047201047201047002046F02046F02046D0204700204760104780004 + 7800047601047601047401047201047002046F02046D02046D02046B03046903 + 046903046903046903046C05086D04076902056700036400015F00005C00005B + 00005C00005B0000590000570000570000550000550000530000550200550200 + 5601005500005600005300005000004F00004F00005100005400005B00006500 + 007001007902007E03017F000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018000017F00017D01017B01017D01017F000182 + 00018500008700028700027F00007901017304026B02005A00004C0103420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023D00004203053B000048 + 05083C00004705063C00003F01013B00004005033A00004E07044B0000610707 + 6300007204067800008002018101027E00017B00047501066900055A00014D00 + 004D02044100005006064C00006406076400007603067F000484000284000482 + 00028200048000028000047F00027D00047B0002790004790102780004780102 + 7601047901028000048400028200048200028000048000027F00047D00027B00 + 0479010279000478010276010476010276010476010475020575020574000571 + 00037000036D00016C00026900006B0003690102670003670102660103660202 + 6401036202026104016003006203006301016400006300006100025E00015D00 + 025D00005F00006400006D00007600007F010080010080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004001033800004A070A3A00004B090A3A00004406063A00003C0301360000 + 4A0A064200005F090958000072070A7500037E00008501018700028300018200 + 047C00066E00055D00005300024400005008084300006109095C00007706097A + 0003840002870001870002870001870002860001860002840001820002800001 + 8000027F00017F00027F00017D00028000018700028B00018900028900018900 + 028700018700028600018400028200018200028000018000028000017F00027F + 00027D00027B00027C01057C01037C01057B03047B02067A0304770205750303 + 7502057303037302057303037103057004036F06036F06037005027002027201 + 047100036E00036D00036B00036900036A00016D00007600007C000084000086 + 0000820001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033C00004706083900004D0A0D3A00004A0A0A + 3700003E02023800004508063C0000570C0A5000006F0A0C6800007C03077F00 + 008701018800028600008600047E00057000055F00004E000050050740000057 + 0B0C50000070090C6E0000830205860001890001870001870001870001870001 + 8700018600018400018400018200018200018200018200018000018400018900 + 018D00018B00018B00018B00018B000189000189000187000186000186000186 + 0001860001860001840001840001820002800002810003800103820104810204 + 8203058003057C00017A00017A00017800017A00017800017800017701007706 + 037706037A04037B03037C01037C01057B000578000577010674000574010477 + 00037A00017F0000870001870000820001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0C0C3700004307073800003D04023700004D0A07450000670A + 0B5E00007A060B7900027F00008501018700028500008400047E00056E00055B + 00004F01023E00004D0A09420000630B0B5E00007E060A7E0000840001860000 + 8600008600008600008600008600008400008400008400008400008400008200 + 0082000082000084000086000087000087000087000087000087000086000086 + 0000860000840000840000840000840000840000840000840001830003830003 + 8300038100038300038000028000028000027F00017F00017F00017E00017F00 + 017E00017E00017C00007B04027B05007E03018101028300038300058200057F + 00057D01077B01077A01057B00047F0002840001870001880002820001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B3900004709093600003C03023800 + 004407053C000059090853000072070A7100008002077E000081030085000283 + 00008200047C01056D00035A0000470000460605390000520B084C00006E0809 + 7200008302058200018200008200008200008200008200008200008200008200 + 0082000082000082000082000080010082000082000082000082000082000082 + 0000820000820000800100800100800100800100820000820000820000820000 + 8200008200008402038300038300038200028100018100018000008000008300 + 038300038300038300038300038300038300038101027D02007D020082000084 + 00008700028700028600048200058200077E00067E00057D0004800002840002 + 8A00028800028200018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004507 + 073600003E05043800003B04013800004B06034800006504066600007C02087E + 00037C01007E03008101027F00007F0004790105690003560000470101380000 + 4208033B00005A07055F00007B04057E00017F00017D02007D02007D02007D02 + 007D02007F01007F01007F01007F01008001008001008001007F01008001007F + 01007B02007902007902007902007B02007B02007B02007B02007B02007B0200 + 7D02007D02007D02007D02007D02007F01008001028101028101028000018000 + 0180000181000081000083010283010285000285000285000285000285000283 + 01027E00007E01008300008600008900028900028700048400048300067F0005 + 7D00047E00038000028400028800028901038200018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004002023900003A01003A01003F020043000053 + 01005C00006E00047700037E01037A01007C03018001027F00007F0004790105 + 6700035400004300003B02003800004404005000006703037600028001037D01 + 017D02007D02007D02007D02007D02007D02007D02007F01007F01007F01007F + 01007F01007F01007F01007D0200790200780300790200790200790200790200 + 7902007902007B02007B02007B02007B02007D02007D02007D02007D02007F00 + 017F000181010281010281010281010283010284020382000182000182000182 + 00018400018200018400018200017F00007F0000840000860001870001870002 + 8600028400048200047F00037E00037E00017F00018200028700028801038200 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017B01017D01017F00018200018500008700028700027F + 00007901017304026B02005A00004600003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000003F00004301023F00004300033E00003F00023C + 00013B00003E00004802024B00005D00006900007A02067A00017A01007E0301 + 8101028100008000047A01056900035600004400003C01003F04024000005600 + 006700007D02068100018000017F00017F00017F00017F00017F00017F00017F + 00018000018000018000018000018000018000018000017F00017F00017D0101 + 7F00017F00017F00017F00017F00017F00017F00017F00017F00017F00017F00 + 017F00017F00017F000180000180000180000180000180000180000180000180 + 0001800001800001800001800001820001800001820001800001800001800001 + 8200018200018200018200018200018200028000028000028000028000018000 + 0180000182000182000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018000017F00017D01017B01017D01017F000182 + 00018500008700028700027F00007901017304026B02005A00004C0103420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004101013F00004404033B000048 + 06073A00004605073C00003F00043A0000460606410000540403540000710608 + 7300007C02027A00007E03018301028100008200047A01056B00055600004500 + 004407053800004906054F00006F06097A000183000382000280000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 + 4F090A4700006507086300007C07087800007A00007E03018301028100008200 + 047A01056B00055600004800003A0000460B093C000060080861000083050A7F + 0000820002800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B + 3900004000053900004808083E0000590908530000750A0C7000007D03037A00 + 007E03018301028100008200047A01056B00055600004400004609073500004E + 0B0A4E0000730A0D770000840104820002800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 + 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 + 0A6100007E090A7800007A00007E03018301028100008200047A01056B000556 + 0000480000390000480D0B3C0000620A0A5F000085070C7F0000820002800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 + 004707073E000057070653000074090B7100007C02027A00007E030183010281 + 00008200047A01056B00055600004400004508063500004C09084E000072090C + 7800008300038200028000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004101013C00004705063A00004805 + 083A00004402073D00023C00013E00004C06074700006103046500007B060779 + 00007A00007E03018301028100008200047A01056B00055600004700003C0000 + 4308063C00005C04046300008204098000008200028000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000004000 + 004101003F00004301023F00004201033F00023E00033A00004303034400004F + 00005800006D02047500017B01017A00007E03018301028100008200047A0105 + 6B00055600004500004104023B00004401005300006B02057C00038200028200 + 0280000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017B01017D01017F00018200018500008700028700027F + 00007901017304026B02005A00004600003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000004000003F00004301023F00004300033E00004100043E + 00033B00004000004802034B00005D00006900007803047A00007A00007E0301 + 8301028100008200047A01056B00055600004600003E01003F04024000005800 + 006700017F010681000182000280000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018000017F00017D01017B01017D01017F000182 + 00018500008700028700027F00007901017304026B02005A00004C0103420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004101013F00004404033B000048 + 06073A00004605073C00003F00043A0000460606410000540403540000710608 + 7300007C02027A00007E03018301028100008200047A01056B00055600004500 + 004407053800004906054F00006F06097A000183000382000280000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018200018000017F00017D + 01017B01017D01017F00018200018500008700028700027F0000790101730402 + 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 + 4F090A4700006507086300007C07087800007A00007E03018301028100008200 + 047A01056B00055600004800003A0000460B093C000060080861000083050A7F + 0000820002800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018200018000017F00017D01017B01017D01017F0001820001850000870002 + 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B + 3900004000053900004808083E0000590908530000750A0C7000007D03037A00 + 007E03018301028100008200047A01056B00055600004400004609073500004E + 0B0A4E0000730A0D770000840104820002800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018200018000017F00017D01017B01017D0101 + 7F00018200018500008700028700027F00007901017304026B02005A00004600 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 + 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 + 0A6100007E090A7800007A00007E03018301028100008200047A01056B000556 + 0000480000390000480D0B3C0000620A0A5F000085070C7F0000820002800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001800001 + 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 + 017304026B02005A00004C01034201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 + 004707073E000057070653000074090B7100007C02027A00007E030183010281 + 00008200047A01056B00055600004400004508063500004C09084E000072090C + 7800008300038200028000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018000017F00017D01017B01017D01017F00018200018500 + 008700028700027F00007901017304026B02005A00004500003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004101013C00004705063A00004805 + 083A00004402073D00023C00013E00004C06074700006103046500007B060779 + 00007A00007E03018301028100008200047A01056B00055600004700003C0000 + 4308063C00005C04046300008204098000008200028000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018000017F00017D01017B01 + 017D01017F00018200018500008700028700027F00007901017304026B02005A + 00004E03054302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000004000 + 004101003F00004301023F00004201033F00023E00033A00004303034400004F + 00005800006D02047500017B01017A00007E03018301028100008200047A0105 + 6B00055800004500004104023B00004401005100006B02057A00038200028000 + 0280000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 018000017F00017D01017D01017D01017F00018000018300008500028301027E + 00007B01017703026E01005D00004700003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000004000003F00004301023F00004300033E00004100043E + 00033B00004000004802034B00005D00006900007803047A00007800007C0100 + 8100008200018300057800036800025700004600003E01003F04024000005600 + 006700017D020681000180000280000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000017F00017F00017D01017F00017F + 00017F00017F00017F00017D01017D01017B01017901016D03024F0003420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004101013F00004404033B000048 + 06073A00004605073C00003F00043A0000460606410000540403540000710608 + 7300007C02027800007A01008100008400018300057A00036B00035A00004700 + 004606053A00004906054D00006D060976000183000380000280000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00017F00017F00017D01017D01017D01017D01017D01017D01017D01017F0001 + 7F00017002024900003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 + 4F090A4700006507086300007C07087800007901017A01008100008400018300 + 057A00036B00035B00014A00003C0000480B093C00005C09085F00007F060A7D + 0000800002800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000017F00017F00017F00017F00017F00017F0001 + 7F00017F00017F00018000018000017202025201044201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B + 3900004000053900004808083E0000590908530000750A0C7000007D03037901 + 017A01008100008300008200047B00046C00045C00024600004808073700004E + 0B0A4A0000700B0D720000820104800002800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000018000017F00017F0001 + 7F00017F00018000017F00018000018000018000018000018000017202024B00 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 + 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 + 0A6100007E090A7800007A02027A01008000008300008400047D00046F00065E + 00044A00003B00004A0D0B3C00005D0B0A5C00007E090C7C0000800002800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000018000017F00017F0001 + 8000018000018000018000018000018000018200018000018200018200018200 + 018200018200017402025100034201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 + 004707073E000057070653000074090B7100007C02027A02027D020080000083 + 00008400047E00057000076001054700004707063700004C09084900006D0A0C + 6F00007E01037F00028000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000017F00017F00018000018000018000018000018200018200018200 + 018200018200018200018200018200018200017402024A00003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004101013C00004705063A00004805 + 083A00004402073D00023C00013E00004C06074700006103046500007B060779 + 00007A02027D02008000008500008600048000057301086102064A00003F0000 + 4508063C00005705045C00007706097900007F00028000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000017F00017F00018000018000018200 + 0182000184000184000184000184000184000184000182000182000182000174 + 02025302054302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000004000 + 004101003F00004301023F00004201033F00023E00033A00004303034400004F + 00005800006D02047500017B01017B03037D0200800000840000860004810005 + 7301086403074A00004403023D00004201004C00006403057100037B00027F00 + 0280000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000017F00 + 017F000180000180000182000182000184000184000186000186000184000182 + 00018200018000018000017202024B00003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000004000003F00004301023F00004300033E00004100043E + 00033B00004000004802034B00005D00006900007803047A00007901017D0200 + 8200018600018700048000047400076602074D00004200004104023E00005000 + 005900006F01037901027F000280000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000017F00017F000180000182000184000184000186000186 + 00018500008600018500028402038202038102037E0202700403510003420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004101013F00004404033B000048 + 06073A00004605073C00003F00043A0000460606410000540403540000710608 + 7300007C02027901017D02008200018600018700048200047600076602074D00 + 004704033900004807064500006003046900007A03047D000280000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000017F000180000182000182 + 00018400018400018600018600018700028500028200018000017D01017C0202 + 7A02026C05034700003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 + 4F090A4700006507086300007C07087800007901017D02008200018600018700 + 048200047600076802075200013E0000470A083A000056090750000070050775 + 00017D0002800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001820001840001860001860001870001860001880103830102 + 8000017C00007800007602017203016905034E01044201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B + 3900004000053900004808083E0000590908530000750A0C7000007D03037901 + 017D02008200018700018900048400047800076802074E00004C06063900004D + 0C0B4300006109096200007904057D0002800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001820001840001840001860001860001 + 8700018600018400018000017E02027A02027403016F02006B02005F02004600 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 + 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 + 0A6100007E090A7800007901017D020084000187000189000484000478000769 + 02075400023F00004B0B0A3A0000550A084E00006F07087200007D0002800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001820001 + 8400018600018700018700018600018600017F00007E00007B03037905047205 + 036A03006300005700004A01034201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 + 004707073E000057070653000074090B7100007C02027901017D020084000187 + 00018900048400047900076902074F00004B05053900004A0A094300005F0707 + 6100007705057D00028000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018400018600018600018700018700018600018400017E00 + 007C00007A04037506046E05026502005D00005100004300003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004101013C00004705063A00004805 + 083A00004402073D00023C00013E00004C06074700006103046500007B060779 + 00007901017D02008400018700018900048400047900076B0107530001420000 + 4606053900005005035100006A04057301017D00028000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018400018600018600018700 + 018700018600018400018101027C02027403016E03006602005F010058000050 + 00004A04054302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000004000 + 004101003F00004301023F00004201033F00023E00033A00004303034600004F + 00005800006D02047700017B00027B01017F0001840001860001860002820004 + 7D00056F01075100004701023F00004202014400005401006700007702037D01 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001820001820001820001820001800001800001 + 7F00017F00017F00017F00017F00017F00017F00017F00017F00018000018200 + 018200018400018400018600018600018400018000018006067803046D010063 + 00005A00005200004E02004C03004000003F00004100014401044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000003E00003F00004301023F00004300033E00004100043E + 00033D00004000004A01034D00005F00006900007A03047C00017F0002800002 + 8400018200007B02007B01018200027800055400014200004301063B00004202 + 014D00006E03007D02007F000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001820001860002870002 + 8600018400018200017F00017D01017B01017B02007902007902007B02007B02 + 007D02007D02007F01007D00007F00008200008301018301028101028001037B + 00027604046B00026303035200004B01003F00003E04003D0200440203450102 + 4300004000003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004101013D00004205033B000048 + 06073A00004605073C00003F00043C0000470506430000560403560000730608 + 7500007E01037F00048000028400017F01007604007803008400017B00045200 + 004502073B000045050A3500005107036C000082040080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018200018600028600028400018200018000017F00017D01017B01017B02 + 007B02007B02007B02007D02007F01007F020080020082000082000081020180 + 01027E02027802017301016D01006602026307064D00005107053A0000420705 + 3600003C05023B00003E00004000004402034201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004002023800004A08093A00004B080B3900004604093C00013F00023D0000 + 51080A4900006706086500007E07087A00007F00048000028400017F01007604 + 007803008400017B00045500033C000049060D370000460B094300007507037F + 0100800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000017F00017F00017F00 + 017F00017F00017F00017F000180000180010082000082000084000084000086 + 00008B00038901038402037E01037402026902005F0201570200520503440000 + 4F09093C00004A09083A00004806074100004204043E02023C00003900003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004202023C00004508063A00004D0B0C3A00004A090B + 3700004000053B00004808084000005B0908550000750A0C7000007F02047F00 + 048000028400017F01007604007803008400017B000451000048050A3900004A + 0A0F350000560C08690000830501800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000017F00017B01 + 017B01017B01017D01017F000180000182000184000184000186000186000086 + 00008600008600008600008700018C01048901058102047702036A02035D0100 + 5001004601003F0000430904350000490C0A3A00004D0A094100004703043900 + 003500003701003A04034201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000400202370000 + 4B090A3A00004D0A0D39000045050A3A00013D01023B0000530A0C4700006709 + 0A6100007E090A7800007F00048000028400017F01007604007803008400017B + 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000017D01017802017602017802017B01017F000182000186000187 + 00018900018B00018B00018900018900018700018700018600018400067E0005 + 7702056C01035F01025301004601003D00003B0401300000420A09330000490B + 0B3A00004C05084200003C04033704013502003200003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004202023C00004606053A00004B090A3A000049080A3800003E01053900 + 004507073E0000570706520000720A0B6F00007C01037F00048000028400017F + 01007604007803008400017B000451000047040939000048080D350000540A06 + 6A00008305018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000017D01017802017602017802017B + 01018000018400018700018B00018D00018D00018B0001890001870001860001 + 8400027D00027200036B00036500045E01025400024C00014300003D00003700 + 003E0704320000440B0A3500004709093B00004002023600003500003702003A + 05024100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004101013C00004705063A00004805 + 083A00004202073B00023A00013C00004C06074500005E040461000079070777 + 00007F00048000028400017F01007604007803008400017B00045500033E0000 + 46030A3700004207054600007305017F01008000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018000018000018000017F + 00017901017802017B01017F00018400018700018B00018D00018D00028B0002 + 8900028600028000027D00027B00047002045800004F00005000024E00014E00 + 024B00014900004600004701023E00004706083600004208093400003B050537 + 00004106044304004102003D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000004000 + 004101003F00004301023F00004201033D00023C00033800003F03034200004D + 00005500006804047101017901027F00048000028400017F0100760400780300 + 8400017B00045300014300053F00034000053900004D03006E00008103008000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000017F00017D01017D0101800001840001870001890001 + 8B00018B00018900028600028200027D00027800047201046F02046204054700 + 003E00004000004300004800014A00014A00004A00004A00014A010343000144 + 03053B00003C03043300003901004200004800004C00004F02004000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000004000003F00004301023F00004300033E00003F00043C + 00033C02033C00004503044800005800006000007002027902037D0004800002 + 8400017F01007604007803008400017B00045400024000024300073B00003E03 + 0149000071030080020080000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001820001840000860000 + 8700018900018800008800008700008400008200047C00037B03076F01036B04 + 075E00005800004B00004000003900003E02033C000043000343000048000149 + 00004900024700004701024000004202023B00003C00004000005000005B0000 + 6101016303033F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004101013F00004404033B000048 + 06073A00004605073A00003B00043900013F06053C00005107054D0000660404 + 6A00007904057D00048000028400017F01007604007803008400017B00045200 + 004502073B000045050A3500005107036C000082040080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018200018900008A00008900008900008700008600008400028100037900 + 047605086600006706085100005705044700004901013F000040040538000045 + 06083700004406063C00004101014200014804053E00004B03034200004F0505 + 4800005602046200006A00006E00027002024201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004301023B00004C08093C00004B080B3900004205093800013C0304360000 + 4A0A0A4000005C09085600007107067601027D00048000028400017F01007604 + 007803008400017B00045500033C000049060D370000460B094300007507037F + 0100800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018400018B00008C00008B00008700008400 + 008000017D02047904057306086000006508094A00005206073E000048070642 + 00014900034100004E0809390000440B0A3000003B08063101003A0704350000 + 4A07064300005B04075300006C060B6E00047500007900007D00027E02023E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004202023F00004807063C00004F0B0C3A00004A090B + 3500003C0105380000420908390000540D0A4A0000670A096300007806067D00 + 048000028400017F01007604007803008400017B000451000048050A3900004A + 0A0F350000560C08690000830501800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018400018B00 + 008D00008900008400007F00017802016F01016803015F02015F090947000051 + 09093C00004608083600004505054800005504074200004D0B0C3300003D0D09 + 2900003205013101004109043E00005D0A0857000077090B7300008404098000 + 018301028402038402034201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E00004301023A0000 + 4D090A3C00004D0A0D39000043060A3800013D04053400004A0C0C3E00005C0A + 095300007009077301017D00048000028400017F01007604007803008400017B + 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018200018600008702008402027E05037504026B02005E000055 + 0000530302440000500A0A3A0000490B0B3500004206073F00004E0002490000 + 53080A3C0000480D0B3000003A0A063101003A0300390000580B085200007A0D + 0F6F00008A070A8500008601038602028602028602023E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004202023F00004706053C00004D090A3A000049080A3600003B02053800 + 00400807370000500B084900006408076400007606067D00048000028400017F + 01007604007803008400017B000451000047040939000048080D350000540A06 + 6A00008305018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018001008200008003007B040274 + 06026A03005D0100500000460000430000460703370000480C0C35000047080A + 3800004200024700005003064000004D0A09390000450B063600004004004300 + 00540802520000720E0C6B0000870B0B80000088000286020283010183010183 + 01014100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004200013D00004905063C00004805 + 083A00004003073800023C03043700004507073F00005705045600006D060472 + 02027D00048000028400017F01007604007803008400017B00045500033E0000 + 46030A3700004207054600007305017F01008000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018000018000018000017F + 01007C03017803006E02006602005C01005101004700004000003D0300360000 + 4007053400004607093B00004603084000004200013D00004706053C00004C07 + 044300005003014F00005E04035F00007009076A0000800A097800008305047E + 00007F01007F01007F01007F01004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000004000 + 004101004100004501023F00004001033B00023C00033D01023F03033C000044 + 04004800005902006A00007A03047D00048000028400017F0100760400780300 + 8400017B00045300014300053F00034000053900004D03006E00008103008000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000017F00017F00017F00017F00017F00017F00017F00017F00018000018200 + 018200018200018000018000017F00017F00017F00017F00017F000180000180 + 00018200018200018400017F00017405036A03006100005700004E0000480000 + 4303003F05003A03003904013700003C03023C00004302044200044702054100 + 004202004300004B01004E00005700005900006000006F05047505057400007A + 02027700007E03017B00007E03017D02007C01007E00007C01004000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003C00003D00004501024100004001033A00003F000441 + 00034800024400003D04033600004003004D0000710101800002800004800002 + 8400017F01007604007803008400017B00045400024000024300073B00003E03 + 0149000071030080020080000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001820001820001 + 8200018200018000018000017F00017D01017D01017D01017D01017D01017D01 + 017D01017D01017F00018602028701018400008100007E00007C01007A000079 + 01017C02027B00008001037C00008500038500008C0105810106600000520000 + 5200004A00004902004100003F02003C01003B03023901003C02033700003E02 + 033B00004100044200004700004E00005300005900006302006A030171030378 + 04037901017D01017F00017F00017F00017F00017F00017F00017F00017F0001 + 8000017F00013F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013900004005033D00004A + 06073700004206073A00004400044B00004D02043500003C0A04300000510703 + 7000008800048200048000028400017F01007604007803008400017B00045200 + 004502073B000045050A3500005107036C000082040080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018200018400018200018200018000018000017F00017D01017D01 + 017D01017D01017D01017D01017D01017D01017F000183010185010184000082 + 00008001008001007F00017D01017B000081050578000085080A770000840507 + 7A00007100045400004D03034100004C06063A00004606053A00003D01013800 + 003D03043700004607093800004605073B00004700005000005700005E000064 + 01006B02007203017A02027F0303800001820001820001820001800001800001 + 7F00017F00018000018000018000018000014201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003C03023600004C08093C000048090B3500004404094100014E0003440000 + 430A092E0000410D074300007904058500018200048000028400017F01007604 + 007803008400017B00045500033C000049060D370000460B094300007507037F + 0100800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018200018200018200018000 + 018000018000017F00017F00017F00017F00017F00017F00017F00017F00017F + 00017E03018002018102018501018700028800028A00028B00038700037A0000 + 850A0C6B0000770C0E5D00006404045100004C00013F00004C08093A00004A0A + 0A3700004406063C00003C00003700004909093A00004F0B0C3E00004C030548 + 00005801006002006502006902006F02007602017C0202800102800001820001 + 8200018200018000018000017F00017F00018000018000018000018000013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B + 3700004500054A0000500507330000410F09300000560C086D00008901058200 + 048000028400017F01007604007803008400017B000451000048050A3900004A + 0A0F350000560C08690000830501800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018200 + 0182000182000182000180000180000180000182000182000182000182000182 + 00018200018200018200018000017D02007D02008102018802028B00038D0003 + 8F00038D000385000187080A6A0000740F0D5000005A0B084000004202003F00 + 004707073900004C0C0C370000480A0A3700004202023D00004706053E000055 + 0B0B430000570A084900005702006104016804006C0300700301740301790101 + 7E02028101028200018200018200018200018000017F00017D01017D01018000 + 018000018000018000014201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 + 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E + 084300007A05068400008200048000028400017F01007604007803008400017B + 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000182000182000182000184 + 0001840001840001860001860001860001860001860001840001820001800001 + 8500028801038B00048B00048800038400028204096E0000700A0B4E0000550B + 093700003E0A043300003B0203350000460A0B350000480C0C3700004707063F + 00004903034300005508064900005E08084E00006309085F02006A0602700502 + 7304027703027A02027E02028000018200018200018400018200018200018000 + 017F00017D01017D01018000018000018000018000013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 + 004F04063300003F0D07300000540A066E00008901058200048000028400017F + 01007604007803008400017B000451000047040939000048080D350000540A06 + 6A00008305018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001820001840001840001860001860001870001870001870001870001870001 + 8700018700018500008600018700028601038300038000027900007300006E01 + 036A08084C00005107053900003E0A042D00003708043300003F060932000044 + 0A0B3500004909093B00004701014B00005506034C00006108045300006B0A07 + 6200006F08057104027504027903027A02027E02028101028200018400018400 + 018400018200018000018000017F00017D01017D01017F000180000180000180 + 00014100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003B02013800004905063C00004506 + 083600004202074200024E00034600004007062E00003D090346000077020385 + 00018200048000028400017F01007604007803008400017B00045500033E0000 + 46030A3700004207054600007305017F01008000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00017F00017F0001800001800001820001840001860001870001870001890001 + 8900018900018700018700018700018900018A00018B00028700038001037800 + 046E00026300005900005503024700004906033900004005033300003E07043A + 02013802023300003F06093300004507073B00004B0303490000520000520000 + 6205025E00007009066900007709057403007802017B01017D01017F00018000 + 018200018500028700028600018400018200018000018000017F00017D01017D + 01017F00018000018000018000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 + 003D02004100004501023C00003E02033D00024300034C00014B000239000037 + 05003400004D03007200008700038200048000028400017F0100760400780300 + 8400017B00045300014300053F00034000053900004D03006E00008103008000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000017F00017F0001800001800001840001840001 + 8600018700018700018700018700018700018600018600018600018600018600 + 018600028001037702056A02035F02015100004800004000003C02003700003C + 03013900004003014000004002023A00013A01043800014001033F0000490101 + 4B00005100005400005E00006600007207037504017B09037903007B03007E00 + 007F00007F000082000184000186000187000287000286000184000182000180 + 00018000017F00017D01017D01017F00018000018000018000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003A01003B00004501024100004001033A00003F000443 + 00034D00024800003D0403320000390500490000750001860002820004800002 + 8400017F01007604007803008400017B00045400024000024300073B00003E03 + 0149000071030080020080000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000018000017F00017F0001 + 8000018000018400018400018600018600018801038700028600018300008100 + 007F00007F00007F00017E03057601047204066300005C02024D00004801003E + 00003C01003700003D04033B00004404044300004802034600014102043E0203 + 4100024300004600004A00004E00005600006604046B04027203017603007902 + 007D02007F020080020082000084000184000186000186000186000186000186 + 00018400018400018200018000018000017F00017D01017D01017F0001800001 + 8000018000013F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013900004005033D00004A + 06073700004206073A00004400044B00004D02043500003C0A04300000510703 + 7000008800048200048000028400017F01007604007803008400017B00045200 + 004502073B000045050A3500005107036C000082040080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000017F00017F00018000018200018400018400018600018600018400 + 018400018200017F00017D01017A02027903027303036400006205045500005C + 06064900004F05034100004201003C00004205033900004808083B00004C0607 + 4400004900024300004300004700004B00004F00005500005C00006200006D03 + 027203017803007B02007F020080020082020084010086000086000186000186 + 00018700018600018600018400018400018200018200018000017F00017F0001 + 7D01017F00018000018000018000018000014201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003C03023600004C08093C000048090B3500004404094100014E0003440000 + 430A092E0000410D074300007904058500018200048000028400017F01007604 + 007803008400017B00045500033C000049060D370000460B094300007507037F + 0100800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018200018200018400 + 018400018400018400018000007D00007D01017A020275040272050370050265 + 06034B01003C00004B08073E00005109094200005003064900004C0002450000 + 52060A4000004F080B3C00004603064000004800004C00005000005500005D00 + 016402026903047004037402027802017D02007F010082010084010084010086 + 0100860000870001870001870001860001860001860001840001840001820001 + 8200018000017F00017F00017F00017F00018000018000018000018000013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B + 3700004500054A0000500507330000410F09300000560C086D00008901058200 + 048000028400017F01007604007803008400017B000451000048050A3900004A + 0A0F350000560C08690000830501800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018200018200018200018400018400018200018000017E000078000076020171 + 04026E05026805016305005605003A00003A0802320000490C0A3C0000510909 + 4600005300034F000057030747000055080C4000004C070A3900004700035000 + 005700005C00006000006802037004037505057A06057901017D010180010082 + 0000840100840100860100860000870001870001870001860001860001840001 + 8400018200018200018200018000018000017F00017F00017F00017F00018000 + 018000018000018000014201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 + 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E + 084300007A05068400008200048000028400017F01007604007803008400017B + 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018200018400018400018400018400018200018000017F + 00017B03037605037005026905016004005C04005403004903003C05002C0000 + 400D0B3300004C0C0C3E00005104084A000052000548000056060D4300005208 + 0E3E000048050A4800005C00006500006A00006D01007202027903027D030380 + 0404800001820000840000840000860000860000860000860000860001860001 + 8600018400018400018400018400018200018200018000018000018000018000 + 018000018000018000018000018000018000018000013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 + 004F04063300003F0D07300000540A066E00008901058200048000028400017F + 01007604007803008400017B000451000047040939000048080D350000540A06 + 6A00008305018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000182000184000184000184000184 + 00018400018200018000017B01017A06057205036905015F03005602004F0100 + 4901004302003B03003F0A07330000460D0C3700004909093B00004400024500 + 014E040842000052050C42000053060D46000057020668030171030075010078 + 03007B0101800102810102850002860000860000860000860000860000860000 + 8600008600008600018400018400018400018400018200018200018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00014100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003B02013800004905063C00004506 + 083600004202074200024E00034600004007062E00003D090346000077020385 + 00018200048000028400017F01007604007803008400017B00045500033E0000 + 46030A3700004207054600007305017F01008000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000182 + 00018400018600018600018600018400018200017F00017901017706046D0401 + 6002005600004D00004601004103004203004802024300004A06073A00004307 + 073400003905053400003A03063700004604093E000052030C4D00015D040E62 + 00067202027903007D02007F0200800100840000860000870000890000890000 + 8900018700018600018600018400018400018400018400018400018200018200 + 018000018000017F00017F00017F00017F00017F000180000180000180000180 + 00018000018000018000018000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 + 003D02004100004501023C00003E02033D00024300034C00014B000239000037 + 05003400004D03007200008700038200048000028400017F0100760400780300 + 8400017B00045300014300053F00034000053900004D03006E00008103008000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018001 + 0080010080010080010082000182000182000182000182000182000182000180 + 00018000018000018000018000018400018400018200018000017D0101790101 + 7403016F03026905035F04005501004C00004600004100004103004305004400 + 004800014100004202023800003B03023600003802013B010242010345000050 + 00025600006300086700077202097800007E0100800100820100840000860000 + 8701018800018700008700008700018600018600018400018200018200018200 + 018200018200018200018000018000017F00017F00017F00017F00017F00017F + 00018000018000018000018000018000018000018000018000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003A01003B00004501024100004001033A00003F000443 + 00034D00024800003D0403320000390500490000750001860002820004800002 + 8400017F01007604007803008400017B00045400024000024300073B00003E03 + 0149000071030080020080000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018001007F020080020080020082010084000084000086000086 + 00008701018701018500028200018000017F00007E00017E0001830102810102 + 8205077702037307066400005A01004F00004A00004600004702004100004302 + 013F00004201004000003C02033900013C03043900003F03033F00004701014A + 00004F00005800006301016C01037503037902037D00027E00007F0001800100 + 8000018001008200018200018200018200018200018200018200018200018200 + 0182000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000013F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013900004005033D00004A + 06073700004206073A00004400044B00004D02043500003C0A04300000510703 + 7000008800048200048000028400017F01007604007803008400017B00045200 + 004502073B000045050A3500005107036C000082040080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018001007F02007F030080020082 + 0100840100860100860000870000880001870101850002840001820001800001 + 7F00027F00027E0000800606720000770B0A5C00005D09044A00004602003F00 + 004006013600004308063700004606063D00004100023701013B060933000042 + 08093A00004D05054A00005600005E0000660000700000790101800201830101 + 8601008500008200018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000014201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003C03023600004C08093C000048090B3500004404094100014E0003440000 + 430A092E0000410D074300007904058500018200048000028400017F01007604 + 007803008400017B00045500033C000049060D370000460B094300007507037F + 0100800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018000018000018000017F + 01007D02007B03007D02007F0200800100820000840000860000860001860001 + 8400018500028300038100038100037E01037B03046E000076090B5B0000670B + 0A4A00005006043F0000400301340000430A0935000048090B3900004704073F + 00003F030437000048090B3A000052090B4500005805045900006501016B0100 + 7402027A02028103028301018401008300008200018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B + 3700004500054A0000500507330000410F09300000560C086D00008901058200 + 048000028400017F01007604007803008400017B000451000048050A3900004A + 0A0F350000560C08690000830501800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000017F00017B02007903007B03007D02007F0100800100 + 8200008200008400018400018200018200018100038001038001037A02036E00 + 006F0708590000670B0A4A0000550A083F00004404033A000041080633000048 + 0C0C3700004A090B3C00004500033F00004B0407420000570A0D470000610A0D + 5700006604046B03047103037804037B03038103028102018401008400008200 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000014201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 + 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E + 084300007A05068400008200048000028400017F01007604007803008400017B + 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000017F00017B0200790200 + 7B02007D02007D02007F01007F00018000017F00017F00017F00027F00027D00 + 047B00047B000474010468020356000060080849000055090A3E00004808073B + 00003C0302320000440A0B3500004A0B0D3900004A05084500004D00004A0000 + 5D060A4E00006A0C10590000700B0D6B03047204067604047A04037D03037F04 + 0281020182000082000080000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 + 004F04063300003F0D07300000540A066E00008901058200048000028400017F + 01007604007803008400017B000451000047040939000048080D350000540A06 + 6A00008305018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000017F00017D02007D02007D02007D02007D02007D01017D01017D01017A00 + 017A00017800017700017200027000026F000168000258000056060745000050 + 08083C00004808073700003E050438000040070635000048090B3900004C070A + 3F00004E00035400006400055800006F090E5E0000750C0F6D000278070A7604 + 047902037A02027C02027E030180020181020181020180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00014100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003B02013800004905063C00004506 + 083600004202074200024E00034600004007062E00003D090346000077020385 + 00018200048000028400017F01007604007803008400017B00045500033E0000 + 46030A3700004207054600007305017F01008000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018200018200018200018000017F00 + 017D00027B00027901027601047100036E00026A000165000163000060000059 + 00004C00014200004905063900004507073700003F06053A01003B0102380000 + 4405073A00004A05084100004D01055000006701066A00007405096B00007908 + 0C7000007C070A7901057901027901027B01017D01017F00017F000180020181 + 0201800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 + 003D02004100004501023C00003E02033D00024300034C00014B000239000037 + 05003400004D03007200008700038200048000028400017F0100760400780300 + 8400017B00045300014300053F00034000053900004D03006E00008103008000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018200018600 + 018700018600018400018000027D00027901027402026F02046802036402025F + 01025800005400005100004A00004100004002023B00003F03033B00003E0504 + 3A01003E02023E00014100024100004700034700004C00024B00005700007203 + 077D03097900057D04087800037D02067A00037B00027D00027C00017C00007C + 00007E00007F0001800201810302800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000018000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003A01003B00004501024100004001033A00003F000443 + 00034D00024800003D0403320000390500490000750001860002820004800002 + 8400017F01007604007803008400017B00045400024000024300073B00003E03 + 0149000071030080020080000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018400018B00028C00018A00018500018200047C010575020571 + 04066500025B00005802024D00004C02024200004300003D00003B0201380000 + 3D04033900004004043B00004103034101014703044701024800004A00004E00 + 0052000058010563020678000580000480000480000480000480000280000280 + 00027F00027F00017F00017F00017F00017F00017F00017F0001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000013F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013900004005033D00004A + 06073700004206073A00004400044B00004D02043500003C0A04300000510703 + 7000008800048200048000028400017F01007604007803008400017B00045200 + 004502073B000045050A3500005107036C000082040080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018400018900008C00018A000386 + 00068000057800046E00026500025900005704034600004D07073A0000420705 + 3500003904013600003D05043400004108073800004707074000004901014900 + 004E00005200005500015A00025E01026001056A01047D000484000284000484 + 00028400028200028200028200028200018000018000017F00017F00017F0001 + 7F00017F00018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000014201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003C03023600004C08093C000048090B3500004404094100014E0003440000 + 430A092E0000410D074300007904058500018200048000028400017F01007604 + 007803008400017B00045500033C000049060D370000460B094300007507037F + 0100800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000182 + 00018500008700048600068100077A00066E00036300005A0000530001440000 + 4C0809370000440C0B2E00003B0A083302003A0403340000450A083700004B0A + 094000005004054E00004F00005600005D00006502046A03066C04056B020571 + 0003800002860001860002860001860001840001840001820001820001800001 + 8000018000018000018000017F00017F00018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B + 3700004500054A0000500507330000410F09300000560C086D00008901058200 + 048000028400017F01007604007803008400017B000451000048050A3900004A + 0A0F350000560C08690000830501800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000028000047E00057900057400056C0002630000 + 5A00005100004A00004C0606390000470E0D300000410E0C2E00003906043700 + 004308063900004F0C0B4200005909084D00005C00005C00006300006B000270 + 0403740404740404740202780001820001860001860001840001860001840001 + 8400018400018200018200018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000014201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 + 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E + 084300007A05068400008200048000028400017F01007604007803008400017B + 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000017D00027603066F0105 + 6800026300005A00005500004F00004A00004B02043C00004C0B0D350000470D + 0E3300004007083800004104023B0000500B084200005C0C0B4E000063060560 + 00006E01037101017601027802017901017B01017D01017F0001820000840000 + 8400008200008400008200008200018200018200018200018200018200018200 + 0182000182000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 + 004F04063300003F0D07300000540A066E00008901058200048000028400017F + 01007604007803008400017B000451000047040939000048080D350000540A06 + 6A00008305018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000017901026903045F02035700005000004E00004800004900004701014100 + 004808083900004B0A0C39000049080A3A00004301024100004B06034200005A + 0B084E0000670A096100006F03027904057B03037D01017E00007E0000810000 + 8200008301018200008001008001008001008200008200008200018200018200 + 0182000182000182000182000182000182000182000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00014100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003B02013800004905063C00004506 + 083600004202074200024E00034600004007062E00003D090346000077020385 + 00018200048000028400017F01007604007803008400017B00045500033E0000 + 46030A3700004207054600007305017F01008000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000017601025A00004C00014900004600004300 + 004200004200014202024201033C00004704073D00004D050B4300004F020949 + 00014700004500005506034F00006609086100007408077602017C02027F0100 + 8100008500008500008701008801008603008002007F02007F01007F01008001 + 0080010080010080010080000180000182000182000182000182000182000282 + 0002800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 + 003D02004100004501023C00003E02033D00024300034C00014B000239000037 + 05003400004D0300720000870003840004820002840001800100760300780300 + 8600027B00045300004300033F00024001033900004D03006E00008102018000 + 0180010080000182000182000182000182000182000182000182000182000182 + 0001820001820001800001800001820001820000820000820000820000820001 + 8000018000017F00017D01017B01017901017802017602017601026B03044F00 + 004600004200004100004101013D01013D01013A01003900003C00013D000046 + 01044600004F0206500003550105510000580000590000640300670000730505 + 7703027F05057C00008000008300008601008801008902008902008603008002 + 007F01007F01007F01007F01007F010080010080010080000180000182000182 + 0001820001820001820002820002800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000018000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003A01003B00004501024100004001033A00003F000443 + 00034D00024800003D0403320000390500490000750001870002860002860002 + 8700028200017802017901028600027D00045400004000004303023B00003E04 + 0049000071000480000282000182010082000084000086000086000087000087 + 0000870001870001860001860001840002840002820002820001880202890200 + 8902008801008601008300008000007C00007F05057703027305056700006403 + 005900005800005100005000004800004A000442000042030539000138040434 + 02023302003603013B02014101014500004900004D00005500006D0204760201 + 7601027802017901017B01017D01017F00018000018000018200018200008200 + 0082000082000082000080010080000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000013F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013900004005033D00004A + 06073700004206073A00004400044B00004D02043500003C0A04300000510703 + 7000008900048700028700028700028400027901027901028700047D00045200 + 004505003B00004508043700005306046C000182010680000180020082010084 + 0100860000860000870000870000870001870001870001860001860002840002 + 8200028200018803008802008700008500008500008100007F01007C02027602 + 017408076100006609064F00005506034500004900004800004D000740000049 + 060B3600003E08083200003504023704023802013B0000410000480000500000 + 5500016300007801028000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000014201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003C03023600004C08093C000048090B3500004404094100014E0003440000 + 430A092E0000410D074300007904058600018600028600028700028200027901 + 027901028700047D00045700003E00004A0A06370000480B0745000075030A7F + 00037F00017F0200800200800200820000840000860000860000860001860001 + 8600028400028200028000028000028000018301018201008100007E00007E00 + 007D01017B03037904056F0302610000670A094E00005A0A094200004B060341 + 00004301023B000047080A350000440A0B3200003E0605370000400202410000 + 4500004C00005400005C00006401036F02047B00028000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B + 3700004500054A0000500507330000410F09300000560C086D00008901058400 + 028400028600028200027801027901028600047D00045300004A08033A00004C + 0D093900005A0A096B00008301087D01017D02007D02007F0200800100820000 + 8200008400008400018400018400028200028000027F00027F00027D00027D01 + 017B01017B01017901017802017601027101016E01036000006306054E00005C + 0C0B420000500B083B0000410402390000400708320000440B0C330000450909 + 3900004501024900004D00005300005A00006300006A00027001057803067D00 + 0280000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000014201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 + 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E + 084300007A05068400008200028000028400028000027801027901028600047D + 00045801003D00004C0C083900004B0C0847000078040B7E00037D01017B0200 + 7B02007D02007F01008001008200018200018200018200018200028000028000 + 027F00027F00047B00047700017402027604047404047004036B00026300005C + 00005C00004D00005909084200004F0C0B3900004308063700003906042D0000 + 3F0C0A320000490B0B3A00005005074D00005300005C00006400006C00027400 + 057900057C01057D000480000280000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 + 004F04063300003F0D07300000540A066E00008901058000027F00028200027F + 00027601027901028600047D00045300004B07023C00004B0B07390000580807 + 6C00008301087D01017B02007B02007D02007F01008001008200018200018200 + 018200018200028000027F00027F00027D00047900046F01036B03046C030669 + 04066502045D00005600004F00004E00005004054000004B0A09370000450A08 + 3400003A04033302003A09073000004509093C00005408094E00005F01056100 + 006A00007400037A00067F010782010682000480000080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00014100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003B02013800004905063C00004506 + 083600004202074200024E00034600004007062E00003D090346000077020383 + 00017F00027D00028000027D00027601027801028700047F0004590000420000 + 4906033A00004607034A00007501087F00047D01017D02007F01008001008000 + 018200018200018400018400028200028200048000047F00047F00047D000476 + 01046801046002035E00045A00025700015200004E0000490000490002400000 + 4707073800004108073400003D05043600003A05023600004407053C00005406 + 075200006605096B00037100027700027F000481000584000685000383000180 + 0000800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 + 003D02004100004501023C00003E02033D00024300034C00014B000239000037 + 05003400004D03007200008500037F00027D00027F00027D0002740202780102 + 8700047F00045700004703004200004203003B00004F02006E00038100067F00 + 017F010080010082000082000184000184000184000184000284000282000480 + 00047F00047D00047D00047400056302065801045200014C00004A0000480000 + 4701024703044101014103033B00003E05043900003D04033800003B02013F02 + 004302014500005000015600006702046D00037803067F010681000583000584 + 0002830001830001810001800002800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000018000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003A01003B00004501024100004001033A00003F000443 + 00034D00024800003D04033200003905004900007500018400027D00027B0002 + 7F00027D00027601027901028700047F00045A00004501004404003F00004006 + 014C01006E00067E00047F000181000083000083000083000085000085000185 + 00018400048300038400067F00038103097B00057D03097203075700004B0000 + 4C00034700004900034100004100023E00013E02023A01003E05043900003F03 + 033B00004002024100004A00005000005600005D00006800027000027800037F + 00048200048400028400028200028200027F00017D01017D01017F0001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000013F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013900004005033D00004A + 06073700004206073A00004400044B00004D02043500003C0A04300000510703 + 7000008601047D00027B00027F00027D00027601027901028700047F00045700 + 004A06013C0000450804350000510A076700017E000683000385000285000285 + 000285000285000285000383000383000586050A79000082070B7100007A0409 + 6E00006A00065000004D01054100004A05083A00004405073800003B01023A01 + 003F06053700004507073A00004905064200004C00015A00006100006500016C + 00017200027900047F00048300038400028400028400028200017F00017B0101 + 7901017901017F00018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000014201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003C03023600004C08093C000048090B3500004404094100014E0003440000 + 430A092E0000410D074300007904058300017F00027D00028000027F00027801 + 027B00028900048000045A0000400000490A06350000450E094000006C060B77 + 000381000383010283000383000383000381000381000580000581060A770002 + 800A0F67000076080C5F00006900035900005000023F00004C070A3900004809 + 0B3500004007063800003E05043700004808073C000052080845000056060758 + 00006A01047100037300037800047B0004800103830003850003840002840001 + 8200018001007D02007902007803007803007D01018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B + 3700004500054A0000500507330000410F09300000560C086D00008702057F00 + 027D00028200027F00027901027B00028900048000045500004A080337000046 + 0E092E00004F0F0B5B00007701067B00027F00017F00027F00027D00027B0002 + 790004780004740104780A0C620000710C0E5500006406075200005000004700 + 004A05083A00004A0B0D350000440B0A3200003C03023B00004808073E000055 + 0A084900006008085600006703037502057C01057C01057E0103800103800002 + 8200028200018200018200018001007F01007D02007902007803007902007F00 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000014201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 + 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E + 084300007A05068400008000027F00028400028000027B00027D00028B000480 + 00045B01003D0000480B0732000040100A37000064060A6B0000760104790102 + 7901027801027601027402027002046D02046902055C0000670A0B4C00005D0A + 0C4500005004054300004701023A00004A090B370000480C0C3300004108073A + 00004404033F0000550A084A0000670A0B5900006F07086E00007B00027F0002 + 7F00027F00027F00017F00007F00007F00008000018001007F01007F01007F02 + 007D02007D02007D02007F000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 + 004F04063300003F0D07300000540A066E000089010582000280000284000282 + 00027B00027F00028D00048200045A00004B0904350000410D072B0000450B06 + 5300006A00027103057303037303037303037103036E04036A04056505055900 + 005A0404470000540A083C00004A0A093900004104023F000047040739000048 + 0A0A350000430A083400004003003F00005007034A0000670B0A5B0000760A09 + 6E00007B03047E00017F00017F00017E00017E00007E00007D00007D00007F01 + 007F01007F01007F010080020080020082010082010080010080000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00014100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003B02013800004905063C00004506 + 083600004202074200024E00034600004007062E00003D090346000077020385 + 00018200028200028600028400027D00027F00028D00048200045F0302430100 + 4309042E0000340A033300005700036000006B00026B01006B01006902006701 + 026402025F03025B0402510000460000490603380000410A0731000039090535 + 02004101013D00004606063700004307073600004005033F00004601004A0000 + 5D08065C0000770B0A7200008005077E00007E00017E00017E00007C00007A00 + 007A00007B02007B02007B02007D02007F020080020084010086010087010086 + 0100820000800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 + 003D02004100004501023C00003E02033D00024300034C00014B000239000037 + 05003400004D03007200008700038200028200018400028400027F0002800002 + 8900047F00046003024D06024001003B04002E00003902004900005900005A00 + 005A00005A00005900005500005100004E00004A00004700004502013D00003D + 04023601003805023303003704013E01004101003E00004202013F0000450200 + 4400004A00004E00005801006001007107067503037E06078001028101027F00 + 007E00007C01007F01008600018301027A02027703027901017B010180000182 + 0000860001870000870000860000820001800001820001820001820001820001 + 8400018400018400018400018200018200018200018200018000018000018200 + 0182000182000182000182000182000182000182000182000182000182000182 + 0001820001820001820001820001820001800001820001800001820001800001 + 8200018000018200018000018200018000018200018000018200017F00027901 + 027900048000048400028600028600028200018000017F00017F00017F000180 + 00018000018000017F00017F00018000018000018000018000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003A01003B00004501024100004001033A00003F000443 + 00034D00024800003D04033200003905004900007500018400028000017F0100 + 8200018200018200018000028000047800046603055100004800003E00004005 + 033900004100004700004A00014900004B00034500004700034100004100023E + 00013F01013B00003E02023A00004002023C00003F01013D00004006003E0500 + 3F01004000004700005100005A03006405026904026F04017203017602017901 + 017B01017D01017F0100810300780000860A047C00009F00049E040970000071 + 060878050874000085030A8100018500068B050B7F0001820004820002820002 + 8400028600028600028700028900028900028900028900028700028600028600 + 0284000282000282000284000284000284000284000286000286000287000287 + 0002870002870002860002860002840002840002840002840002840002820002 + 8400028200028400028200028400028200028904077700008F0A0D7B00008300 + 017E00008400027A000374080E62000074000090030E8D000296020A84000088 + 070A7901017901017D01018000018200018000017D00027B00027F0001800001 + 8000018000013F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013900004005033D00004A + 06073700004206073A00004400044B00004D02043500003C0A04300000510703 + 7000008601037F00017D02008001008200008400018000017D00047401046601 + 035B03034500004C06063A00004305053700004001034200024701083B000047 + 040B3700004205093600003A01043900003E0405360000450707390000460405 + 3E00004300004204004104004502004900005201005E02006804007104027602 + 017901017D01017D01017F00017F00017F00017F01007F03008007007B060080 + 0000A00105830000720E0E4D0000530000640307690308740D12620001620003 + 66050966070B6103046104036303036503036703036802036A02036A02036C01 + 036A020368020367030365030363030361040361040363030365030365030365 + 0303670303670303670303670303680203670303670303650303650303650303 + 6503036503036703036703036703036703036703036703036703036703036400 + 006300006D09095D00006A06066000006B07077113145300045F020B921C2777 + 00008A00019000048400017900007802017802017D0101800001840001820001 + 7D00027B00027F00018000018000018000014201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003C03023600004C08093C000048090B3500004404094100014E0003440000 + 430A092E0000410D074300007904058300007F00017D02008001008200008400 + 018000017D00047401046904065100005305063E00004B0B0B3700004004043F + 00004700054100004E060C3C00004B080D3900004206073800003F0304370000 + 4509093700004909093A00004504033F00004802004B02005101005802006103 + 006804007104027905047B01017F00018000018200018200018200018000017F + 01007C04008211076300006600008A04048C1615FFEDE7FFFDF5FFFCF7FFFBF8 + FFEBE8FFFBF8FFF4F0FFFDF8FFFDF8FFFDF7FFFFF8FFFFF8FFFFF8FFFEF8FFFE + F8FFFEF8FFFDF8FFFDF8FFFDF8FFFDF8FFFEF8FFFEF8FFFEF8FFFFF8FFFFF8FF + FFF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8 + FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFDF8FFFCF8FFFCF8FFFCF8FFFC + F8FFFCF8FFFCF8FFFCF8FFFCF8FFFCF8FFF8F4FFF8F4FFFCF8FFFCF8FFF6F2FF + E8E5FFF9F9FFECF2FFDDE5850E178B040E8600038504097D0204760201780201 + 7F00018400018700018400017F00027D00027F00018000018000018000013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B + 3700004500054A0000500507330000410F09300000560C086D00008702047F00 + 017D02008001008200008400018000017D00047401046500025D050545000052 + 0C0C3900004709093500004303034300014E040A40000051090F3C00004B080B + 3900004001033C00004507073700004C0C0C3A00004A09083C00004A00005301 + 005A02005F03006603006D04017504027A02027F030380000184000184000186 + 00018600018400018400018001007100007D0902740D04740A037F0303610000 + FFF5EEFFFFF7FFFFF6FFFDF6FBF5EEFFFFF9FFFFF9FBFFF8F8FFF9E7F5EAF3FF + FAF2FFFAF3FFFBF5FFFAF7FFFBF7FFFAF9FFFBFAFFFAFAFFFBF9FFFAF7FFFBF7 + FFFAF5FFFBF3FFFAF3FFFBF3FFFAF5FFFBF5FFFAF5FFFBF5FFFAF7FFFBF7FFFA + F7FFFBF7FFFAF7FFFBF7FFFAF7FFFBF7FFFAF5FFFBF5FFFAF5FFFBF7FFFAFCFF + FBFEFFFAFEFFFBFEFFFAFEFFFBFEFFFAFEFFFBFEFFFAFCFDF9FFFFFBFFFFFCFF + FFFBF8F9F5F7F9F3FFFFFCFFFFFBFFFDFBFFF9FBFFF5F9600000770005810106 + 7F01067E06077602017901018200018700018900018700018000027F00028000 + 018000018000018000014201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 + 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E + 084300007A05068200007F00017D02008001008200008400018000017D000474 + 01046A05075000005507083E00004D0D0D3700004105053E0000470005400000 + 51070B3E00004F0A0D3C00004805083F00004402033A00004D090A3C0000510B + 0B3E00004E06064E00006203006C03007003017504027A02027E020282000183 + 000087000187000187000187000187000186000186000186000097100E7E0000 + 7502006B00007D00006D0909FFFDF7FFFFF8FCFFF8FBFFFBFAFFFBF1FCF4F0FF + F7E5F9EDEDFFF9F1FFFBF3FFFEF7FFFEF9FEFFF9FFFEFAFEFFFAFFFEFCFEFFFC + FEFEFCFEFFFCFEFEFAFEFFFAFFFEF9FEFFF7FFFEF7FFFFF7FFFEF9FEFFFAFFFE + FAFEFFFAFFFEF9FEFFF9FFFEF9FEFFF9FFFEF9FEFFF9FFFEF9FEFFF9FFFEFAFE + FFFAFFFEFAFEFFF9FFFEF3FFFFF2FFFEF2FFFFF2FFFEF2FFFFF2FFFEF2FFFFF2 + FFFEF3FFFFEBF9F7EFFDFCF3FFFFECFAF9F3FFFFF3FFFFDFE7E6F5F4F0FFFCFA + FFF8F95500046F01077F070B6A00006F00007802017D01018600018900018B00 + 018900018200027F00028000018000018000018000013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 + 004F04063300003F0D07300000540A066E00008702047F00017D020080010082 + 00008400018000017D00047401046500025C0404450000500A0A390000460808 + 3500004103033F00004904073E00004D080B3C00004C08093F00004701024500 + 004D050542000055090A4500005A0A094E00005F03026F03027903027A02027E + 02028101028400018600008800008B00018B0001890001870001870001860001 + 8600018700019102047C00008408087A0203850107730E10FFF6F2F8F9F0F6FA + F4FBFFFCF0F6F1F1F7F2FBFFFCFBFFFBF3FAF5F9FEFCFFFEFFFFFDFFFFFDFFFF + FDFFFFFDFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFDFFFFFDFFFFFDFF + FFFDFFFFFDFFFFFDFFFFFCFFFFFCFFFFFDFFFFFDFFFFFDFFFFFDFFFFFDFFFFFD + FFFFFDFFFFFDFFFFFDFFFFFDFFFFFCFFFFFCFFFFFDFFFDFEFFFAFFFFFBFEFFFA + FFFFFBFEFFFAFFFFFBFEFFFAFFFFFBFEFFEEF3F6F4F7FBFAFFFFFBFEFFFAFFFF + F8FBFFFAFFFFF8FFFCFFFFFBFFF7F54B00026300027D080B740000850D0E7B01 + 017F00018700018D00018D00018900018000027F000280000180000180000180 + 00014100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003B02013800004905063C00004506 + 083600004202074200024E00034600004007062E00003D090346000077020383 + 00007F00017D02008001008200008400018000017D0004740104690406530000 + 5002033F00004808083700003F03033C00003F01013A00004606063900004806 + 073D00004B02044800004C00004C00005804065100006407085A000067060869 + 01027901028000018200018400018600018700018A00028C00028B00018B0001 + 8900018700018400018200018200018600018B00008B00008405067F04067B00 + 00690005FFFAF8FFFFFBFFFFFCFCF0F03020211400011C04061B00001E000221 + 02051B01071901091B00091B00091B00091D00091D00091D00091D00091D0009 + 1D00091B00091B00091B00091B00091B00091D00091D00091D00091B00091B00 + 091901091901091901091901091901091901091B00091B00091D00091D00091D + 00091D00091B00091D00091B00091D00091B00091D00091B00091B0007220710 + 2A0D161B00091700031500033C1F28F8E9EDF4FBF6FDFDF7FFF9F74F090A6D07 + 0C7200007600017700007F00018200018900018D00018D00018700017F00027D + 00027F00018000018000018000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 + 003D02004100004501023C00003E02033D00024300034C00014B000239000037 + 05003400004D03007200008500027F00017D0200800100820000840001800001 + 7D00047401046702045800004900004802023F00003F01013900003B02013901 + 003A02013800004002023E00004502014800004E00005100005800005B000066 + 01036800007003057002047A03047E00008200008400008500008700018A0002 + 8B00038C01048900018700018600018400018000017F00017F00018200018A00 + 009106097000007E060A7F00066A030AFFFBFBFFFDFAFFF7F7FFFDFE13000020 + 01042400012700003000042900002200011E00011E00011E00011E00011E0001 + 1E00011E00011E00011E00011E00011E00011E00011E00011E00011E00012000 + 012000012000011E00011C00011C00011B00011B00011B00011B00011C00011C + 00011E0001200001200001220001230001230001250001230001250001230001 + 250001230001250001270005250001230001390C15230001250001FFFBFFFAFE + F9FEFEF8FFFBF94C030570060C6B0000890B107E00008000018600018B00018F + 00018D00018600017D00027901027F00018000018000018000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003A01003B00004501024100004001033A00003F000443 + 00034D00024800003D04033200003905004900007500018400017F00017D0200 + 8001008200008400018000017D00047401046803055500004D00004300004404 + 043B00003C00003A01003704013303003904013700004202014200004C000052 + 00006103046703036E01037401047900047E0103800103830003840001860001 + 8600018600018600018700018700018600018600018400018000017F00017D01 + 017B01017B01017D01018100007D01016F03026A02037501085D0308FFFDFBFB + FFFCFFFFFEFFFEFF1E0B0E1C01052F060D2900023D09102E00022E050A1E0000 + 39161A2200032A070B1F00002D0A0E2200033C191D1E00002D0A0E2704082C09 + 0D1E000027040823000231090E2A0207310C101E00002D0C101E00013112151B + 00002B0C0F1B00002B0A0E1F00022F0C102400032D050A25000132060C250000 + 43151B25000035070D2500003F111725000032040A2C000634060C2700013608 + 0E27000135070DFFFBFCFFFEFBFFFFFBFFFAF957060971000680000483000385 + 00038400018700018D00018D00018B00018400017801027601027D0101800001 + 8000018000013F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013900004005033D00004A + 06073700004206073A00004400044B00004D02043500003C0A04300000510703 + 7000008601037F00017D02008001008200008400018000017D00047401046601 + 035B03034500004C06063A00004305053700003C030236030038080432000040 + 05033C00005005034F00005E02016802036F01037700037D0002820002870003 + 8A00038A00038600018600018600018400018400018400018400018400018200 + 018000017D01017B01017901017802017802017901017F00007B01016D030268 + 0203710108590408FFFEFBF8FFFCF6FBF9FCFAFA100305130000200004230000 + 2F01072700002300002501012000001F00002604042200002402021E00001E00 + 002A08083715151E00001E00002301012000002200002300002300002200002F + 0B0B1E00001C00001B00002C0E0D1C00002608071C00001E0000200000220000 + 2300002B0304280001230000230000391112240000320A0B2300002300002400 + 00230000270000230000290102230000270000FFF8F7FFFEFAFFFEFBFFF8F95E + 04097700068400048600038800038600018700018B00018D0001890001820001 + 7601027402027D01018000018000018000014201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003C03023600004C08093C000048090B3500004404094100014E0003440000 + 430A092E0000410D074300007904058300007F00017D02008001008200008400 + 018000017D00047401046904065100005305063E00004B0B0B37000040040439 + 00003E07043400004508043A00005107054900006509086703036F0103770001 + 7D00028400028700028B00019000028E00028700018400018400018200018200 + 018200018000018000017F00017D01017B01017901017901017802017802017B + 01018500008400017402026F01037900085D0308FFFDFBFAFFFCFAFFFEFDFFFE + 140E0F110305210B0D1B00012E0D112100002B070729060334110E200000300F + 0C2403001D00002809063314112203002706031E000045221F20000039131122 + 00003A13112400003812102805022E0D0A1C0000270A061900002005011B0000 + 341512270603401D1A22000038110F220000300F0C1B00002E110D1B00002A0D + 091C000030130F1B0000270A06230602290C081D00002B0E0A1D0000290C08FF + FDF9FFFDFAFFFCFBFFF7F96303097A0006870004860003880003860001860001 + 8900018B00018700018000017601027402027D01018000018000018000013E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B + 3700004500054A0000500507330000410F09300000560C086D00008702047F00 + 017D02008001008200008400018000017D00047401046500025D050545000052 + 0C0C3900004709093500004104023E00004A0704400000580B084A0000680C0B + 6200007408077601027D00028200028600018900018D00018F00018D00018600 + 018400018200018200018000018000017F00017F00017D01017D01017B01017B + 01017901017901017802017F00018A00008B00007B0101770001800006660207 + FFFCF9FFFFFBFAFBF7FCFAF90C04040C00001601031500001F04071900001B00 + 002A0D081B00001900001E05011A02001500001500001500009A847E8A716DD9 + C1BBD9BEBAFFFDF8FFFDF91C00001E00002D0D081C0000190000170000150000 + 1D09049E8C85FFFEF998857E1903001700001B000032140F2B0A071E00002003 + 001900002106021E04001C01001900001E03002B110B1A00001900001D020019 + 00001F04001900001D0200FFFAF5FFFDFAFFFCFBFFF6F9650309780006860004 + 8500038500038200018400018700018900018700018000017801027601027D01 + 018000018000018000014201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 + 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E + 084300007A05068200007F00017D02008001008200008400018000017D000474 + 01046A05075000005507083E00004D0D0D3700004105053F00004D00004C0000 + 610A08520000710F0F610000780A0A7500017B00028000018200018400018700 + 018700008900008700008400018200018200018200018000018000017F00017F + 00017F00017F00017D01017D01017D01017D01017D0101840001910000920000 + 8400017F00018800066F0107FFFAF9FFFFFBFFFFFCFFFEFC1F0D0C180302250B + 0B1B00002D0E0F1C00002613100E00000C0000110700180F0B090100A39D98CE + C8C1FFFFFBFFFBF4FFFFFBCBC3BCB8ADA9FFFFF9BFB0AD1F0F09271411120000 + 251613100400180D099A948DFFFDF8F3F1E9FFFEF9FFFFF9FFFAF58B837C1F13 + 0F0E00001502001E0803280C0B1B00002D0F0E1B0000381A191B00002A0C0B1B + 0000260807230602290B0A1D00002B0D0C1D0000290B0AFFFDFBFFFDFAFFFCFB + FFF7F96204097500067F00047E00038001037D01017F00018600018700018700 + 018200017901027801027F00018000018000018000013E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 + 004F04063300003F0D07300000540A066E00008702047F00017D020080010082 + 00008400018000017D00047401046500025C0404450000500A0A390000460808 + 350000480202550000690304600000790C0E690000800B0C7300007E01038001 + 0281010282000182000182000082000081000081000082000182000182000182 + 00018200018000018000017F0001800001800001800001800001800001800001 + 8000018600008E00008D00007F01007C00008700056F0105FFFBF8FFFFF9FFF9 + F6FFF7F61803021700001E00001C00002604051B00001200000F0200160A0809 + 0000918A87FAF5F2FFFFFCAFACA87A7773787571787370FFFFFCD9D0CD8B7F7D + 1306040E00001000001001001B0E0C090000D6CFCCBAB7B3878682848581F7F8 + F40C0B0784817DC4BDBAFFFFFCC1B4B2A492911300001A00001C00001E00001E + 00001C00001C00002000012303041D00001C00002000011C00002202031C0000 + 200001FFF7F7FFFDFAFFFDFBFFF8F95C05096E00067900047700037902037802 + 017B01018200018700018700018600017D00027B00027F000180000180000180 + 00014100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003B02013800004905063C00004506 + 083600004202074200024E00034600004007062E00003D090346000077020383 + 00007F00017D02008001008200008400018000017D0004740104690406530000 + 5002033F00004808083700003F03034900006801047100007D06077300008508 + 0A7A00008404057E00008301028101028002017D02007D02007A01007801007A + 0100800001840001840001820001820001820001820001800001820001820001 + 8200018200018400018400018600018400008100007B03006F04006E03007C01 + 05660305FFFCF8FFFFF9FFFFFBFFFEFB240D0B1E02012A0B0A220000340E0E21 + 0000290C0F291216715C5FFFFCFFFFF7FAFFFDFF8C7F81180B0D180B0D241719 + 1507091302051C090C1200001600031B02062E1317170000967D81FFFBFE8F7E + 81140709090000867E7FFFFEFF090000180B0D120104180306957E82FFF9FDFF + F4F991717629090E1B00001B000046262B1B000023030823030826060B230308 + 29090E1D00022B0B101D000229090EFFFCFEFFFEFBFFFEFBFFF9F95506096701 + 067201047100037303037203017602018000018600018900018700018200027F + 00028000018000018000018000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 + 003D02003F00004501023C00004001033D00004100014700014701023900003B + 04013900004F02006C00007E01037F00017F01008001008200008000017F0001 + 7901027201046802035D00005000005101004B00004B00004700005600007403 + 068203057D00008100037C00008300038000008301028301028101028002017D + 02007B0200780100770200780100800001820001840001820001820001820001 + 8200018200018200018200018200018400018400018400018600018200007C01 + 007404006B05006C03007A0105640305FFFDF8FFFFF9FFFBF6FFFAF61A03011B + 00002400012000002804041C0000190002FFEDF19D868A917A7EFFF6F9190407 + 120000120000190407120000160003170004150000150000250A0E1700009C80 + 86FFEEF4D6BCC2998287847075FFF1F59E8F93897B7DFFFCFF1406080E000012 + 000020090D1500001A00039C7E83DFBFC4FFF7FCE3C2C99A7C8119000125070C + 1900011900001B00031900001F00051B00002100071B0000210006FFF7FBFFFE + FBFFFEFBFFF9F95506096801067201047100037103037003017403017F000186 + 00018900018900018400018000017F00017F00017F00017F00014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003C00003B00004202013F00004302013E00004101013E + 00004002023F02004106043D00004802024E00006302046F01037D0002820001 + 8200017F00017D01017901017403017002026B01006500006100006300006A03 + 016D06046F03026E00007B000280000180000180000180000180000180000180 + 00018000018000018000017F00017F00017F00017D01017F0001800001800001 + 8200018000018000018000018000018000018000018000018000018200018200 + 018200018200018000017C0100790200760201770001850006690207FFFCF9FD + FFFBFEFFFAFFFFFC260E0E1C00002E060B300B0D1C0000170201FFFBFC938384 + 180607D6C4C598838513000021090B1F04072B101317000024090C22070A2409 + 0C150000331B1D887274FFF2F59C8B8E958487C0AFB2FFFCFF7D6F712413168D + 7D7EFFFCFF857576322021100000210F101402031F0B0A19040323080B1B0001 + 927479FFFAFDFFFBFF8D727523080C190001290E1217000034161B1B00002C0C + 111C00003E1A20FFF2F5FFFEFBFFFEFBFFF8F95C05096F000679000477000377 + 02037203017403007D02008200008700008700008600008000017A0000790101 + 7901017A02023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013B000040050338000047 + 07063C00004706053C00003D02003A0100400705390000490807430000580507 + 5600006A03067D00028400018200017F00017B01017602017203017003016E01 + 006B00006B00006F00007802017B03037D01017C000080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000017F00017E00007B02007B00027E + 00038800066B0108FFFCF9FAFFFBF3F9F4FFFFFC1500001E0000340C111E0000 + 170000D7C5C49285830B00009A8B89FFFCFB1300001F07071900001900001F00 + 011900001A00001700002A10109D8585FFF2F1D1BFBE180B0D73686AFFF7F992 + 87890B0000887B7DFFFDFEFFFDFEFFF1F2FFFDFEF1E2E09182800C00000D0000 + 271B171000001800022005081500001D0507957D7FA48E90FFFCFEC5AFB1907A + 7C2810121700001900001F00032605091F0000FFFAFDFFFEFBFFFEFBFFF7FB5E + 04097300067F00047C00037A02027403017603007D0200820100870000870000 + 8400008001007B00007A00007D01017E02024201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003E0202360000470A083900004D0A093A00004606053A00003D0402360000 + 470C0A3A0000540A0A49000060070A6600027D00028600018400017F00017B01 + 017802017403017203017102006F00006F00007300007A02027E04047E02027D + 0000800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018000018000018000017F + 00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBFBFFFCFFFEFA + 1C0406300D112800052300043A2020FFEEED0F00001D0E0CC2B3B19D8B8A220D + 0C1500002A1010200606280C0C2004042206062B1111C2AAAAFFFBFA9B86850E + 0000877F80C3BEBF251F20827C7DD5CDCEFFFEFFFFF7F7FBF1F1FFFEFEFFFEFE + FFFEFCFFF6F4FFFEFCBFB3B1877C780C00001702041B05071500011200001B06 + 081200002D181A988385CCB7B9FFFCFED0B5B81C00023011141C0000351216FF + F5F8FFFEFBFFFEFBFFF8FB5E04097500068000047E00037E0202780201790200 + 7F01008400008700018700018400018200018800048900048800038700023E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023A00004308063700004C0C0B3C00004B0A09 + 3900003E03013800004209073500004E0D0C4200005C090B5300006A03067F00 + 028600018400018000017D010179010176020174030174030172010073000077 + 01007C0202800404800102800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000017F00017E00007B02007B00027E00038800066B0108 + FFFCF9FAFFFBF9FFFAF7F4F01C04062000012200002200038A70709B87861A08 + 07190706FFF5F4998584150000190101210707170000190000170000907676FF + F2F2A89392120000200C0B0C00000500000202027D7B7BF6F4F4FDF8F9F2EDEE + FFFFFEFFFFFEFFFCFBF2EDECFFF9F6FFFBF8FFFFFCFFF9F6FFFFFBFFFFFB9484 + 851000002210110E000019090A1404050E00000F0000160405150002D0B8BAD5 + BABD1B00001C00001C0000FFFCFEFFFEFBFFFEFBFFF9F95E0409750006840004 + 8300038100037D01017D02008001008400008700018600018000018000018A01 + 058D00048C00038B00024201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003E0202350000 + 480B093900004F0C0B3A00004707063A00003D0402340000470C0A3A0000550B + 0B49000060070A6500017F00028600018400018200017F00017B010179010178 + 02017802017802017800007B01017E0202810203810102800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000017F00017E00007B0200 + 7B00027E00038800066B0108FFFCF9FAFFFBF9FFFAFFFFFC20080A1E0000370F + 14240105FEE4E49D8988180403120000FFFDFC8A7272371F1F170000290F0F17 + 00002E1414D8BEBEFFFCFC8B76751803021200001F0D0C1C100E9A9898EFF1F1 + FDFFFFFDFFFFFFFFFFFFFFFFEFEDECFDFBFAFFFCFB888483DCD7D4FFFFFCFFFC + F9FFFFFCFFFFFBFDF4F0F9EDEDFFFEFEB9ADAD867C7C180E0E1107071C10100C + 0000100001100000978183C7AFB133161927080B27060AFFFCFEFFFFFBFFFFFB + FFF9F95C05097700068700048600038700038000018000018400018600018600 + 028200027B00027B00028200028500018600028700033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023A00004207053700004A0A093C00004A09083A00003E03013800 + 004007053500004B0A094200005906085300006902057F000286000186000182 + 00017F00017D01017B01017901017901017901017B01017D01017F0001800001 + 8200018200018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000017F00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBF6FC + F7FFFFFB1500001E00002A02071E0000FFFCFC897574200B0A1C0404D7BFBF99 + 7F7F170000240A0A170000967C7CFFFCFC856D6D130000210D0C170302100000 + 948583BCB0AEF7F5F5FBFFFFFBFFFFFBFFFFF7F9F9F1F3F39C9D9B7F7D7CFFFF + FE110D0C040100050000CCC5C2FFFFFCFFF8F4FFFFFBFFFEFEFFF7F7FFFFFEFF + FFFEF5F0EF7F77779189890900001D0F100E0000120000FFFCFE170000190000 + 240508F7E2E1FEFFFBFFFFFBFFF9F95C05097800068900048A00038A00038400 + 018200018400018400018200027F00027601027402027A02067A020378000375 + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003D01013800004407053900004A07 + 063B00004404033B00003B02003600004207053A00004F05054A00005C030666 + 00027F00028600018600018200018000017F00017D01017B01017A00007D0101 + 7D01017F00017F00008100008300008400018200018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000017F00017E00007B02007B00027E00038800 + 066B0108FFFCF9FAFFFBFBFFFCFFFFFC1F07092C090D220000280509FFF1F190 + 7B7A240C0C170000907676FFFCFC2F1515170000FFF6F6DFC7C7200808130000 + 220D0C120000210D0C9C8A89FFFEFCFFF6F4FEFCFCFDFFFFFDFFFFFBFDFDC5C7 + C70000000D0E0C807E7DFAF6F5070201140D0A1B120F160A08998C8AFFF3F0FF + FCF8FEF6F6FFFFFEFBF7F6FFFBFAFFFFFEFFFEFDFFFEFDFFFEFE7C70701D0F10 + 8A7879FFFCFE1700001F02053A1B1EFFFDFCFCFFFBFFFFFBFFFAF95C05097800 + 068900048C00038C00038400028200028200028200027F00047900047002046B + 03046C07096806066300025F00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00003C00 + 003D02003C00004202014100004302013F00003C01003900003C03013A000043 + 02014600005200015700016700037D0002860001840001820001800001800001 + 7F00017D01017D00007E00007F00018000018000008200008400008300008200 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000017F00017E00 + 007B02007B00027E00038800066B0108FFFCF9FAFFFBF0F6F1FFFFFC1500001E + 00002700041E00009A8080D0BBBA170000220606200404FFEDEDA187871E0404 + 977F7F1300001300001C0807120000968281FFFDFC837170796A68FFFEFCFFFE + FFF8F8F8FEFEFE8A8A8A0000008E8E8E020000040000FFFFFE0D03030C00000C + 00001200001200009D8684FFFEFBFFFAFAFFFFFEFEFCFBFCFAF9FFFFFEFFFFFE + F3EEEDFFFEFEFFFEFEFEF0F1FFFDFED0BABC1800021900001B0000FFFCFBFAFF + FBFFFFFBFFFAF95A05097800068900058A00038A00038400028000028000027D + 00027900047201046902056204055805045404035202015101004000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00003C00003B00004003013E00004502013F00004101003C + 01003B02003700003D02004000004C02024D00005800026801047B0002840001 + 8400018200018000018000018000017F00018000018000018000018200018200 + 0184000186000184000182000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000017F00017E00007B02007B00027E00038800066B0108FFFCF9FA + FFFBF9FFFAFFFFFC250D0F1E0000340C111E00002D1313FFFDFC2105051B0000 + 270B0B1F0303FFF6F69B8181240C0C130000230E0D120000FFF1F0FFF9F8A795 + 94100000251312FFF7F5FFFEFF8D8788040000140F10B6B1B2FFFEFF807B7A07 + 0000FFFCFC0F0102210F0E1300002F15151900002F100FFFFDFB918787777574 + C5C3C2FCFAF9FFFFFEFFFFFEFFFEFDFFFEFEFFFEFEFFF3F4FFFDFE8973753119 + 1B19000026070AFFFCFBFAFFFCFFFFFBFFFAF95A050977000686000487000286 + 00048001037C01038005097901057605096700015D00024F00004C0202450201 + 4300004000003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00003F01013B000040050338000047 + 07063C00004706053C00003D02003A01003D0402350000490807430000540103 + 5300006A03067901028200018200018200018000018000018000018000018000 + 0180000182000182000184000184000186000184000182000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000017F00017E00007B02007B00027E + 00038800066B0108FFFCF9FAFFFBFBFFFCFDFAF61800021E00002E060B1E0000 + 1B0101907B7AE2C6C61C0000190000170000907676FFFCFC846F6E220E0D1200 + 009A86859E8C8B100000100000120000170302998A880B00000700008D8586FF + FEFFFFFEFFFFFAFB948C8C0B0101FFFDFE1000001803021700002E0E0F200000 + 240000997B7ABEB2B21915140400000E0A097F7B7AF0ECEBFFFFFEFEF6F6FFF5 + F5A89A9B816F701701031700001900002C0D10FFF9F8FBFFFBFFFFF9FFFBF859 + 060875000684000583000381000577000179070770000078090D630000660509 + 5100004B00003E00003D00003F00004303024201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C + 00003E0202360000470A083900004D0A093A00004606053A00003D0402330000 + 4409073A0000540A0A4900005C03066500027801028000018000018000018000 + 0180000180000180000182000182000182000182000184000184000184000184 + 0001820001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018000018000018000017F + 00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBFBFFFCFEFBF7 + 1800022100022800052502061B01011E0908D2B8B8DBBFBF270B0B170000331B + 1B897473FFFDFCD2BEBD210D0C1000001804038F7B7AFFFCFB8D7877200B0A12 + 00009B8E90CCC4C5FFFAFBFFFEFFF3EBECFFFAFB9187870B0000FFFDFE120000 + 1901011B00002D080A2800022800002C0808FFFDFE847C7C1914130500001813 + 12CDC5C5FFFEFE8B81811608090E000029141617010323080B1B0001250609FF + FDFCFDFFFBFFFFF9FFFBF85906087200078000067D00047A0206710406630000 + 70090C5B000068090D4F00005304074500004B02044701024500004200003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004002023A00004308063700004C0C0B3C00004B0A09 + 3900003E03013800003F06043500004E0D0C4200005906085000006A05077601 + 027F00017F00017F00017F000180000180000180000182000182000182000182 + 0001840001840001840001820001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000017F00017E00007B02007B00027E00038800066B0108 + FFFCF9FAFFFBFAFFFBFFFFFC1E0608250206230000230004280E0E1300001900 + 00DAC0C0FFFAFA937B7B1300002E1A19120000907C7BFFFDFCCEBCBBD5C1C0FF + FDFC927D7CFFF8F8230B0B8F7A79F3E6E8FFFEFFFFFEFFFBF5F6FFFEFFFFFEFF + 756D6D160C0CFFFCFD1604051F07071E000027020428000037080A2200009781 + 83C4B8B8140808090000110707FFFCFC7F73730C00001F0F101000001B050715 + 00001C00021B00001C0000FFFAF9FEFFFAFFFFF9FFFAF85707086F01077A0006 + 760104710406620000650908500000630A0D4C000057080B3F00004502054400 + 004700004700004A01034201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003E0202350000 + 480B093900004F0C0B3A00004707063A00003D0402330000450A083A0000560C + 0C4900005D04076500027601027D01017D01017D01017D01017F000180000180 + 0001800001800001820001820001820001820001820001820001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018000018000018000017F00017E00007B0200 + 7B00027E00038800066B0108FFFCF9FAFFFBF0F6F1FFFFFC1A02041F00002200 + 001E0000260C0C1500001F07071B0101917979FFFDFCDEC9C88B777628141312 + 00001C0A098B79788B7776170201281010FFEDED2C1010917C7BFFFDFFFFFEFF + FFFEFFFFFEFFFAF8F8F2F0F07D79780B0605FDF3F31B0B0C1A05041900002702 + 04230000330708260000190103FFFDFE1000000E0000958586FFFDFE16060718 + 08091B090A1200001901031700002D0E112D0C102C0B0FFFFCFCFFFFFAFFFFF9 + FFF9F75406076A00067400056C01036705055A04044B000057090A4500005508 + 0B3E000046060B3D00004801044B00034900014600003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023A00004207053700004A0A093C00004A09083A00003E03013900 + 003E05033500004C0B0A4200005704065100006904067402027B01017B01017B + 01017D01017D01017F0001800001800001800001820001820001820001820001 + 8200018200018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000017F00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBF5FB + F6FFFFFC1600001E00002A02071E00001C02021601001500001B030313000012 + 0000988483D2C0BFFFEEEDD1BFBE1000001200002C1716150000170000FFFCFC + 1E0000897171FFFEFFF8F8F8FFFFFFFDFFFFF3F5F5FDFFFF979896020000FFFA + F9160A0A1200001700002A0A0B2200002700002600001A00008F797B97818312 + 00008F7A7C8671732D181A1200001601031F090B250A0D1900001B00001C0000 + 200001FFFCFCFFFFFAFFFFF9FFF9F75305066500046D00036400005B04024B00 + 004D08053C00004C08093C00004807093400003D04073D000043000045000148 + 01044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003D01013800004407053900004A07 + 063B00004404033B00003C03013500004106043B00005006064900005B020564 + 01037202027901017901017B01017D01017D01017F00017F0001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000017F00017E00007B02007B00027E00038800 + 066B0108FFFCF9FAFFFBFBFFFCFFFFFC1B03052603072800052100021D030312 + 000025100F130000341F1E150100100000DCCDCBFFFEFCD7C8C6877574A69291 + 130000150000391D1DFFFBFC240405A89090FFFEFFFAFFFEF6FBFAFAFFFFFAFF + FFECF4F36C7370050A08FFFFFE0700001306041702012509091F000026000022 + 00002D0E111B0003FFFCFE150000DAC2C48973751600022C1618130000190103 + 1800002104072F101328070B260307FFFAFAFFFEFAFFFFF9FFF8F65204056100 + 026600005B00005301004502003B00004407053700004506083500003A040935 + 00033F05063F03043D01023900004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00013C00 + 003D02003C00004202013F00004302013F00003E01003C00003C01003B000045 + 04034500004D00005000006104056F02047602017801027901017B01017D0101 + 7D01017F00018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000017E00 + 007D02007B00027E00038800066B0108FFFDF9FAFFFBFBFFFCF5F2EE21090B2A + 070B220000210000230909130000170000260C0C1500001702011D0908837170 + FFFEFCFFF1EFFFFEFCFFEEEDFFFDFCFFFDFCFFF0F3FFFCFC230407846E70FAF6 + F5FAFFFFFAFFFFF2FAF9F7FFFEF8FFFF818885000100FFFFFE070000190C0A1A + 06051700001C00002904062000001B0000170000D2BABCA08A8CC8B2B4250F11 + 1300001500001700011F04071900001C00001E00011C00001C0000FFFCFCFFFE + FAFFFFF9FFF8F74604055300015900015000004B00004101003E04003B00003F + 03033B00003E03073700033702053600003800003A00013D03044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000013E00013D00004201033E00004201033E000041000240 + 00003E00013D00004201033E0000430003410000460002500000670003700000 + 7300037601027A02037C01037E01038001038000018000018000018000018001 + 008001007F01007F010080000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000017F00008001007D00027F00038A00066B0108FFFDF9FA + FFFBFBFFFCFFFFFC230B0D23000430070C2400012C0D0E1C00002E0F0E1E0000 + 200001270B0B2208081300001F0D0E1202031D0D0E1303041303041F0D0E1B06 + 091300003922267D6D6EFFFFFEFBFFFEF8FDFBF9FEFCFBFFFEF9FCFA7A7B790B + 0706FFFEFE11050519090A18020426090C2000032C070B240203270B0B150000 + 857170FFFDFCFFFEFC0E00002C1A1913000022080822030429090A2000002B0B + 0C1D0000270B0BFFFDFCFFFDFBFFFEFCFFFBFC2F00023C000143000049010144 + 00004300003F00004003013C00004002023A00003D01023C0001410204400103 + 3E00013B00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004A00015F00006B00006E00027401047801027901027D00027E00018000 + 018200018200018200018001008001008001007F010080000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018100008001007F00027F + 00038A00066B0108FFFDF9F8FFFBF6FCF7FEFBF71A02041E0000290003230000 + 2304051B00002000002F09092803051C00001E0202947F7E7967680F0102897B + 7C867A7A86787A8E8082938285857477867376978A8CFFFDFCF9FEFCF3F8F6F4 + F9F7FDFFFEFFFFFE888483050000FFF9F90C00001100001300001C00021C0000 + 2000011C0000190000200B0A210F0EFBECEAC7BAB81205030E00001804031A00 + 001C00002200011E00002202031900001B0101FFF9F8FFFBFBFFFEFEFFF4F42D + 0B0B2B00004108073D00004401004200004505013A0000450806370000440606 + 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605074500005700006300006800016F01037401 + 047800037B00007C000082000284000284000184000182000080010080010080 + 0100800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018100008001007F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC + 240C0E23000433070D2500012D0E0F1E00002500002B03042000001C00001C02 + 02DFCAC99A88890E0001FFFEFEFFFEFEFFFDFFFFFBFDFFFDFFFFFDFFFFF9FCFF + F4F6FFFDFCFDFFFEFDFFFEFDFFFEF4F5F3F5F6F48682810E0606FFFEFE120405 + 1D080A1B0305270A0D2000032A070B230206280C0C190101120000E3D4D2C3B6 + B41508061C0D0B1804032509092404052C0A0B2000002C0C0D1D0000250B0BFF + FDFCFFFEFEFFFAFAFFFCFC1E00003A090B3300004707074100004502003B0000 + 490908370000480A0A3700004605073E00004403054201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004701025000 + 005A00006200006A02037002047700037B00007D000084000286000286000186 + 0001840000820000800100800100800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018100008001007F00027F00038A00066B0108 + FFFDF9F8FFFBF6FCF7FEFBF71A02041E00002900032300002304051B0000350F + 0F230000200000270708170000D9C5C48676770B0000FFFAFAFFFEFEFFFEFFFA + F2F3FFF7F9FFFDFFFFFDFFFFFEFFFFFFFEF7FAF8FFFFFEFFFFFEFFFFFEFFFFFE + 85807F070000FFF9F90C00001300001500001C00021B00001E00011C00001900 + 001F0707120000948583FFF8F60C00001000001300001A00001C000024000120 + 00002402031B00001B0101FFF9F8FFFAFAFFFEFEFFF0F03210102B0000460D0C + 3A00004502014100004808043900004A0D0B370000480A0A3900004201033D00 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706084100004A00005100005901016302046D02047401047C000381 + 0003860002870002870001870001860001840001820001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001810000800100 + 7F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E2300043307 + 0D2500012D0E0F1E00002B0505230000351012220203170000D8C4C38F7F8009 + 0000FDF5F5FFFFFEFFFEFFFFFDFEFFFEFFFFFAFBFEF6F7FFFDFEFFFFFEFEFFFD + FCFAF9F8F6F5FBF9F8FFFFFE928D8C110909FFFEFE1404051D080A1B03052409 + 0C1F000328070B2302062B0F0F1600001E0A09897A78FFFCFA0D00002D1B1A13 + 00002408082404052E090B2200002E0C0D1D0000250B0BFFFDFCFFFEFEFFF9F9 + FFFCFC1E00003C0B0D3300004808084100004502003A00004A0A093700004A0C + 0C3700004706083E00004302044201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004301024300004A00005101005C + 02026602027002047B0004820004860002890002890002870001860001840001 + 8200018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018100008001007F00027F00038A00066B0108FFFDF9F8FFFBF6FC + F7FDFAF61A02041E00002800022300002304051B00002D0707230000330E101D + 00001C0202D6C2C1928485070000FFFFFEFFFFFEFEFCFCFFFFFFFFFFFFFFFFFF + FDF8F9FFFDFEFFFBFAFFFFFEFFFFFEFFFEFDFFFFFEFEF9F87D7575090000FFF9 + F90E00001300001300001A00021900001E00011C00001900001B030312000027 + 1514FFFDFB0E00001000001601001C00001E00002400012000002402031B0000 + 1B0101FFF8F7FFFBFBFFFEFEFFF1F1310F0F2B0000440B0A3B00004502014100 + 00470703390000480B093700004709093A00004201033C00003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00003E01004001004801005100005D00006A0002780004800005860004870002 + 8900028700028600018400018200018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018100008001007F00027F00038A00 + 066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E23000433070D2500012D0E0F1E + 0000300A0A230000220000220304220808CAB8B7877B7B070201FFFFFEFFFFFE + F8F8F8F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFFFEFDFFFDFCFFFFFEFFFF + FEBAB5B4312929090000FFFEFE1204051B090A19030524090C1D000327080B22 + 0306290D0D170000230E0D100000FFFEFC0E0000231110170201260708260405 + 2E090B2200002E0C0D1E0000270B0BFFFDFCFFFEFEFFFCFCFFFCFC2000003706 + 083600004505054200004401003D00004606053700004507073800004403053F + 00004504064302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00003E00003902003901003F0000480000550000630000 + 7100037C01058000048600048600028600028400028200018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018100 + 008001007F00027F00038A00066B0108FFFDF9F8FFFBF6FCF7FEFBF71A02041E + 00002900032300002304051B00002200002901022400011E0000150000D0BEBD + 8D8181050000F6F4F3FFFFFEFDFFFFFCFEFEFBFDFDFBFDFDF9FBFBFCFCFCFFFF + FEFFFFFEFFFFFEFAF5F48C87860803020700008A8282FFFAFA0C000010000112 + 00001901031700001C00021900001900001C0202190403100000FFFCFA1F100E + 1200001500001D00001E00002600012200002601031C00001E0202FFF9F8FFFC + FCFFFEFEFFF8F82907072E00003E05043F00004300004300004202003E000040 + 03013C00004002023F00004000013D00003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100023C0000390401370200 + 3F04024300005301005900006600006D00007D02067F00048100037F00007D00 + 007D00007E00017F000280000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018100008001007F00027F00038A00066B0108FFFDF9F8 + FFFBFBFFFCFFFFFC230B0D23000432060C2500012C0D0E1E00002C0808240000 + 2E0C0D1D0000230B0BD5C3C28E82820B0605FFFFFEFFFFFEFDFFFFFBFFFFFBFF + FFF9FEFDFDFFFFFEFEFEFFFFFEFFFEFECDC5C50700001D1817080302C1BCBBFF + FEFEFFF9F9897D7D1F11121505061F0A0C1300002D1517160000270B0B250B0B + 261110867473FFFEFC0E00002E1A191500002607082503042F080A2400002F0A + 0C1E0000270B0BFFFDFCFFFDFDFFFEFEFFFCFC2402023201033A010042020242 + 00004300004000004202013C00004002023C0000410002400001430204420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00003D01023701003A07043500004807064300005903035900006600007201 + 047700037A00037B00027C00017C00017D00027D00027F000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 018000018000018000018000018000018000018000018100008001007F00027F + 00038A00066B0108FFFDF9F8FFFBF6FCF7FEFBF71A02041E0000290003230000 + 2304051B0000230000220000240203190000180302C9BAB8857979050000FEFC + FBF4F5F3FDFFFFE5EAE9FBFFFFFDFFFFFCFEFEFAF8F8FDF8F7847C7C0700000D + 0807898483FCF7F6FFFEFDFFFFFEFFFCFCFFFEFEFFFBFB7B6D6E908081B09E9F + 8570728F797B8E7474947A7A968180FFFAF99B89881000001200001500001D00 + 002000002600012200002601031C00001D0101FFF9F8FFFBFBFFFEFEFFF4F42D + 0B0B2B00004108073D00004401004200004505013A0000450806370000440606 + 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073C00003D0504330000430A083900005109 + 094500005A04045A00006500026A00026E00027401047800047A01057A02037B + 00027F0001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018100008001007F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC + 240C0E23000433070D2500012D0E0F1E00002D09092300002C0C0D1C0000220D + 0CD3C4C28F83830B0605FFFFFEF3F4F2FAFCFCFDFFFFFBFDFDFFFFFFFFFFFF81 + 7F7F211C1B150D0D8F8A89FFFDFCFAF5F4FFFFFEFFFFFEFFFCFBFDF9F8FFFFFE + FFF9F9FFFBFBFFFEFEEDDFE0FFFDFEFFFCFEFFFCFCFFFCFCFFF2F2A28E8D200E + 0D1000003D292815000028080928030530090B240000300B0D200000290A0BFF + FDFCFFFEFEFFFAFAFFFCFC1E00003A090B3300004707074100004502003B0000 + 490908370000480A0A3700004605073E00004403054201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004001033900 + 004209083500004A0D0B3A0000520A0A4500005402015700005D00006602026D + 02047103057502057902037901027F0001800001800001800001800001800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 00018000018000018000018000018100008001007F00027F00038A00066B0108 + FFFDF9F8FFFBF6FCF7FEFBF71A02041E00002900032300002304051900002100 + 00200000220203190000180302C9BAB8857979050000EBE9E8FFFFFEFBFBFBFE + FEFEFFFFFFBEBCBC04000004000005000075706FFFFFFEFAF6F5FFFDFCFDFBFA + FFFFFEFFFDFCFFFFFEFDF9F8FFFFFEFFFEFDFAF0F0FFFBFBFFFEFEFFF3F4FFF9 + F98C70702109091200001000001000001500002107071D000020000027000123 + 00002801031E00001F0001FFF9F8FFF9FAFFFEFEFFF0F03210102B0000460D0C + 3A00004502014100004808043900004A0D0B370000480A0A3900004201033D00 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E0000420404390000490B0B3700004A0D0B39000049080744 + 00004A00005100005B01016201036B03047002047401047801027D0101800001 + 8000018000018000018000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001810000800100 + 7F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E2300043307 + 0D2500012D0E0F1C00002B09092100002C0C0D1B0000210C0BD3C4C28F83830D + 0505FFFFFEFFFFFEECEAEAFFFFFF817C7D0500001C1415847C7DFFFFFEFCF7F6 + F8F3F2FFFFFEFFFFFEF7F8F6FFFFFEF6F7F5EDEEECF8F9F7F7F5F4FFFFFEFFFC + FBFFFFFEF4ECECDACCCD170000240808260E0E1200002E1C1B1000001D080717 + 000027070828030531090B250000320B0D200000290A0BFFFDFCFFFDFEFFF9F9 + FFFCFC1E00003C0B0D3300004808084100004502003A00004A0A093700004A0C + 0C3700004706083E00004302044201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A000042010341000048060739000048 + 0A0A350000430A08360000400503400000470000500000590101630101690102 + 6E00027500017D00028000018000018000018000018000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018100008001007F00027F00038A00066B0108FFFDF9F8FFFBF6FC + F7FDFAF61A02041E00002800022300002304051900002100001E000022020317 + 0000160201C9BAB8857979070000FDF8F7F8F4F39C97980500000B0506857D7E + D2C7C9FFFDFFE4DFDEFFFFFEFFFEFDF7F5F4FFFFFEFCFFFDF6F9F7FDFFFEFDFF + FEF8FBF9FDFFFEFFFFFEF9F7F6FFFFFE807C7B0C00001E06062307071500001D + 08071200001501001A05041700001F00002200002700012300002801031E0000 + 1F0001FFF7F7FFFAFBFFFEFEFFF1F1310F0F2B0000440B0A3B00004502014100 + 00470703390000480B093700004709093A00004201033C00003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A000044030540 + 00004802034200004705063700004108073200003A07043702003A0200400100 + 4900005100005B00006400006B00007300007D00028000018000018000018000 + 0180000180000180000180000180000180000180000180000180000180000180 + 0001800001800001800001800001800001800001800001800001800001800001 + 8000018000018000018000018000018000018100008001007F00027F00038A00 + 066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E23000433070D2500012D0E0F1C + 0000290A091F00002B0C0D190000200C0BD3C4C28F83830D0505C9C4C38E8988 + 0E08090E0607CDC2C4FFFDFFFFFDFFFFF4F6FFFFFEFEFAF9FFFFFEF7F5F4FFFF + FEEDF0EEFDFFFEFBFFFEE8EDEBF9FEFCFAFFFDF6F9F7898A8802000017151409 + 00001D05051900002F151519040324100F1200002914131700002907082A0305 + 31090B250000320B0D2200002A0A0BFFFCFCFFFDFEFFFCFCFFFCFC2000003706 + 083600004505054200004401003D00004606053700004507073800004403053F + 00004504064302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004100014600014802034000004103033800003C0403 + 3701003904013A03003E01004200004900005000005800005F00006500007202 + 027601027601027601027801027801027901027901027B00027B00027D00027D + 00027F00027F00027F00027F00027F00017F00017F00017F00017F00017F0001 + 7F00017F00017F00017F00017F00017F00017F00017F00017F00018000018100 + 008000017D00027C0003830008660208FFFCFBFDFFFBF8FCF7FFFAF71C010420 + 00002600032000002304051B00002300002000002503041900001A0202CCBAB9 + 8678790900000904030702017F797AFFFBFCFFFDFFFCF1F3FFF7F9FFFEFEFFFF + FEF3F4F2FFFFFEFFFFFEFDFFFEFDFFFEF4F7F5FFFFFEFFFFFEFFFFFEC4C2C104 + 00000904030700000900001002031800001C00001800001500001300001F0A09 + 1500001F03031E00002000002600012200002601031E0000210102FFF8F8FFFB + FCFFFEFEFFF8F82907072E00003E05043F00004300004300004202003E000040 + 03013C00004002023F00004000013D00003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E0000410002400001410001400000 + 4201033E00004001033C00003D01023C00003E00003F00004301024100004701 + 024500004A00014E00005500005A00005E02015C00006505056602026B05066E + 03057305077302057A05087700037D04087A00037F01067D00047C00017A0000 + 7D00027900007E01037900007D00027B00007C00017A00007D00027900007E01 + 037900007D00027D00007E00007D00017A020771000474010B580008FFFBFBFF + FFFCFFFFFEFFFEFE290A0B27000229090A1D00002C0E0D2100003A0D10290000 + 2D04092B060A331619C2ACAED8C8C9090000837E7DBFBBBAFBF7F6FFFFFEFFFF + FEFFFDFCFFFCFCFFFBFAF5FAF8F8FFFCFAFFFCF6FCF7FDFFFCF3F4F0FFFFFCFE + F9F6FFFDFA8A7E7C2A1B191000001F0A091C04042309091A0000270809210203 + 2509091C0000270B0B1E020224080820010226070823030429090A1E00002B0B + 0C1E0000290A0BFFFCFCFFFCFDFFFEFEFFFCFC2402023201033A010042020242 + 00004300004000004202013C00004002023C0000410002400001430204420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004200014400004C010046000055 + 05044C00005B05055700005F01026500026D040768000076070B6D00007C060B + 7500027A02077700037A05067100007D08097000007C07087300007803047500 + 017A05067100007D08097000007C07087300007B02067B00018002086E000372 + 080F6300035A0A11FFF6F8FFFEFCFCFAF9FFF9F92101022200001F0100170000 + 2306022000002500002800002500021C0000170000E7D2D4C4B8B8837E7DFFFF + FEFFFFFEF9FCFAF5F8F6F9FAF8FFFFFEFFFFFEFFFFFEFAFFFCF4FEF8F6FDF8FB + FFFCF2F6F1FFFFFCFFF8F59185831809071000001300001700002405061C0000 + 2100001C00001E00001B00001E00001B00002001021B00001C00001B00001C00 + 001B00001F00011B00002102031B00001F0001FFF8F8FFFAFBFFFEFEFFF4F42D + 0B0B2B00004108073D00004401004200004505013A0000450806370000440606 + 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073F + 00004300003E00004C07044000005308064700005604035100005A0000560000 + 6906085A000070090C61000072070A6B00036E0305660000750A0C620000760B + 0D6400007207096A00016E0305660000750A0C620000760B0D6400007207096D + 00017500026E000075090F5900006D0A12460000FFFBFCFFFFFCFFFFFEFFFEFE + 2B0B0C270002290B0A1900002E0F0C21000024040528090C2005081400011709 + 0A817979FFFFFEF5FAF8F1FAF7F4FFFCF6FFFEF6FFFEF8FFFEEFF8F5F5FCF9FA + FFFEF0F6F1F4FAF5FDFFFCFDFEFAFFFFFCC0BBB88A817E0D0000100000120000 + 2810101C02022001021D00002F0D0E22020328080922030428090A1E00002A0B + 0C200102270809210203270809230405290A0B1D00002B0C0D1D0000290A0BFF + FCFCFFFDFEFFFAFAFFFCFC1E00003A090B3300004707074100004502003B0000 + 490908370000480A0A3700004605073E00004403054201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004202023E00004809053900004E0E0A3C0000520B08 + 4200004F02004B00005704034C0000620A0A50000066090A5700006002035A00 + 00630605530000680B0A5300006609085500005F02015A000063060553000068 + 0B0A5300006609085500006300026400006D020555000064080D5000004F090F + FFF0F1FFFFFCF8FBF9FFFAF92101022200001F01001700002405021C00001F03 + 031500001200000E0000201616040000F3F6F4F9FFFDF6FFFEF0FEFAEEF9F6F3 + FEFBF6FFFEF8FFFEF6FDFAF2F7F5FFFFFCF0EFEBFFFEFAFFFFFC7B7471170E0B + 0E01001000001F0B0A1601001E04041900001B00001C00002301021E00001E00 + 001B00001E00001B00002001021B00001C00001B00001C00001B00001F00011B + 00002102031B00001F0001FFF8F8FFF9FAFFFEFEFFF0F03210102B0000460D0C + 3A00004502014100004808043900004A0D0B370000480A0A3900004201033D00 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083C00003F0604350000 + 460D0B3500004B0E0C390000490807410000470101400000530909430000580A + 0B4700005505064B000050000147000057070847000059090A4700005404054B + 000050000147000057070847000059090A4700005404054E00005B0000530000 + 5C080A4700005C080D370000FFFCFCFEFDF9FBFFFEFFFFFE2B0B0C270002290B + 0A1900002E0F0C1F00002E14141701031A05070E00002418180F0A09939190FD + FFFEF7FCFAFAFFFEFBFFFEF8FDFBFBFEFCFDFFFEFFFFFEFFFFFEFFFFFCFFFFFC + BFB3B11205031407050E0000210F0E1300001B03031700002105051E00002606 + 071F00002C0A0B22000128080923030429090A1F00002B0B0C21010227070822 + 02032707082404052A0A0B1E00002C0C0D1E00002A0A0BFFFCFCFFFDFEFFF9F9 + FFFCFC1E00003C0B0D3300004808084100004502003A00004A0A093700004A0C + 0C3700004706083E00004302044201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004002023700003D0805320000430C093200004209073600004003013D00 + 004606053A00004D0A093C00004B08073E00004600004300004B05053E00004F + 09093E00004E08083F00004701014300004B05053E00004F09093E00004E0808 + 3F00004B01014E00005705044200004F090A420000440B0EFFF5F4FDFFFCF5FC + F9FDF9F82001022200001E00001700002405021C00001B00001900002E131619 + 03051402030E00000B00000900008C8484B4ACACD2CACACCC4C4C0B6B6C4B8B8 + CBBDBECCBEBFCABBB982706F1A08071200001200001C07061C0404170000280E + 0E1900001B00001B00001E00001C00002100001E00001E00001C00001F00001C + 00002101021C00001D00001C00001D00001C00002000011C00002202031C0000 + 200001FFF7F7FFFAFBFFFEFEFFF1F1310F0F2B0000440B0A3B00004502014100 + 00470703390000480B093700004709093A00004201033C00003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053D00003A02013200003C07043000003E09 + 063300003D06033900003B02003800004207053700004508063900004306043E + 01004202023D00004706083A00004807093B00004504063F00004201033D0000 + 4706083A00004807093B00004504064000004800004400004707063700004906 + 09300000FFFEFCFBFFFCF8FFFEFFFFFE2A0B0C270002290B0A1900002D100C21 + 00003D161823000030080D2400031C00001B000045282B170000260B0E22070A + 1C01041B00012506092D0E1129080C1B0000250B0B230B0B220A0A1C02023F25 + 251700001900002408082307071B00002102032505063313142606072707081C + 000028080923030429090A1F00002B0B0C210102270708220203270708240405 + 2A0A0B1E00002C0C0D1E00002A0A0BFFFCFCFFFDFEFFFCFCFFFCFC2000003706 + 083600004505054200004401003D00004606053700004507073800004403053F + 00004504064302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00003E00013A01 + 003B04013801003C05023801003D06033A03003C05023800003A01003700003D + 04023900003F06043C03013E05043B00003D01023A00003E02033900003E0203 + 3B00003C00013B00003D01023A00003E02033900003E02033B00003E00003F00 + 00410200360000390100390000330406FFF9F7FAFFFCF3FCF9FEFAF920010222 + 00001D01001700002306021E00002500002F0107270000280002260002220000 + 2100002000002200012000002200002200002300002500002500002500011C00 + 001900001B00001900001B00001B00003213141B00002001021B00002303041C + 00001C00001C00002404051E00001F00001C00001F00001C00002101021C0000 + 1E00001C00001E00001C00002000011C00002202031C0000210102FFF8F8FFFB + FCFFFEFEFFF8F82907072E00003E05043F00004300004300004202003E000040 + 03013C00004002023F00004000013D00003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100024000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100023E00013E00003B00003E02023A00003E02023A00003D01013A + 01003C00003B00003E02023A00003C03023800003B02013A01003C00013D0002 + 4000053C00014000053C00013F00043E00033E00033D00024000053C00014000 + 053C00013F00043C00013F040232000045120F2E000043090A290000FFFEFCF5 + FBF6F4FBF8FFFFFE1F00012B0406311514150000280D0922030230080A2A0004 + 31050B250000330A0F2600032D050A2500022F070C2700042F060B2500003509 + 0F2B000332040A2800022B090A2001022808091B00002C0C0D2000012707081F + 000028090A2001022708091B00002B0C0D1F00012607081E000028090A200102 + 2708091B00002B0C0D1F00012607081E0000240506270809290A0B1B00001C00 + 002A0B0C1B0000FFFCFCFFFDFEFFFDFDFFF8F82100004211133600004A0A0A3C + 00004300004000004202013C00004002023C0000410002400001430204420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004404043A000047 + 07073900004406063A00003F01013D0000420404380000430707350000420606 + 3800003D01013D00004202073A000045050A3900004404093C00003F00043F00 + 024202073A000045050A3900004404093C00003F00023900003F0B052B00003C + 0B09330000491A1CFFF0EEFDFFFCFAFFFEFCF7F6200001220000230A08130000 + 1C03001900002000011E00002100021E00002401051E00001E00011C00002200 + 031E00002300022000002601052200002400012200002200011C00001F00001C + 00002202031B00001E00001B00001F00011B00001E0000190000210203190000 + 1D00001900001F00011900001E00001900002102031900001D00001900001B00 + 001900002506072509092B0C0D1900001B0000FFF4F4FFFDFEFFFEFEFFE9E930 + 0E0E2B0000370000390000520F0E4200004505013A0000450806370000440606 + 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004301023B00004A08093A00004B090A3A00004705063E00004202023A0000 + 490909370000480A0A3700004406063E00004201033A00004A070A3900004B08 + 0B3900004704073E00004300033A00004A070A3900004B080B3900004704073C + 00003400003300004919152E00004E12132F0000FFEFEEFFFFFCFBFFFEEDE5E5 + 4222232200001C030112000028140F230E0C1B07061601031B06081400011D08 + 0A1601031A05071500021B06081601031C06081500011E080A1901031D05071A + 00022405061F00012405061D00002607081D01012304051C00002206061D0101 + 2206061900002408081B01012105051A00002206061B01012206061900002408 + 081B01012105051A00002C10101700001900001700001F0303190000472B2BFF + F5F4FFFBFBFFF8F8FFFCFC1E00004211133300004707073C00004502003B0000 + 490908370000480A0A3700004605073E00004403054201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033F00004A06073C00004F0B0C3C00004D090A + 3A00004301023F00004806073900004C0C0C3900004A0A0A3900004202023F00 + 004805083A00004D0A0D3A00004B080B3A00004300033F00004805083A00004D + 0A0D3A00004B080B3A00004202023D02003D06013906033200003F0000370205 + FFFDFCFFFFFCFAFBF9FFFEFEFFE9EAFFF6F8FFFDFBFFFCF9FFFCF7FFEFECFFFE + FCFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFDFEFFFEFEFFFDFEFFFDFEFFFDFEFF + FDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFC + FFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFC + FCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFF7F7FFFCFCFFFCFCFF + FCFCFFFCFCFFEDEDF7DFDFFFFDFCFFFEFEFFFEFEFFF5F52000002B00004A1110 + 3F00004704034100004808043900004A0D0B370000480A0A3900004201033D00 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E00004300033A0000 + 4B080B3A00004D0A0D3A00004805083F00004300033A00004B080B3A00004D0A + 0D3A00004805083F00004301023A00004B090A3A00004D0B0C3A00004806073F + 00004301023A00004B090A3A00004D0B0C3A00004806073E0000430302350000 + 3B0401370000510C0F320000FFFCFCEDE6E3FDFBFAFFFEFEFFFAFCFFF9FBFFFD + FBFFF8F5FFFFF9FFFEFBFFF9F7FFFAFAFFF9F9FFFBFBFFF8F8FFFBFBFFF9F9FF + FBFBFFF9F9FFFAFAFFF9F9FFFBFBFFF8F8FFFBFBFFF9F9FFFAFBFFF8F7FFF8F8 + FFF7F7FFF9F9FFF6F6FFF9F9FFF7F7FFF9F9FFF7F7FFF8F8FFF7F7FFFAF9FFF6 + F6FFFAF9FFF7F7FFFAF9FFF8F7FFF9F8FFF8F7FFFAF9FFF7F6FFFAF9FFF8F7FF + FAF9FFF6F5FFFDFCFFFAF9FFF1F0FFFDFCFFFDFCFFFDFCFFF9F8FFFEFEFFFBFB + FFFCFC2B09093F0E103500003C00004906054502003A00004A0A093700004A0C + 0C3700004706083E00004302044201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3B00004201033F00 + 004605073A00004B080B3A00004A070A3B00004300033F00004705063A00004B + 090A3A00004A08093B00004301023F00004705063A00004B090A3A00004A0809 + 3B00004302013B00004203003A00004F1111410000420509FFFBFCFFFFFCFFFC + FBFFF9FAFFFAFCFFF8FAFFFBF9FFFBF8FFFBF5FFFEFAFFFEFCFFFDFEFFFDFEFF + FDFEFFFCFDFFFDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFCFDFFFDFE + FFFDFEFFFDFEFFFDFCFFFDFCFFFDFCFFFDFCFFFCFBFFFDFCFFFDFCFFFDFCFFFD + FCFFFDFCFFFDFCFFFDFCFFFCFBFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF + FDFCFFFCFBFFFDFCFFFDFCFFFDFCFFFAF9FFFDFCFFFBFAFFFDFCFFFBFAFFFDFC + FFFCFBFFF7F5F9EFEFFFFEFEFFFBFB2A08083100023500004808084401004100 + 00470703390000480B093700004709093A00004201033C00003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00003F00023A00004405073700004506 + 083800004403053D00004100023A00004605073900004706083A00004403053F + 00004101013C00004606053900004707063A00004404033F00004101003C0000 + 4606053900004707063A00004404034000004D0A073F00005212113A00005407 + 0B400003FFE2E3FFFEFCFFFEFEFFFDFEFFFAFCFFFAFCFFFDFBFFFFFBFFF7F1FF + F9F6FFF5F4FFFBFDFFF4F7FFFBFEFFF1F4FFFBFEFFF5F8FFFBFEFFF3F6FFFAFD + FFF4F7FFFBFEFFF2F4FFFCFEFFF6F8FFFCFEFFF5F4FFFCFBFFF6F5FFFDFCFFF3 + F2FFFDFCFFF7F6FFFDFCFFF5F4FFFCFBFFF6F5FFFDFCFFF3F2FFFDFCFFF7F6FF + FDFCFFF5F4FFFDFBFFF6F5FFFEFCFFF3F2FFFEFCFFF7F6FFFEFCFFFDFCFFFEFC + FFF9F8FFFEFCFFF5F4FFFEFCFFF8F7FFFEFCFFFEFEFFFEFEFFFCFC1E00004918 + 1A3300005313133C00004401003D00004606053700004507073800004403053F + 00004504064302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000013E00 + 013D01023C00004001033C00004001033D00003E00013E00013F00023C000040 + 01033E00004201033F00004000014000004101003E00004202013E0000420201 + 3F00004000004000004101003E00004202013E00004202013F00004100003C00 + 004A07063A00004C0809480000470409300607290D0D1300002408082A000031 + 02041D00002108061C03002C100F2300002D0608270001330B0D2300002F0709 + 2A000232070A2600002E0608270001330B0D2200002C07092700022B090A1E00 + 002408071D0101290D0C190000250908200102280A091E00002608071F00012B + 0D0C1B0000270908210102280A091C00002408071D0101290D0C190000250908 + 1E0202260A091D01012105041900002A0E0D1900002D11101900002208081500 + 002B11111E00002500003703034D1112390000500F0E4300004201003E000040 + 02023C00004002023F00004000013D00003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100024000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013D00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100024000014000013F0000 + 4201033E00004201033E00004100024000004000013F00004201033E00004201 + 033E00004100024000004100004000004202023F00004500033E00003A010235 + 00033301033400023C0105380000390303330000360202350101370003380002 + 3B02053700013B02053700013A01043900033900033800023B02053700013B02 + 053500013A010437000335000334000037020533000037020533000036010435 + 0101350003340000370205330000370205330000380104350101350003340000 + 3702053300003702053300003601043501013500033400003702053300003702 + 053300003601043500033301033400023902053700003E02033C000041000240 + 00004100003F00004202023E00004201033E0000410002400001430204420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004403054201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033D00 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004302044201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033C00003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004504064302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000013D00003E00004000014302044000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100024000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100024000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100024000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E00004100024000014000013F0000 + 4201033E00004201033E00004100024000014000013F00004201033E00004201 + 033E00004100024000014000013F00004201033E00004201033E000041000240 + 00014000013F00004201033E00004201033E0000410002400001430204420103 + 4000013D00003F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023F00004403053A00004706083900004605073C00004100023F00 + 004403053A00004706083900004605073C00004100023F00004403053A000047 + 06083900004605073C00004100023F00004403053A0000470608390000460507 + 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 + 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E + 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 + 49080A3900004A090B3900004605073E00004403054201034000013D00003E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 + 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C + 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B + 3900004201033E00004706083900004C0B0D3900004A090B3900004201033D00 + 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E + 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 + 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B + 0D3900004706083E00004302044201034000013D00003E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033E00004605073900004A + 090B39000049080A3A00004201033E00004605073900004A090B39000049080A + 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 + 004605073900004A090B39000049080A3A00004201033C00003E000040000143 + 02044100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004100023C00004605073900004706083A00004403053F00004100023C0000 + 4605073900004706083A00004403053F00004100023C00004605073900004706 + 083A00004403053F00004100023C00004605073900004706083A00004403053F + 00004504064302044100023D00004000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000014000014100023E00004201033E0000420103 + 3F00004000014000014100023E00004201033E00004201033F00004000014000 + 014100023E00004201033E00004201033F00004000014000014100023E000042 + 01033E00004201033F00004000013D00003E0000400001430204} + end + object lblWelcome: TLabel + Left = 172 + Top = 10 + Width = 318 + Height = 50 + Caption = 'Welcome to the Metamod:Source (version) Setup Wizard' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -21 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + WordWrap = True + end + object lblInfo1: TLabel + Left = 172 + Top = 82 + Width = 331 + Height = 26 + Caption = + 'This wizard will guide you through the installation of Metamod:S' + + 'ource (version).' + WordWrap = True + end + object lblInfo2: TLabel + Left = 172 + Top = 120 + Width = 335 + Height = 39 + Caption = + 'It is recommended that you close all other applications before s' + + 'tarting a setup for e.g. Half-Life 2 or other games. Otherwise y' + + 'ou should restart your system after this installation.' + WordWrap = True + end + object lblInfo3: TLabel + Left = 172 + Top = 176 + Width = 108 + Height = 13 + Caption = 'Click Next to continue.' + end + end + object jspLicense: TJvStandardPage + Left = 0 + Top = 0 + Width = 527 + Height = 314 + object pnlLicense: TPanel + Left = 0 + Top = 0 + Width = 527 + Height = 49 + Align = alTop + BevelOuter = bvNone + Color = clWhite + TabOrder = 0 + object imgIcon1: TImage + Left = 486 + Top = 8 + Width = 32 + Height = 32 + Picture.Data = { + 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 + 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 + 74455874536F6674776172650041646F626520496D616765526561647971C965 + 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 + 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 + 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 + 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 + 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 + 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE + 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 + 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 + 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 + 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 + E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E + 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 + 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA + 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 + 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A + C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 + C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 + DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 + A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B + 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 + 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 + 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E + AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 + E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 + 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D + 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 + 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 + E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 + F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF + 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 + 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 + 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B + B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 + 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 + 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F + 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 + F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 + 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 + B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E + 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E + 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 + BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F + F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E + 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 + DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 + 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C + 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 + 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC + 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 + 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D + 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D + 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 + 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 + 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F + 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA + 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 + 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 + 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 + 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 + B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 + 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 + 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 + 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D + E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D + D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 + 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D + AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 + 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB + 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C + 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 + B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 + E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 + 4E44AE426082} + Stretch = True + Transparent = True + end + object lblTitle1: TLabel + Left = 12 + Top = 8 + Width = 116 + Height = 14 + Caption = 'License Agreement' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object lblSubTitle1: TLabel + Left = 22 + Top = 28 + Width = 408 + Height = 13 + Caption = + 'Please review the following license terms before installing Meta' + + 'mod:Source (version).' + end + object bvlSpacer1: TBevel + Left = 0 + Top = 46 + Width = 527 + Height = 3 + Align = alBottom + Shape = bsBottomLine + end + end + object freLicense: TmxFlatRichEdit + Left = 10 + Top = 62 + Width = 507 + Height = 207 + Lines.Strings = ( + 'The zlib/libpng License' + '' + 'Copyright (c) 2006, AlliedModders' + '' + + 'This software is provided '#39'as-is'#39', without any express or implie' + + 'd warranty. In no event will the ' + + 'authors be held liable for any damages arising from the use of t' + + 'his software.' + '' + + 'Permission is granted to anyone to use this software for any pur' + + 'pose, including commercial ' + + 'applications, and to alter it and redistribute it freely, subjec' + + 't to the following restrictions:' + '' + + ' 1. The origin of this software must not be misrepresented; y' + + 'ou must not claim that you wrote the ' + + 'original software. If you use this software in a product, an ack' + + 'nowledgment in the product ' + 'documentation would be appreciated but is not required.' + '' + + ' 2. Altered source versions must be plainly marked as such, a' + + 'nd must not be misrepresented as ' + 'being the original software.' + '' + + ' 3. This notice may not be removed or altered from any source' + + ' distribution.' + '') + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + Activate = True + BorderColor = clBtnShadow + Flat = True + ShowBorder = True + Version = '1.26' + end + object frbAgree: TFlatRadioButton + Left = 10 + Top = 274 + Width = 231 + Height = 17 + Caption = 'I accept the terms in the License Agreement' + TabOrder = 2 + OnClick = CheckNext + end + object ftbDontAgree: TFlatRadioButton + Left = 10 + Top = 290 + Width = 265 + Height = 17 + Caption = 'I do not accept the terms in the License Agreement' + Checked = True + TabOrder = 3 + TabStop = True + OnClick = CheckNext + end + end + object jspInstallMethod: TJvStandardPage + Left = 0 + Top = 0 + Width = 527 + Height = 314 + object lblInstallMethod: TLabel + Left = 124 + Top = 124 + Width = 144 + Height = 13 + Caption = 'Please select a install method:' + end + object pnlHeader2: TPanel + Left = 0 + Top = 0 + Width = 527 + Height = 49 + Align = alTop + BevelOuter = bvNone + Color = clWhite + TabOrder = 0 + object imgIcon2: TImage + Left = 486 + Top = 8 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 + 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 + 74455874536F6674776172650041646F626520496D616765526561647971C965 + 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 + 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 + 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 + 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 + 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 + 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE + 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 + 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 + 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 + 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 + E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E + 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 + 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA + 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 + 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A + C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 + C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 + DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 + A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B + 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 + 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 + 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E + AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 + E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 + 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D + 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 + 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 + E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 + F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF + 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 + 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 + 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B + B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 + 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 + 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F + 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 + F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 + 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 + B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E + 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E + 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 + BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F + F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E + 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 + DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 + 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C + 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 + 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC + 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 + 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D + 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D + 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 + 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 + 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F + 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA + 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 + 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 + 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 + 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 + B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 + 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 + 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 + 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D + E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D + D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 + 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D + AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 + 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB + 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C + 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 + B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 + E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 + 4E44AE426082} + Transparent = True + end + object lblTitle2: TLabel + Left = 12 + Top = 8 + Width = 137 + Height = 14 + Caption = 'Choose install method' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object lblSubTitle2: TLabel + Left = 22 + Top = 28 + Width = 263 + Height = 13 + Caption = 'Choose a install method for installing Metamod:Source.' + end + object bvlSpacer2: TBevel + Left = 0 + Top = 46 + Width = 527 + Height = 3 + Align = alBottom + Shape = bsBottomLine + end + end + object pnlInstallMethod: TPanel + Left = 122 + Top = 142 + Width = 267 + Height = 97 + BevelOuter = bvLowered + TabOrder = 1 + object frbDedicatedServer: TFlatRadioButton + Left = 4 + Top = 4 + Width = 135 + Height = 17 + Caption = 'Steam Dedicated Server' + Checked = True + TabOrder = 0 + TabStop = True + end + object frbListenServer: TFlatRadioButton + Left = 4 + Top = 22 + Width = 115 + Height = 17 + Caption = 'Steam Listen Server' + TabOrder = 1 + end + object frbSelectMod: TFlatRadioButton + Left = 4 + Top = 58 + Width = 117 + Height = 17 + Caption = 'Select mod directory' + TabOrder = 3 + end + object frbFTP: TFlatRadioButton + Left = 4 + Top = 76 + Width = 35 + Height = 17 + Caption = 'FTP' + TabOrder = 4 + end + object frbStandaloneServer: TFlatRadioButton + Left = 4 + Top = 40 + Width = 107 + Height = 17 + Caption = 'Standalone Server' + TabOrder = 2 + end + end + end + object jspSelectMod: TJvStandardPage + Left = 0 + Top = 0 + Width = 527 + Height = 314 + object lblInfo: TLabel + Left = 138 + Top = 114 + Width = 255 + Height = 26 + Caption = + 'The following mods were detected. Please select the mod you want' + + ' to install Metamod:Source to:' + WordWrap = True + end + object shpMods: TShape + Left = 136 + Top = 142 + Width = 255 + Height = 104 + Pen.Color = clBtnShadow + end + object pnlSelectMod: TPanel + Left = 0 + Top = 0 + Width = 527 + Height = 49 + Align = alTop + BevelOuter = bvNone + Color = clWhite + TabOrder = 0 + object imgIcon5: TImage + Left = 486 + Top = 8 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 + 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 + 74455874536F6674776172650041646F626520496D616765526561647971C965 + 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 + 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 + 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 + 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 + 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 + 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE + 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 + 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 + 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 + 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 + E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E + 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 + 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA + 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 + 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A + C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 + C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 + DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 + A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B + 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 + 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 + 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E + AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 + E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 + 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D + 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 + 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 + E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 + F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF + 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 + 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 + 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B + B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 + 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 + 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F + 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 + F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 + 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 + B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E + 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E + 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 + BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F + F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E + 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 + DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 + 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C + 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 + 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC + 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 + 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D + 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D + 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 + 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 + 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F + 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA + 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 + 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 + 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 + 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 + B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 + 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 + 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 + 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D + E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D + D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 + 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D + AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 + 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB + 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C + 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 + B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 + E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 + 4E44AE426082} + Stretch = True + Transparent = True + end + object lblSelectMod: TLabel + Left = 12 + Top = 8 + Width = 68 + Height = 14 + Caption = 'Select Mod' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object lblSelectModInfo: TLabel + Left = 22 + Top = 28 + Width = 332 + Height = 13 + Caption = + 'Please select the mod Metamod:Source (version) shall be installe' + + 'd to.' + end + object bvlSelectMod: TBevel + Left = 0 + Top = 46 + Width = 527 + Height = 3 + Align = alBottom + Shape = bsBottomLine + end + end + object trvMods: TTreeView + Left = 137 + Top = 143 + Width = 253 + Height = 102 + BorderStyle = bsNone + Indent = 19 + MultiSelectStyle = [] + ReadOnly = True + RightClickSelect = True + RowSelect = True + TabOrder = 1 + OnClick = trvModsClick + end + end + object jspFTP: TJvStandardPage + Left = 0 + Top = 0 + Width = 527 + Height = 314 + object lblStep1: TLabel + Left = 44 + Top = 56 + Width = 100 + Height = 13 + Caption = '1. Set your FTP data' + end + object lblStep2: TLabel + Left = 44 + Top = 146 + Width = 244 + Height = 13 + Caption = '2. Connect to server and select the mod directory:' + end + object lblStep4: TLabel + Left = 44 + Top = 296 + Width = 64 + Height = 13 + Caption = '4. Click Next.' + end + object lblStep3: TLabel + Left = 44 + Top = 252 + Width = 223 + Height = 13 + Caption = '3. Select the operating system of your server:' + end + object pnlHeader3: TPanel + Left = 0 + Top = 0 + Width = 527 + Height = 49 + Align = alTop + BevelOuter = bvNone + Color = clWhite + TabOrder = 0 + object imgIcon3: TImage + Left = 486 + Top = 8 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 + 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 + 74455874536F6674776172650041646F626520496D616765526561647971C965 + 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 + 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 + 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 + 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 + 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 + 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE + 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 + 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 + 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 + 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 + E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E + 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 + 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA + 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 + 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A + C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 + C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 + DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 + A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B + 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 + 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 + 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E + AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 + E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 + 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D + 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 + 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 + E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 + F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF + 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 + 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 + 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B + B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 + 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 + 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F + 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 + F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 + 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 + B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E + 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E + 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 + BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F + F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E + 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 + DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 + 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C + 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 + 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC + 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 + 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D + 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D + 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 + 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 + 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F + 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA + 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 + 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 + 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 + 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 + B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 + 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 + 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 + 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D + E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D + D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 + 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D + AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 + 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB + 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C + 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 + B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 + E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 + 4E44AE426082} + Transparent = True + end + object lblTitle3: TLabel + Left = 12 + Top = 8 + Width = 269 + Height = 14 + Caption = 'Installing Metamod:Source (version) via FTP' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object lblSubTitle3: TLabel + Left = 22 + Top = 28 + Width = 189 + Height = 13 + Caption = 'Do the following steps and press Next. ' + end + object bvlSpacer3: TBevel + Left = 0 + Top = 46 + Width = 527 + Height = 3 + Align = alBottom + Shape = bsBottomLine + end + end + object pnlFTPData: TPanel + Left = 44 + Top = 72 + Width = 441 + Height = 64 + BevelOuter = bvLowered + TabOrder = 1 + object lblHost: TLabel + Left = 4 + Top = 4 + Width = 26 + Height = 13 + Caption = 'Host:' + end + object lblUserName: TLabel + Left = 180 + Top = 6 + Width = 52 + Height = 13 + Caption = 'Username:' + end + object lblPassword: TLabel + Left = 308 + Top = 4 + Width = 50 + Height = 13 + Caption = 'Password:' + end + object lblPort: TLabel + Left = 132 + Top = 4 + Width = 24 + Height = 13 + Caption = 'Port:' + end + object txtHost: TFlatEdit + Left = 4 + Top = 20 + Width = 121 + Height = 19 + ColorFlat = clBtnFace + ParentColor = True + TabOrder = 0 + end + object txtUserName: TFlatEdit + Left = 180 + Top = 20 + Width = 121 + Height = 19 + ColorFlat = clBtnFace + ParentColor = True + TabOrder = 2 + end + object txtPassword: TFlatEdit + Left = 308 + Top = 20 + Width = 127 + Height = 19 + ColorFlat = clBtnFace + ParentColor = True + PasswordChar = '*' + TabOrder = 3 + end + object txtPort: TFlatEdit + Left = 132 + Top = 20 + Width = 43 + Height = 19 + ColorFlat = clBtnFace + ParentColor = True + MaxLength = 5 + TabOrder = 1 + Text = '21' + OnChange = txtPortChange + end + object chkPassive: TFlatCheckBox + Left = 4 + Top = 44 + Width = 139 + Height = 16 + Caption = 'Use PASV (Passive) Mode' + Checked = True + TabOrder = 4 + TabStop = True + end + object cmdProxySettings: TFlatButton + Left = 350 + Top = 42 + Width = 83 + Height = 18 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorHighLight = 8623776 + ColorShadow = 8623776 + Caption = 'Proxy-Settings' + TabOrder = 5 + OnClick = cmdProxySettingsClick + end + end + object cmdConnect: TFlatButton + Left = 416 + Top = 161 + Width = 71 + Height = 20 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorBorder = clBtnShadow + ColorHighLight = clBtnShadow + ColorShadow = clBtnShadow + Caption = 'Connect' + TabOrder = 3 + OnClick = cmdConnectClick + end + object pnlDirectory: TPanel + Left = 44 + Top = 162 + Width = 367 + Height = 83 + BevelOuter = bvLowered + TabOrder = 2 + object trvDirectories: TTreeView + Left = 1 + Top = 1 + Width = 365 + Height = 81 + Align = alClient + BorderStyle = bsNone + Images = ilImages + Indent = 19 + TabOrder = 0 + OnChange = trvDirectoriesChange + OnCollapsing = trvDirectoriesCollapsing + OnExpanding = trvDirectoriesExpanding + OnExpanded = trvDirectoriesExpanded + OnMouseDown = trvDirectoriesMouseDown + end + end + object pnlOS: TPanel + Left = 44 + Top = 268 + Width = 441 + Height = 21 + BevelOuter = bvLowered + TabOrder = 4 + object optWindows: TFlatRadioButton + Left = 1 + Top = 3 + Width = 62 + Height = 14 + Caption = 'Windows' + Checked = True + TabOrder = 0 + TabStop = True + end + object optLinux: TFlatRadioButton + Left = 173 + Top = 3 + Width = 82 + Height = 14 + Caption = 'Linux (32-bit)' + TabOrder = 1 + end + object FlatRadioButton1: TFlatRadioButton + Left = 353 + Top = 3 + Width = 82 + Height = 14 + Caption = 'Linux (64-bit)' + Enabled = False + TabOrder = 2 + end + end + end + object jspInstallProgress: TJvStandardPage + Left = 0 + Top = 0 + Width = 527 + Height = 314 + Caption = 'jspInstallProgress' + object ggeAll: TFlatGauge + Left = 8 + Top = 84 + Width = 509 + Height = 24 + AdvColorBorder = 0 + Color = clBtnFace + ColorBorder = 8623776 + MaxValue = 8 + Progress = 0 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -9 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + end + object lblProgress: TLabel + Left = 8 + Top = 66 + Width = 46 + Height = 13 + Caption = 'Progress:' + end + object ggeItem: TFlatGauge + Left = 8 + Top = 112 + Width = 509 + Height = 24 + AdvColorBorder = 0 + Color = clBtnFace + ColorBorder = 8623776 + Progress = 0 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -9 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + end + object lblDetails: TLabel + Left = 10 + Top = 152 + Width = 36 + Height = 13 + Caption = 'Details:' + end + object bvlSpace2: TBevel + Left = 4 + Top = 142 + Width = 519 + Height = 3 + Shape = bsTopLine + end + object pnlHeader5: TPanel + Left = 0 + Top = 0 + Width = 527 + Height = 49 + Align = alTop + BevelOuter = bvNone + Color = clWhite + TabOrder = 0 + object imgIcon4: TImage + Left = 486 + Top = 8 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 + 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 + 74455874536F6674776172650041646F626520496D616765526561647971C965 + 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 + 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 + 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 + 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 + 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 + 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE + 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 + 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 + 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 + 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 + E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E + 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 + 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA + 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 + 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A + C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 + C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 + DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 + A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B + 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 + 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 + 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E + AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 + E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 + 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D + 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 + 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 + E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 + F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF + 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 + 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 + 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B + B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 + 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 + 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F + 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 + F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 + 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 + B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E + 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E + 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 + BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F + F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E + 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 + DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 + 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C + 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 + 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC + 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 + 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D + 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D + 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 + 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 + 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F + 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA + 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 + 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 + 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 + 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 + B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 + 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 + 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 + 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D + E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D + D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 + 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D + AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 + 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB + 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C + 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 + B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 + E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 + 4E44AE426082} + Transparent = True + end + object lblTitle5: TLabel + Left = 12 + Top = 8 + Width = 223 + Height = 14 + Caption = 'Installing Metamod:Source (version)' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object lblSubTitle5: TLabel + Left = 22 + Top = 28 + Width = 296 + Height = 13 + Caption = 'Please wait while Metamod:Source (version) is being installed.' + end + object bvlSpacer5: TBevel + Left = 0 + Top = 46 + Width = 527 + Height = 3 + Align = alBottom + Shape = bsBottomLine + end + end + object rtfDetails: TmxFlatRichEdit + Left = 8 + Top = 166 + Width = 509 + Height = 139 + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + Activate = True + BorderColor = clBtnShadow + Flat = True + ShowBorder = True + Version = '1.26' + end + end + end + object pnlButtons: TPanel + Left = 0 + Top = 317 + Width = 527 + Height = 38 + Align = alBottom + BevelOuter = bvNone + TabOrder = 1 + object cmdNext: TFlatButton + Left = 438 + Top = 7 + Width = 85 + Height = 25 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorBorder = clBtnShadow + ColorHighLight = clBtnShadow + ColorShadow = clBtnShadow + Caption = '&Next >' + TabOrder = 0 + OnClick = cmdNextClick + end + object cmdCancel: TFlatButton + Left = 4 + Top = 7 + Width = 85 + Height = 25 + Color = clBtnFace + ColorFocused = 16245198 + ColorDown = 16245198 + ColorBorder = clBtnShadow + ColorHighLight = clBtnShadow + ColorShadow = clBtnShadow + Caption = '&Cancel' + ParentColor = False + TabOrder = 1 + OnClick = cmdCancelClick + end + object cmdBack: TFlatButton + Left = 348 + Top = 7 + Width = 85 + Height = 25 + ColorFocused = 16245198 + ColorDown = 16245198 + ColorBorder = clBtnShadow + ColorHighLight = clBtnShadow + ColorShadow = clBtnShadow + Caption = '< &Back' + TabOrder = 2 + Visible = False + OnClick = cmdBackClick + end + end + object ilImages: TImageList + Left = 154 + Top = 324 + Bitmap = { + 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 00000000000000000000000000000000000000000000008CBD00008CBD00008C + BD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C + BD00008CBD00008CBD00000000000000000000000000008CBD00008CBD00008C + BD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C + BD00008CBD000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000008CBD0063CEF700008CBD00A5F7 + FF0063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CE + F70039ADDE00ADF7FF00008CBD0000000000008CBD0021A5CE005ACEEF0084E7 + FF0063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CE + F70039ADDE001094C60000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000008CBD006BD6F700008CBD00ADF7 + FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6 + FF0039ADDE00BDEFF700008CBD0000000000008CBD004ABDE70031ADD60094EF + FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6 + FF0039B5DE00CEF7FF00008CBD00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000008CBD0073D6FF00008CBD00ADF7 + FF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDE + FF0042B5DE00BDEFF700008CBD0000000000008CBD0073D6FF00008CBD00ADFF + FF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDE + FF0042B5DE00CEF7FF00008CBD00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000008CBD007BDEFF00008CBD00B5F7 + FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7 + FF0042B5DE00C6F7F700008CBD0000000000008CBD007BDEFF001094C60094EF + FF0094EFFF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7 + FF004ABDE700CEF7FF001094C600000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000008CBD0084E7FF00008CBD00BDF7 + FF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEF + FF004ABDE700BDF7FF00008CBD0000000000008CBD0084E7FF0042B5DE005AC6 + EF00ADFFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEF + FF004ABDE700CEF7FF00CEF7FF00008CBD000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000008CBD008CEFFF00008CBD00D6F7 + FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7 + FF00BDDEDE00D6F7FF00008CBD0000000000008CBD008CE7FF007BDEFF0021A5 + CE00E7FFFF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7 + FF0094EFFF00E7FFFF00CEF7FF00008CBD000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000008CBD0094F7FF00008CBD00008C + BD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C + BD00008CBD00008CBD00008CBD0000000000008CBD0094F7FF0094F7FF001094 + C600008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C + BD00008CBD00008CBD00008CBD00008CBD000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000008CBD009CF7FF009CF7FF009CF7 + FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7 + FF00008CBD00000000000000000000000000008CBD009CF7FF009CF7FF009CF7 + FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7 + FF00088CBD000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000008CBD00D6F7FF00A5F7FF00A5F7 + FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7 + FF00008CBD00000000000000000000000000008CBD00E7FFFF00A5FFFF00A5FF + FF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FF + FF00088CBD000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000008CBD00D6F7FF00A5F7 + FF00A5F7FF00A5F7FF00008CBD00008CBD00008CBD00008CBD00008CBD00008C + BD000000000000000000000000000000000000000000008CBD00E7FFFF00A5FF + FF00A5FFFF00A5FFFF00008CBD00008CBD00008CBD00008CBD00008CBD00008C + BD00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008CBD00008C + BD00008CBD00008CBD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008CBD00008C + BD00008CBD00008CBD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF0080038007000000000001000300000000 + 0001000100000000000100010000000000010001000000000001000000000000 + 0001000000000000000100000000000000070007000000000007000700000000 + 800F800F00000000C3FFC3FF00000000FFFFFFFF00000000FFFFFFFF00000000 + FFFFFFFF00000000FFFFFFFF0000000000000000000000000000000000000000 + 000000000000} + end + object IdFTP: TIdFTP + Intercept = IdLogFile + MaxLineAction = maException + ReadTimeout = 0 + RecvBufferSize = 1024 + SendBufferSize = 1024 + OnWork = IdFTPWork + ProxySettings.ProxyType = fpcmNone + ProxySettings.Port = 0 + Left = 274 + Top = 324 + end + object IdAntiFreeze: TIdAntiFreeze + IdleTimeOut = 150 + Left = 244 + Top = 324 + end + object tmrSpeed: TTimer + Enabled = False + OnTimer = tmrSpeedTimer + Left = 214 + Top = 324 + end + object IdLogFile: TIdLogFile + LogTime = False + Left = 184 + Top = 324 + end +end diff --git a/installer/UnitfrmMain.pas b/installer/UnitfrmMain.pas new file mode 100644 index 0000000..aee1c93 --- /dev/null +++ b/installer/UnitfrmMain.pas @@ -0,0 +1,730 @@ +unit UnitfrmMain; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, TFlatRadioButtonUnit, StdCtrls, ComCtrls, mxFlatControls, JvPageList, + ExtCtrls, JvExControls, JvComponent, TFlatButtonUnit, jpeg, TFlatEditUnit, + TFlatGaugeUnit, ImgList, FileCtrl, Registry, CheckLst, TFlatComboBoxUnit, + TFlatCheckBoxUnit, IdBaseComponent, IdComponent, IdTCPConnection, + IdTCPClient, IdFTP, IdException, IdAntiFreezeBase, IdAntiFreeze, + IdIntercept, IdLogBase, IdLogFile, pngimage; + +type + TfrmMain = class(TForm) + jplWizard: TJvPageList; + jspWelcome: TJvStandardPage; + pnlButtons: TPanel; + bvlSpace: TBevel; + cmdNext: TFlatButton; + cmdCancel: TFlatButton; + imgInstall: TImage; + lblWelcome: TLabel; + lblInfo1: TLabel; + lblInfo2: TLabel; + lblInfo3: TLabel; + jspLicense: TJvStandardPage; + pnlLicense: TPanel; + imgIcon1: TImage; + lblTitle1: TLabel; + lblSubTitle1: TLabel; + freLicense: TmxFlatRichEdit; + frbAgree: TFlatRadioButton; + ftbDontAgree: TFlatRadioButton; + jspInstallMethod: TJvStandardPage; + pnlHeader2: TPanel; + imgIcon2: TImage; + lblTitle2: TLabel; + lblSubTitle2: TLabel; + lblInstallMethod: TLabel; + pnlInstallMethod: TPanel; + frbDedicatedServer: TFlatRadioButton; + frbListenServer: TFlatRadioButton; + frbSelectMod: TFlatRadioButton; + frbFTP: TFlatRadioButton; + cmdBack: TFlatButton; + jspFTP: TJvStandardPage; + pnlHeader3: TPanel; + imgIcon3: TImage; + lblTitle3: TLabel; + lblSubTitle3: TLabel; + lblStep1: TLabel; + pnlFTPData: TPanel; + lblHost: TLabel; + txtHost: TFlatEdit; + lblUserName: TLabel; + txtUserName: TFlatEdit; + txtPassword: TFlatEdit; + lblPassword: TLabel; + txtPort: TFlatEdit; + lblPort: TLabel; + lblStep2: TLabel; + cmdConnect: TFlatButton; + pnlDirectory: TPanel; + trvDirectories: TTreeView; + lblStep4: TLabel; + jspInstallProgress: TJvStandardPage; + pnlHeader5: TPanel; + imgIcon4: TImage; + lblTitle5: TLabel; + lblSubTitle5: TLabel; + ggeAll: TFlatGauge; + lblProgress: TLabel; + ggeItem: TFlatGauge; + rtfDetails: TmxFlatRichEdit; + lblDetails: TLabel; + bvlSpace2: TBevel; + ilImages: TImageList; + bvlSpacer1: TBevel; + bvlSpacer2: TBevel; + bvlSpacer3: TBevel; + bvlSpacer5: TBevel; + jspSelectMod: TJvStandardPage; + pnlSelectMod: TPanel; + imgIcon5: TImage; + lblSelectMod: TLabel; + lblSelectModInfo: TLabel; + bvlSelectMod: TBevel; + lblInfo: TLabel; + chkPassive: TFlatCheckBox; + lblStep3: TLabel; + pnlOS: TPanel; + optWindows: TFlatRadioButton; + optLinux: TFlatRadioButton; + IdFTP: TIdFTP; + cmdProxySettings: TFlatButton; + IdAntiFreeze: TIdAntiFreeze; + frbStandaloneServer: TFlatRadioButton; + tmrSpeed: TTimer; + IdLogFile: TIdLogFile; + shpMods: TShape; + trvMods: TTreeView; + FlatRadioButton1: TFlatRadioButton; + procedure jvwStepsCancelButtonClick(Sender: TObject); + procedure cmdCancelClick(Sender: TObject); + procedure cmdNextClick(Sender: TObject); + procedure CheckNext(Sender: TObject); + procedure cmdBackClick(Sender: TObject); + procedure cmdConnectClick(Sender: TObject); + procedure jplWizardChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure cmdProxySettingsClick(Sender: TObject); + procedure txtPortChange(Sender: TObject); + procedure trvDirectoriesExpanded(Sender: TObject; Node: TTreeNode); + procedure trvDirectoriesChange(Sender: TObject; Node: TTreeNode); + procedure IdFTPWork(Sender: TObject; AWorkMode: TWorkMode; + const AWorkCount: Integer); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure tmrSpeedTimer(Sender: TObject); + procedure trvDirectoriesExpanding(Sender: TObject; Node: TTreeNode; + var AllowExpansion: Boolean); + procedure trvDirectoriesCollapsing(Sender: TObject; Node: TTreeNode; + var AllowCollapse: Boolean); + procedure trvModsClick(Sender: TObject); + procedure trvDirectoriesMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + private + OldProgress: Integer; + CurrProgress: Integer; + public + procedure ExceptionHandler(Sender: TObject; E: Exception); + end; + +var + frmMain: TfrmMain; + +var VERSION: String = ''; + +implementation + +uses UnitFunctions, UnitfrmProxy, UnitInstall, UnitSelectModPath; + +{$R *.dfm} + +procedure TfrmMain.jvwStepsCancelButtonClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmMain.cmdCancelClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmMain.cmdNextClick(Sender: TObject); +var ePath: String; + eRegistry: TRegistry; + eStr: TStringList; + CurNode: TTreeNode; + eOS: TOS; + i: integer; +begin + { FTP } + if jplWizard.ActivePage = jspFTP then begin + if not IdFTP.Connected then + IdFTP.Connect; + eStr := TStringList.Create; + ePath := '/'; + CurNode := trvDirectories.Selected; + if (Assigned(CurNode)) then begin + repeat + ePath := '/' + CurNode.Text + ePath; + CurNode := CurNode.Parent; + until (not Assigned(CurNode)); + end; + IdFTP.ChangeDir(ePath); + IdFTP.List(eStr, '', False); + if eStr.IndexOf('gameinfo.txt') = -1 then begin + MessageBox(Handle, 'Invalid directory. Please select your mod directory and try again.', PChar(Application.Title), MB_ICONWARNING); + eStr.Free; + exit; + end + else + eStr.Free; + + // design stuff + trvDirectories.Enabled := False; + cmdConnect.Enabled := False; + optWindows.Enabled := False; + optLinux.Enabled := False; + Screen.Cursor := crHourGlass; + + if optWindows.Checked then + eOS := osWindows + else + eOS := osLinux; + + jspInstallProgress.Show; + // installation + Screen.Cursor := crAppStart; + InstallFTP(eOS); + end + else if jplWizard.ActivePage = jspInstallProgress then + Close + else if jplWizard.ActivePage = jspSelectMod then begin + { Dedicated Server } + if (frbDedicatedServer.Checked) or (frbStandaloneServer.Checked) then begin + ePath := trvMods.Selected.Text; + if ePath = 'Counter-Strike:Source' then + ePath := 'cstrike' + else if ePath = 'Day of Defeat:Source' then + ePath := 'dod' + else + ePath := 'hl2mp'; + ePath := 'SteamApps\' + trvMods.Selected.Parent.Text + '\source dedicated server\' + ePath; + // install it + if frbDedicatedServer.Checked then begin + if DirectoryExists(SteamPath + ePath) then begin + jspInstallProgress.Show; + InstallDedicated(IncludeTrailingPathDelimiter(SteamPath + ePath), True); + end + else begin + MessageBox(Handle, 'Error: The directory of the mod you selected doesn''t exist any more. Run Dedicated Server with the chosen mod and try again.', PChar(Application.Title), MB_ICONERROR); + jspSelectMod.Show; + exit; + end; + end + else begin + if DirectoryExists(StandaloneServer + ePath) then begin + jspInstallProgress.Show; + InstallDedicated(IncludeTrailingPathDelimiter(StandaloneServer + ePath), False) + end + else begin + MessageBox(Handle, 'Error: The directory of the mod you selected doesn''t exist (any more). Run Half-Life Dedicated Server with the chosen mod again and restart.', PChar(Application.Title), MB_ICONERROR); + jspSelectMod.Show; + exit; + end; + end; + end; + { Listen Server } + if frbListenServer.Checked then begin + ePath := trvMods.Selected.Text; + if ePath = 'Counter-Strike:Source' then + ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\counter-strike source\cstrike' + else if ePath = 'Half-Life 2 Deathmatch' then + ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\half-life 2 deathmatch\hl2mp' + else + ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\day of defeat source\dod'; + + if Pos(SteamPath, ePath) = 0 then + MessageBox(Handle, 'An error occured. Please report this bug to the Metamod:Source team and post a new thread on the forums of www.amxmodx.org.', PChar(Application.Title), MB_ICONSTOP) + else begin + if not FileExists(ePath + '\gameinfo.txt') then begin + MessageBox(Handle, 'You have to play this game once before installing Metamod:Source. Do that and try again.', PChar(Application.Title), MB_ICONWARNING); + exit; + end; + + jspInstallProgress.Show; + InstallListen(IncludeTrailingPathDelimiter(ePath)); + end; + end; + { Custom mod below } + end + else if jplWizard.ActivePage <> jspInstallMethod then + jplWizard.NextPage + else begin + if frbDedicatedServer.Checked then begin // Dedicated Server + eRegistry := TRegistry.Create(KEY_READ); + try + eRegistry.RootKey := HKEY_CURRENT_USER; + if eRegistry.OpenKey('Software\Valve\Steam', False) then begin + ePath := eRegistry.ReadString('SteamPath'); + ePath := IncludeTrailingPathDelimiter(StringReplace(ePath, '/', '\', [rfReplaceAll])); + SteamPath := ePath; + + ePath := ePath + 'SteamApps\'; + if DirectoryExists(ePath) then begin + trvMods.Items.Clear; + // Check Mods + eStr := GetAllFiles(ePath + '*.*', faDirectory, False, True, False); + for i := 0 to eStr.Count -1 do begin + CurNode := trvMods.Items.Add(nil, eStr[i]); + + if DirectoryExists(ePath + eStr[i] + '\source dedicated server\cstrike') then + trvMods.Items.AddChild(CurNode, 'Counter-Strike:Source'); + if DirectoryExists(ePath + eStr[i] + '\source dedicated server\dod') then + trvMods.Items.AddChild(CurNode, 'Day of Defeat:Source'); + if DirectoryExists(ePath + eStr[i] + '\source dedicated server\hl2mp') then + trvMods.Items.AddChild(CurNode, 'Half-Life 2 Deatmatch'); + + if CurNode.Count = 0 then + CurNode.Free + else + CurNode.Expand(False); + end; + // Misc + jspSelectMod.Show; + trvMods.Selected := nil; + cmdNext.Enabled := False; + end + else + MessageBox(Handle, 'You have to run Dedicated Server once before installing Metamod:Source!', 'Error', MB_ICONWARNING); + end + else + MessageBox(Handle, 'You haven''t installed Steam yet! Download it at www.steampowered.com, install Dedicated Server and try again.', 'Error', MB_ICONWARNING); + finally + eRegistry.Free; + end; + end + else if frbListenServer.Checked then begin // Listen Server + eRegistry := TRegistry.Create(KEY_READ); + try + eRegistry.RootKey := HKEY_CURRENT_USER; + if eRegistry.OpenKey('Software\Valve\Steam', False) then begin + ePath := eRegistry.ReadString('SteamPath'); + ePath := IncludeTrailingPathDelimiter(StringReplace(ePath, '/', '\', [rfReplaceAll])); + SteamPath := ePath; + + ePath := ePath + 'SteamApps\'; + if DirectoryExists(ePath) then begin + trvMods.Items.Clear; + // Check Mods + eStr := GetAllFiles(ePath + '*.*', faDirectory, False, True, False); + for i := 0 to eStr.Count -1 do begin + CurNode := trvMods.Items.Add(nil, eStr[i]); + + if DirectoryExists(ePath + eStr[i] + '\counter-strike source') then + trvMods.Items.AddChild(CurNode, 'Counter-Strike:Source'); + if DirectoryExists(ePath + eStr[i] + '\day of defeat source') then + trvMods.Items.AddChild(CurNode, 'Day of Defeat:Source'); + if DirectoryExists(ePath + eStr[i] + '\half-life 2 deathmatch') then + trvMods.Items.AddChild(CurNode, 'Half-Life 2 Deatmatch'); + + if CurNode.Count = 0 then + CurNode.Free + else + CurNode.Expand(False); + end; + // Misc + jspSelectMod.Show; + trvMods.Selected := nil; + cmdNext.Enabled := False; + end + else + MessageBox(Handle, 'You haven''t installed Steam yet! Download it at www.steampowered.com, install Dedicated Server and try again.', 'Error', MB_ICONWARNING); + end + else + MessageBox(Handle, 'You haven''t installed Steam yet! Download it at www.steampowered.com, install Dedicated Server and try again.', 'Error', MB_ICONWARNING); + finally + eRegistry.Free; + end; + end + else if frbStandaloneServer.Checked then begin // Standalone Server + eRegistry := TRegistry.Create; + try + eRegistry.RootKey := HKEY_CURRENT_USER; + if eRegistry.OpenKey('Software\Valve\HLServer', False) then begin + StandaloneServer := IncludeTrailingPathDelimiter(eRegistry.ReadString('InstallPath')); + if DirectoryExists(StandaloneServer + 'cstrike') then + trvMods.Items.Add(nil, 'Counter-Strike:Source'); + if DirectoryExists(StandaloneServer + 'dod') then + trvMods.Items.Add(nil, 'Day of Defeat:Source'); + if DirectoryExists(StandaloneServer + 'hl2mp') then + trvMods.Items.Add(nil, 'Half-Life 2 Deatmatch'); + jspSelectMod.Show; + cmdNext.Enabled := False; + end + else + MessageBox(Handle, 'You haven''t installed Half-Life Dedicated Server yet!', 'Error', MB_ICONWARNING); + finally + eRegistry.Free; + end; + end + else if frbSelectMod.Checked then begin + { Custom mod } + if frmSelectModPath.ShowModal = mrOk then begin + jspInstallProgress.Show; + InstallCustom(IncludeTrailingPathDelimiter(frmSelectModPath.trvDirectory.SelectedFolder.PathName), osWindows); + end; + end + else if frbFTP.Checked then // FTP + jspFTP.Show; + end; +end; + +procedure TfrmMain.CheckNext(Sender: TObject); +begin + cmdNext.Enabled := frbAgree.Checked; +end; + +procedure TfrmMain.cmdBackClick(Sender: TObject); +begin + if jplWizard.ActivePage = jspFTP then + jspInstallMethod.Show + else begin + jplWizard.PrevPage; + cmdBack.Visible := jplWizard.ActivePageIndex <> 0; + end; +end; + +procedure TfrmMain.cmdConnectClick(Sender: TObject); +var i: integer; + eStr: TStringList; + CurNode: TTreeNode; + Path: String; +begin + if (Trim(txtHost.Text) = '') or (Trim(txtUsername.Text) = '') then + MessageBox(Handle, 'Please fill in each field!', PChar(Application.Title), MB_ICONWARNING) + else if cmdConnect.Caption = 'Connect' then begin + // ... design stuff ... + Screen.Cursor := crHourGlass; + cmdConnect.Enabled := False; + cmdProxySettings.Enabled := False; + txtHost.Enabled := False; + txtPort.Enabled := False; + txtUsername.Enabled := False; + txtPassword.Enabled := False; + chkPassive.Enabled := False; + cmdConnect.Caption := 'Connecting...'; + // ... set values ... + IdFTP.Host := txtHost.Text; + IdFTP.Port := StrToInt(txtPort.Text); + IdFTP.Username := txtUsername.Text; + IdFTP.Passive := chkPassive.Checked; + IdFTP.Password := txtPassword.Text; + // ... connect and check values etc ... + try + IdFTP.Connect(True, 15000); + // ... get initial directory ... + Path := IdFTP.RetrieveCurrentDir; + // ... "fix" path ... + eStr := TStringList.Create; + eStr.Text := StringReplace(Path, '/', #13, [rfReplaceAll]); + for i := eStr.Count -1 downto 0 do begin + if eStr[i] = '' then + eStr.Delete(i); + end; + if (Copy(Path, Length(Path) -1, 1) <> '/') then + Path := Path + '/'; + // ... connect successful, change captions ... + trvDirectories.Enabled := True; + cmdConnect.Enabled := True; + cmdConnect.Caption := 'Disconnect'; + // ... change to / and create all the directories ... + CurNode := nil; + if (Path <> '/') then begin + try + IdFTP.ChangeDir('/'); + with GetAllDirs do begin + for i := 0 to Count -1 do begin + if (Assigned(CurNode)) then + trvDirectories.Items.AddChild(trvDirectories.Items.Add(nil, Strings[i]), 'Scanning...') + else begin + CurNode := trvDirectories.Items.Add(nil, Strings[i]); + trvDirectories.Items.AddChild(CurNode, 'Scanning...'); + if (Pos('/' + CurNode.Text + '/', Path) = 0) then + CurNode := nil; + end + end; + Free; + end; + IdFTP.ChangeDir(Path); + except + if (IdFTP.Connected) then + IdFTP.ChangeDir(Path) + else + IdFTP.Connect; + end; + end; + // ... find directories in start path ... + if eStr.Count <> 0 then begin + for i := 0 to eStr.Count -1 do begin + if (not ((i = 0) and (Assigned(CurNode)))) then + CurNode := trvDirectories.Items.AddChild(CurNode, eStr[i]); + end; + end; + trvDirectories.Selected := CurNode; + eStr.Free; + // ... scan for directories ... + with GetAllDirs do begin + for i := 0 to Count -1 do + trvDirectories.Items.AddChild(trvDirectories.Items.AddChild(CurNode, Strings[i]), 'Scanning...'); + Free; + end; + + if Assigned(CurNode) then + CurNode.Expand(False); + except + on E: Exception do begin + // reset button properties + cmdConnect.Enabled := True; + txtHost.Enabled := True; + txtPort.Enabled := True; + txtUsername.Enabled := True; + txtPassword.Enabled := True; + chkPassive.Enabled := True; + cmdProxySettings.Enabled := True; + cmdNext.Enabled := False; + cmdConnect.Caption := 'Connect'; + // analyze messages + if Pos('Login incorrect.', E.Message) <> 0 then begin // login failed + MessageBox(Handle, 'Login incorrect. Check your FTP settings and try again.', PChar(Application.Title), MB_ICONWARNING); + txtUsername.SetFocus; + txtUsername.SelectAll; + end + else if Pos('Host not found.', E.Message) <> 0 then begin // host not found + MessageBox(Handle, 'The entered host couldn''t be found. Check your settings and try again.', PChar(Application.Title), MB_ICONWARNING); + txtHost.SetFocus; + txtHost.SelectAll; + end + else if Pos('Connection refused.', E.Message) <> 0 then begin // wrong port (?) + MessageBox(Handle, 'The host refused the connection. Check your port and try again.', PChar(Application.Title), MB_ICONWARNING); + txtPort.SetFocus; + txtPort.SelectAll; + end + else if E is EIdProtocolReplyError then begin // wrong port + MessageBox(Handle, 'The port you entered is definitely wrong. Check it and try again.', PChar(Application.Title), MB_ICONWARNING); + txtPort.SetFocus; + txtPort.SelectAll; + end + else + MessageBox(Handle, PChar(E.Message), PChar(Application.Title), MB_ICONWARNING); // unknown error + // ... connect failed, leave procedure ... + Screen.Cursor := crDefault; + exit; + end; + end; + + Screen.Cursor := crDefault; + end + else begin + Screen.Cursor := crHourGlass; + IdFTP.Quit; + trvDirectories.Items.Clear; + trvDirectories.Enabled := False; + cmdConnect.Enabled := True; + cmdProxySettings.Enabled := True; + txtHost.Enabled := True; + txtPort.Enabled := True; + txtUsername.Enabled := True; + txtPassword.Enabled := True; + chkPassive.Enabled := True; + cmdConnect.Caption := 'Connect'; + cmdNext.Enabled := False; + Screen.Cursor := crDefault; + end; +end; + +procedure TfrmMain.jplWizardChange(Sender: TObject); +begin + if (jplWizard.ActivePage = jspInstallProgress) then begin + cmdNext.Caption := '&Finish'; + cmdNext.Enabled := False; + cmdBack.Visible := False; + end + else begin + cmdNext.Caption := '&Next >'; + cmdNext.Enabled := True; + cmdBack.Visible := jplWizard.ActivePageIndex <> 0; + end; + + if (jplWizard.ActivePage = jspLicense) then + cmdNext.Enabled := frbAgree.Checked; + + if (jplWizard.ActivePage = jspFTP) then + cmdNext.Enabled := False; +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + if LowerCase(ParamStr(1)) = '-logftp' then begin + MessageBox(Handle, 'FTP installation will be logged to FTP.log!', PChar(Application.Title), MB_ICONINFORMATION); + IdLogFile.Filename := ExtractFilePath(ParamStr(0)) + 'FTP.log'; + IdLogFile.Active := True; + end; + + rtfDetails.Clear; +end; + +procedure TfrmMain.cmdProxySettingsClick(Sender: TObject); +begin + frmProxy.ShowModal; + // Apply Proxy Settings + case frmProxy.cboProxy.ItemIndex of + 0: IdFTP.ProxySettings.ProxyType := fpcmNone; // none + 1: IdFTP.ProxySettings.ProxyType := fpcmHttpProxyWithFtp; // HTTP Proxy with FTP + 2: IdFTP.ProxySettings.ProxyType := fpcmOpen; // Open + 3: IdFTP.ProxySettings.ProxyType := fpcmSite; // Site + 4: IdFTP.ProxySettings.ProxyType := fpcmTransparent; // Transparent + 5: IdFTP.ProxySettings.ProxyType := fpcmUserPass; // User (Password) + 6: IdFTP.ProxySettings.ProxyType := fpcmUserSite; // User (Site) + end; + + IdFTP.ProxySettings.Host := frmProxy.txtHost.Text; + IdFTP.ProxySettings.UserName := frmProxy.txtPort.Text; + IdFTP.ProxySettings.Password := frmProxy.txtPassword.Text; + IdFTP.ProxySettings.Port := StrToInt(frmProxy.txtPort.Text); +end; + +procedure TfrmMain.txtPortChange(Sender: TObject); +var i: integer; +begin + if txtPort.Text = '' then + txtPort.Text := '21' + else begin + // check if value is numeric... + for i := Length(txtPort.Text) downto 1 do begin + if Pos(txtPort.Text[i], '0123456789') = 0 then begin + txtPort.Text := '21'; + txtPort.SelStart := 4; + exit; + end; + end; + end; +end; + +procedure TfrmMain.trvDirectoriesExpanded(Sender: TObject; + Node: TTreeNode); +var ePath: String; + CurNode: TTreeNode; + i: integer; +begin + if Node.Item[0].Text = 'Scanning...' then begin // no directories added yet + Screen.Cursor := crHourGlass; + // get complete path + ePath := '/'; + CurNode := Node; + repeat + ePath := '/' + CurNode.Text + ePath; + CurNode := CurNode.Parent; + until (not Assigned(CurNode)); + // change dir and add directories in it + try + Repaint; + IdFTP.ChangeDir(ePath); + with GetAllDirs do begin + Node.Item[0].Free; + for i := 0 to Count -1 do begin + trvDirectories.Items.AddChild(trvDirectories.Items.AddChild(Node, Strings[i]), 'Scanning...'); + end; + Free; + end; + finally + Application.ProcessMessages; + end; + Screen.Cursor := crDefault; + end; +end; + +procedure TfrmMain.trvDirectoriesChange(Sender: TObject; Node: TTreeNode); +begin + cmdNext.Enabled := Assigned(trvDirectories.Selected); +end; + +procedure TfrmMain.IdFTPWork(Sender: TObject; AWorkMode: TWorkMode; + const AWorkCount: Integer); +begin + if AWorkCount > 15 then begin + ggeItem.Progress := AWorkCount; + CurrProgress := AWorkCount; + end; + + if Cancel then + IdFTP.Abort; + + Application.ProcessMessages; +end; + +procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction); +begin + if (jplWizard.ActivePage = jspFTP) and (IdFTP.Connected) then + IdFTP.Quit; + if (jplWizard.ActivePage = jspInstallProgress) and (ggeAll.Progress <> ggeAll.MaxValue) and (not Cancel) then begin + if MessageBox(Handle, 'Do you really want to cancel the installation?', PChar(Application.Title), MB_ICONQUESTION + MB_YESNO) = mrYes then begin + Screen.Cursor := crDefault; + Application.OnException := ExceptionHandler; + Cancel := True; + if IdFTP.Connected then + IdFTP.Quit; + end + else + Action := caNone; + end; +end; + +procedure TfrmMain.ExceptionHandler(Sender: TObject; E: Exception); +begin + // IF any exceptions were raised after close, nobody would want them so leave this empty +end; + +procedure TfrmMain.tmrSpeedTimer(Sender: TObject); +begin + Caption := CalcSpeed(OldProgress, CurrProgress); + OldProgress := CurrProgress; +end; + +procedure TfrmMain.trvDirectoriesExpanding(Sender: TObject; + Node: TTreeNode; var AllowExpansion: Boolean); +begin + Node.ImageIndex := 1; + Node.SelectedIndex := 1; +end; + +procedure TfrmMain.trvDirectoriesCollapsing(Sender: TObject; + Node: TTreeNode; var AllowCollapse: Boolean); +begin + Node.ImageIndex := 0; + Node.SelectedIndex := 0; +end; + +procedure TfrmMain.trvModsClick(Sender: TObject); +begin + if Assigned(trvMods.Selected) then + cmdNext.Enabled := Assigned(trvMods.Selected.Parent) + else + cmdNext.Enabled := False; +end; + +procedure TfrmMain.trvDirectoriesMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var Node: TTreeNode; +begin + Node := trvDirectories.GetNodeAt(X, Y); + if (Assigned(Node)) then begin + if (Node.DisplayRect(True).Right < X) then + trvDirectories.Selected := nil; + end; +end; + +end. diff --git a/installer/UnitfrmProxy.dfm b/installer/UnitfrmProxy.dfm new file mode 100644 index 0000000000000000000000000000000000000000..7ba9c06c5cae79c3827a3d1d98e81d212d147e8a GIT binary patch literal 1584 zcmb7EO>fgc5Z&00KjI`*DjSGp8wQ9=#K`$X!!aK*xPz!0uToNo)ez2 zS-|M>!Y+RpeRRh4&lNqSbN#F4wkeAd8}kc{EPIl5Qi$o)^5C4Ol$cG~{B(>sPsuc^ zdpJde_fR@bxc&vWDn3nPp6EY7)uWg)%ZYHC6CXyX?o+~dy#%rhaqCW}>mQ!8@$ zSt`g|TXQ;qDe)!JzfDT73QEtfLpf#rKi~qGWs6)k3T`f$m2l5)fGg`a;oQ*2khjk{ zr^JqCv4?3^@Ovqx`5qJmPfEo5btx~OM&}udjc-4H14sVTp$j5ISB6T_mMc{_PGByo zrcCs5)%JyQFXdE|s=Jg}y>L~Ma|bkrc!aWZ%(aRg!im(IRt3P3%XH(ETRa!kmB)Xf z7STU|a+7VvTU@}ha^WW_M=J%akt+Z+B(g_m6WXRrJDSi9X=?KFcMJIMEBJd=W#?v; zbr_wC^Yqh<7w)u6r`3))nw4^Hh#=b?b0&OVF^ywNkh$Fp!=NQcwiYQ*T7DRq#&C{^ zX^eByrW-OyvN>eAzf4!?ruA4n_f8pzsvWT22^hk23f>Vjk4TJ`8nA~X|4fi6vYO?R zD!zK%wI@C*PZa0X4sUf`X8@OdM5a8^s%utS!D@eRe{apCkw2ywcb$lvXG)W7n(D03 lY;-Fw>-qZTmIA!Ai~=X}q5luOUP6ekuUUDr9%cXl{sJ)8?-l?6 literal 0 HcmV?d00001 diff --git a/installer/UnitfrmProxy.pas b/installer/UnitfrmProxy.pas new file mode 100644 index 0000000..1556226 --- /dev/null +++ b/installer/UnitfrmProxy.pas @@ -0,0 +1,72 @@ +unit UnitfrmProxy; + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, TFlatButtonUnit, TFlatComboBoxUnit, + TFlatEditUnit; + +type + TfrmProxy = class(TForm) + cmdClose: TFlatButton; + lblProxy: TLabel; + txtHost: TFlatEdit; + cboProxy: TFlatComboBox; + lblHost: TLabel; + txtPort: TFlatEdit; + lblPort: TLabel; + lblUsername: TLabel; + txtUsername: TFlatEdit; + txtPassword: TFlatEdit; + lblPassword: TLabel; + procedure cboProxyChange(Sender: TObject); + procedure txtPortChange(Sender: TObject); + public + procedure EnableControls(Enable: Boolean); + end; + +var + frmProxy: TfrmProxy; + +implementation + +{$R *.DFM} + +{ TfrmProxy } + +procedure TfrmProxy.EnableControls(Enable: Boolean); +begin + lblHost.Enabled := Enable; + lblPassword.Enabled := Enable; + lblPort.Enabled := Enable; + lblUsername.Enabled := Enable; + txtHost.Enabled := Enable; + txtPassword.Enabled := Enable; + txtPort.Enabled := Enable; + txtUsername.Enabled := Enable; +end; + +procedure TfrmProxy.cboProxyChange(Sender: TObject); +begin + EnableControls(cboProxy.ItemIndex <> 0); // 0 = None +end; + +procedure TfrmProxy.txtPortChange(Sender: TObject); +var i: integer; +begin + if txtPort.Text = '' then + txtPort.Text := '8080' + else begin + // check if value is numeric... + for i := Length(txtPort.Text) downto 1 do begin + if Pos(txtPort.Text[i], '0123456789') = 0 then begin + txtPort.Text := '8080'; + txtPort.SelStart := 4; + exit; + end; + end; + end; +end; + +end. diff --git a/installer/del.bat b/installer/del.bat new file mode 100644 index 0000000..74a143b --- /dev/null +++ b/installer/del.bat @@ -0,0 +1,15 @@ +del .\*.~pas +del .\*.dcu +del .\*.~ddp +del .\*.ddp +del .\*.~dpr +del .\*.~dfm +del .\*.~dpr +del .\*.map +del .\*.drc +del .\*.~xfm +del .\*.log +del .\*.dof +upx MMS_Installer.exe +upx Attach.exe +upx hl2launch.exe \ No newline at end of file diff --git a/installer/files/Readme.txt b/installer/files/Readme.txt new file mode 100644 index 0000000..9c39d58 --- /dev/null +++ b/installer/files/Readme.txt @@ -0,0 +1,7 @@ +In this folder should be server.dll and server_i486.so. + +How you prepare a release: +1) Copy the latest MM:S dlls and hl2launch.exe into this folder +2) Run Attach.exe +3) Test MMS_Installer.exe once (should work but nobody wants bug releases, especially not in the installer) +4) If everything worked fine, release it, otherwise pm me (Basic-Master) \ No newline at end of file diff --git a/installer/install.bmp b/installer/install.bmp new file mode 100644 index 0000000000000000000000000000000000000000..39b905be4507286639395912964881258552398f GIT binary patch literal 154542 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 literal 0 HcmV?d00001 diff --git a/installer/upx.exe b/installer/upx.exe new file mode 100644 index 0000000000000000000000000000000000000000..d47856823e48792f97d19f20ed08d40bc7cb0d4d GIT binary patch literal 126464 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 z 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,<=,>= comparison operators to allow storage in ordered containers. +// * Substantial reduction of code size, especially the 'Closure' class. +// * Standardised all the compiler-specific workarounds. +// * MFP conversion now works for CodePlay (but not yet supported in the full code). +// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 +// * New syntax: FastDelegate< int (char *, double) >. +// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). +// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. +// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" +// * Fully supported by CodePlay VectorC +// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! +// * More optimal assignment,== and != operators for static function pointers. + +#ifndef FASTDELEGATE_H +#define FASTDELEGATE_H + +#ifdef _MSC_VER +# if _MSC_VER > 1000 +# pragma once +# endif // _MSC_VER > 1000 +#endif // #ifdef _MSC_VER + +#include // to allow <,> comparisons + +//////////////////////////////////////////////////////////////////////////////// +// Configuration options +// +//////////////////////////////////////////////////////////////////////////////// + +// Uncomment the following #define for optimally-sized delegates. +// In this case, the generated asm code is almost identical to the code you'd get +// if the compiler had native support for delegates. +// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). +// Thus, it will not work for DOS compilers using the medium model. +// It will also probably fail on some DSP systems. +#define FASTDELEGATE_USESTATICFUNCTIONHACK + +// Uncomment the next line to allow function declarator syntax. +// It is automatically enabled for those compilers where it is known to work. +//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Compiler identification for workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Compiler identification. It's not easy to identify Visual C++ because +// many vendors fraudulently define Microsoft's identifiers. +#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) +#define FASTDLGT_ISMSVC + +#if (_MSC_VER <1300) // Many workarounds are required for VC6. +#define FASTDLGT_VC6 +#pragma warning(disable:4786) // disable this ridiculous warning +#endif + +#endif + +// Does the compiler uses Microsoft's member function pointer structure? +// If so, it needs special treatment. +// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's +// identifier, _MSC_VER. We need to filter Metrowerks out. +#if defined(_MSC_VER) && !defined(__MWERKS__) +#define FASTDLGT_MICROSOFT_MFP + +#if !defined(__VECTOR_C) +// CodePlay doesn't have the __single/multi/virtual_inheritance keywords +#define FASTDLGT_HASINHERITANCE_KEYWORDS +#endif +#endif + +// Does it allow function declarator syntax? The following compilers are known to work: +#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. +#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. +#if defined (__MWERKS__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +#ifdef __GNUC__ // Workaround GCC bug #8271 + // At present, GCC doesn't recognize constness of MFPs in templates +#define FASTDELEGATE_GCC_BUG_8271 +#endif + + + +//////////////////////////////////////////////////////////////////////////////// +// General tricks used in this code +// +// (a) Error messages are generated by typdefing an array of negative size to +// generate compile-time errors. +// (b) Warning messages on MSVC are generated by declaring unused variables, and +// enabling the "variable XXX is never used" warning. +// (c) Unions are used in a few compiler-specific cases to perform illegal casts. +// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to +// (char *) first to ensure that the correct number of *bytes* are added. +// +//////////////////////////////////////////////////////////////////////////////// +// Helper templates +// +//////////////////////////////////////////////////////////////////////////////// + + +namespace fastdelegate { +namespace detail { // we'll hide the implementation details in a nested namespace. + +// implicit_cast< > +// I believe this was originally going to be in the C++ standard but +// was left out by accident. It's even milder than static_cast. +// I use it instead of static_cast<> to emphasize that I'm not doing +// anything nasty. +// Usage is identical to static_cast<> +template +inline OutputClass implicit_cast(InputClass input){ + return input; +} + +// horrible_cast< > +// This is truly evil. It completely subverts C++'s type system, allowing you +// to cast from any class to any other class. Technically, using a union +// to perform the cast is undefined behaviour (even in C). But we can see if +// it is OK by checking that the union is the same size as each of its members. +// horrible_cast<> should only be used for compiler-specific workarounds. +// Usage is identical to reinterpret_cast<>. + +// This union is declared outside the horrible_cast because BCC 5.5.1 +// can't inline a function with a nested class, and gives a warning. +template +union horrible_union{ + OutputClass out; + InputClass in; +}; + +template +inline OutputClass horrible_cast(const InputClass input){ + horrible_union u; + // Cause a compile-time error if in, out and u are not the same size. + // If the compile fails here, it means the compiler has peculiar + // unions which would prevent the cast from working. + typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) + && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; + u.in = input; + return u.out; +} + +//////////////////////////////////////////////////////////////////////////////// +// Workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Backwards compatibility: This macro used to be necessary in the virtual inheritance +// case for Intel and Microsoft. Now it just forward-declares the class. +#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; + +// Prevent use of the static function hack with the DOS medium model. +#ifdef __MEDIUM__ +#undef FASTDELEGATE_USESTATICFUNCTIONHACK +#endif + +// DefaultVoid - a workaround for 'void' templates in VC6. +// +// (1) VC6 and earlier do not allow 'void' as a default template argument. +// (2) They also doesn't allow you to return 'void' from a function. +// +// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use +// when we'd like to use 'void'. We convert it into 'void' and back +// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. +// Workaround for (2): On VC6, the code for calling a void function is +// identical to the code for calling a non-void function in which the +// return value is never used, provided the return value is returned +// in the EAX register, rather than on the stack. +// This is true for most fundamental types such as int, enum, void *. +// Const void * is the safest option since it doesn't participate +// in any automatic conversions. But on a 16-bit compiler it might +// cause extra code to be generated, so we disable it for all compilers +// except for VC6 (and VC5). +#ifdef FASTDLGT_VC6 +// VC6 workaround +typedef const void * DefaultVoid; +#else +// On any other compiler, just use a normal void. +typedef void DefaultVoid; +#endif + +// Translate from 'DefaultVoid' to 'void'. +// Everything else is unchanged +template +struct DefaultVoidToVoid { typedef T type; }; + +template <> +struct DefaultVoidToVoid { typedef void type; }; + +// Translate from 'void' into 'DefaultVoid' +// Everything else is unchanged +template +struct VoidToDefaultVoid { typedef T type; }; + +template <> +struct VoidToDefaultVoid { typedef DefaultVoid type; }; + + + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1: +// +// Conversion of member function pointer to a standard form +// +//////////////////////////////////////////////////////////////////////////////// + +// GenericClass is a fake class, ONLY used to provide a type. +// It is vitally important that it is never defined, so that the compiler doesn't +// think it can optimize the invocation. For example, Borland generates simpler +// code if it knows the class only uses single inheritance. + +// Compilers using Microsoft's structure need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS + // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP + // (4 bytes), even when the /vmg option is used. Declaring an empty class + // would give 16 byte pointers in this case.... + class __single_inheritance GenericClass; +#endif + // ...but for Codeplay, an empty class *always* gives 4 byte pointers. + // If compiled with the /clr option ("managed C++"), the JIT compiler thinks + // it needs to load GenericClass before it can call any of its functions, + // (compiles OK but crashes at runtime!), so we need to declare an + // empty class to make it happy. + // Codeplay and VC4 can't cope with the unknown_inheritance case either. + class GenericClass {}; +#else + class GenericClass; +#endif + +// The size of a single inheritance member function pointer. +const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); + +// SimplifyMemFunc< >::Convert() +// +// A template function that converts an arbitrary member function pointer into the +// simplest possible form of member function pointer, using a supplied 'this' pointer. +// According to the standard, this can be done legally with reinterpret_cast<>. +// For (non-standard) compilers which use member function pointers which vary in size +// depending on the class, we need to use knowledge of the internal structure of a +// member function pointer, as used by the compiler. Template specialization is used +// to distinguish between the sizes. Because some compilers don't support partial +// template specialisation, I use full specialisation of a wrapper struct. + +// general case -- don't know how to convert it. Force a compile failure +template +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // Unsupported member function type -- force a compile failure. + // (it's illegal to have a array with negative size). + typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; + return 0; + } +}; + +// For compilers where all member func ptrs are the same size, everything goes here. +// For non-standard compilers, only single_inheritance classes go here. +template <> +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { +#if defined __DMC__ + // Digital Mars doesn't allow you to cast between abitrary PMF's, + // even though the standard says you can. The 32-bit compiler lets you + // static_cast through an int, but the DOS compiler doesn't. + bound_func = horrible_cast(function_to_bind); +#else + bound_func = reinterpret_cast(function_to_bind); +#endif + return reinterpret_cast(pthis); + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1b: +// +// Workarounds for Microsoft and Intel +// +//////////////////////////////////////////////////////////////////////////////// + + +// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), +// need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) +// at the start of each function for extra safety, but VC6 seems to ICE +// intermittently if you do this inside a template. + +// __multiple_inheritance classes go here +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +template<> +struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // We need to use a horrible_cast to do this conversion. + // In MSVC, a multiple inheritance member pointer is internally defined as: + union { + XFuncType func; + struct { + GenericMemFuncType funcaddress; // points to the actual member function + int delta; // #BYTES to be added to the 'this' pointer + }s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); + } +}; + +// virtual inheritance is a real nuisance. It's inefficient and complicated. +// On MSVC and Intel, there isn't enough information in the pointer itself to +// enable conversion to a closure pointer. Earlier versions of this code didn't +// work for all cases, and generated a compile-time error instead. +// But a very clever hack invented by John M. Dlugosz solves this problem. +// My code is somewhat different to his: I have no asm code, and I make no +// assumptions about the calling convention that is used. + +// In VC++ and ICL, a virtual_inheritance member pointer +// is internally defined as: +struct MicrosoftVirtualMFP { + void (GenericClass::*codeptr)(); // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtable_index; // or 0 if no virtual inheritance +}; +// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the +// m_codeptr member is *always* called, regardless of the values of the other +// members. (This is *not* true for other compilers, eg GCC, which obtain the +// function address from the vtable if a virtual function is being called). +// Dlugosz's trick is to make the codeptr point to a probe function which +// returns the 'this' pointer that was used. + +// Define a generic class that uses virtual inheritance. +// It has a trival member function that returns the value of the 'this' pointer. +struct GenericVirtualClass : virtual public GenericClass +{ + typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); + GenericVirtualClass * GetThis() { return this; } +}; + +// __virtual_inheritance classes go here +template <> +struct SimplifyMemFunc +{ + + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + union { + XFuncType func; + GenericClass* (X::*ProbeFunc)(); + MicrosoftVirtualMFP s; + } u; + u.func = function_to_bind; + bound_func = reinterpret_cast(u.s.codeptr); + union { + GenericVirtualClass::ProbePtrType virtfunc; + MicrosoftVirtualMFP s; + } u2; + // Check that the horrible_cast<>s will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) + && sizeof(function_to_bind)==sizeof(u.ProbeFunc) + && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; + // Unfortunately, taking the address of a MF prevents it from being inlined, so + // this next line can't be completely optimised away by the compiler. + u2.virtfunc = &GenericVirtualClass::GetThis; + u.s.codeptr = u2.s.codeptr; + return (pthis->*u.ProbeFunc)(); + } +}; + +#if (_MSC_VER <1300) + +// Nasty hack for Microsoft Visual C++ 6.0 +// unknown_inheritance classes go here +// There is a compiler bug in MSVC6 which generates incorrect code in this case!! +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // There is an apalling but obscure compiler bug in MSVC6 and earlier: + // vtable_index and 'vtordisp' are always set to 0 in the + // unknown_inheritance case! + // This means that an incorrect function could be called!!! + // Compiling with the /vmg option leads to potentially incorrect code. + // This is probably the reason that the IDE has a user interface for specifying + // the /vmg option, but it is disabled - you can only specify /vmg on + // the command line. In VC1.5 and earlier, the compiler would ICE if it ever + // encountered this situation. + // It is OK to use the /vmg option if /vmm or /vms is specified. + + // Fortunately, the wrong function is only called in very obscure cases. + // It only occurs when a derived class overrides a virtual function declared + // in a virtual base class, and the member function + // points to the *Derived* version of that function. The problem can be + // completely averted in 100% of cases by using the *Base class* for the + // member fpointer. Ie, if you use the base class as an interface, you'll + // stay out of trouble. + // Occasionally, you might want to point directly to a derived class function + // that isn't an override of a base class. In this case, both vtable_index + // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. + // We can generate correct code in this case. To prevent an incorrect call from + // ever being made, on MSVC6 we generate a warning, and call a function to + // make the program crash instantly. + typedef char ERROR_VC6CompilerBug[-100]; + return 0; + } +}; + + +#else + +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +// unknown_inheritance classes go here +// This is probably the ugliest bit of code I've ever written. Look at the casts! +// There is a compiler bug in MSVC6 which prevents it from using this code. +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // The member function pointer is 16 bytes long. We can't use a normal cast, but + // we can use a union to do the conversion. + union { + XFuncType func; + // In VC++ and ICL, an unknown_inheritance member pointer + // is internally defined as: + struct { + GenericMemFuncType m_funcaddress; // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtordisp; // #bytes to add to 'this' to find the vtable + int vtable_index; // or 0 if no virtual inheritance + } s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + int virtual_delta = 0; + if (u.s.vtable_index) { // Virtual inheritance is used + // First, get to the vtable. + // It is 'vtordisp' bytes from the start of the class. + const int * vtable = *reinterpret_cast( + reinterpret_cast(pthis) + u.s.vtordisp ); + + // 'vtable_index' tells us where in the table we should be looking. + virtual_delta = u.s.vtordisp + *reinterpret_cast( + reinterpret_cast(vtable) + u.s.vtable_index); + } + // The int at 'virtual_delta' gives us the amount to add to 'this'. + // Finally we can add the three components together. Phew! + return reinterpret_cast( + reinterpret_cast(pthis) + u.s.delta + virtual_delta); + }; +}; +#endif // MSVC 7 and greater + +#endif // MS/Intel hacks + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 2: +// +// Define the delegate storage, and cope with static functions +// +//////////////////////////////////////////////////////////////////////////////// + +// DelegateMemento -- an opaque structure which can hold an arbitary delegate. +// It knows nothing about the calling convention or number of arguments used by +// the function pointed to. +// It supplies comparison operators so that it can be stored in STL collections. +// It cannot be set to anything other than null, nor invoked directly: +// it must be converted to a specific delegate. + +// Implementation: +// There are two possible implementations: the Safe method and the Evil method. +// DelegateMemento - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// A static function pointer is stored inside the class. +// Here are the valid values: +// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ +// | 0 | 0 | 0 | Empty | +// | !=0 |(dontcare)| Invoker | Static function| +// | 0 | !=0 | !=0* | Method call | +// +--------------------+----------+------------+----------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// When stored stored inside a specific delegate, the 'dontcare' entries are replaced +// with a reference to the delegate itself. This complicates the = and == operators +// for the delegate class. + +// DelegateMemento - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. In this case the DelegateMemento implementation is simple: +// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ +// | 0 | 0 | Empty | +// | !=0 | !=0* | Static function or method call| +// +----------+------------+-------------------------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + +class DelegateMemento { +protected: + // the data is protected, not private, because many + // compilers have problems with template friends. + typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. + detail::GenericClass *m_pthis; + GenericMemFuncType m_pFunction; + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + typedef void (*GenericFuncPtr)(); // arbitrary code pointer + GenericFuncPtr m_pStaticFunction; +#endif + +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; + void clear() { + m_pthis=0; m_pFunction=0; m_pStaticFunction=0; + } +#else + DelegateMemento() : m_pthis(0), m_pFunction(0) {}; + void clear() { m_pthis=0; m_pFunction=0; } +#endif +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + inline bool IsEqual (const DelegateMemento &x) const{ + // We have to cope with the static function pointers as a special case + if (m_pFunction!=x.m_pFunction) return false; + // the static function ptrs must either both be equal, or both be 0. + if (m_pStaticFunction!=x.m_pStaticFunction) return false; + if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; + else return true; + } +#else // Evil Method + inline bool IsEqual (const DelegateMemento &x) const{ + return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; + } +#endif + // Provide a strict weak ordering for DelegateMementos. + inline bool IsLess(const DelegateMemento &right) const { + // deal with static function pointers first +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) + return m_pStaticFunction < right.m_pStaticFunction; +#endif + if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; + // There are no ordering operators for member function pointers, + // but we can fake one by comparing each byte. The resulting ordering is + // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. + return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; + + } + // BUGFIX (Mar 2005): + // We can't just compare m_pFunction because on Metrowerks, + // m_pFunction can be zero even if the delegate is not empty! + inline bool operator ! () const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } + inline bool empty() const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } +public: + DelegateMemento & operator = (const DelegateMemento &right) { + SetMementoFrom(right); + return *this; + } + inline bool operator <(const DelegateMemento &right) { + return IsLess(right); + } + inline bool operator >(const DelegateMemento &right) { + return right.IsLess(*this); + } + DelegateMemento (const DelegateMemento &right) : + m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + , m_pStaticFunction (right.m_pStaticFunction) +#endif + {} +protected: + void SetMementoFrom(const DelegateMemento &right) { + m_pFunction = right.m_pFunction; + m_pthis = right.m_pthis; +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = right.m_pStaticFunction; +#endif + } +}; + + +// ClosurePtr<> +// +// A private wrapper class that adds function signatures to DelegateMemento. +// It's the class that does most of the actual work. +// The signatures are specified by: +// GenericMemFunc: must be a type of GenericClass member function pointer. +// StaticFuncPtr: must be a type of function pointer with the same signature +// as GenericMemFunc. +// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 +// where it never returns void (returns DefaultVoid instead). + +// An outer class, FastDelegateN<>, handles the invoking and creates the +// necessary typedefs. +// This class does everything else. + +namespace detail { + +template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> +class ClosurePtr : public DelegateMemento { +public: + // These functions are for setting the delegate to a member function. + + // Here's the clever bit: we convert an arbitrary member function into a + // standard form. XMemFunc should be a member function of class X, but I can't + // enforce that here. It needs to be enforced by the wrapper class. + template < class X, class XMemFunc > + inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { + m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(pthis, function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } + // For const member functions, we only need a const class pointer. + // Since we know that the member function is const, it's safe to + // remove the const qualifier from the 'this' pointer with a const_cast. + // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. + template < class X, class XMemFunc> + inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { + m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(const_cast(pthis), function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates + template < class X, class XMemFunc> + inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { + bindconstmemfunc(pthis, function_to_bind); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#endif + // These functions are required for invoking the stored function + inline GenericClass *GetClosureThis() const { return m_pthis; } + inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } + +// There are a few ways of dealing with static function pointers. +// There's a standard-compliant, but tricky method. +// There's also a straightforward hack, that won't work on DOS compilers using the +// medium memory model. It's so evil that I can't recommend it, but I've +// implemented it anyway because it produces very nice asm code. + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + +// ClosurePtr<> - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// I store the function pointer inside the class, and the delegate then +// points to itself. Whenever the delegate is copied, these self-references +// must be transformed, and this complicates the = and == operators. +public: + // The next two functions are for operator ==, =, and the copy constructor. + // We may need to convert the m_pthis pointers, so that + // they remain as self-references. + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { + SetMementoFrom(x); + if (m_pStaticFunction!=0) { + // transform self references... + m_pthis=reinterpret_cast(pParent); + } + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + template < class DerivedClass, class ParentInvokerSig > + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind ) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + bindmemfunc(pParent, static_function_invoker); + } + m_pStaticFunction=reinterpret_cast(function_to_bind); + } + inline UnvoidStaticFuncPtr GetStaticFunction() const { + return reinterpret_cast(m_pStaticFunction); + } +#else + +// ClosurePtr<> - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and +// speeds up comparison and assignment. If C++ provided direct language support +// for delegates, they would produce asm code that was almost identical to this. +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { + SetMementoFrom(right); + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + // ******** EVIL, EVIL CODE! ******* + template < class DerivedClass, class ParentInvokerSig> + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + // We'll be ignoring the 'this' pointer, but we need to make sure we pass + // a valid value to bindmemfunc(). + bindmemfunc(pParent, static_function_invoker); + } + + // WARNING! Evil hack. We store the function in the 'this' pointer! + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; + m_pthis = horrible_cast(function_to_bind); + // MSVC, SunC++ and DMC accept the following (non-standard) code: +// m_pthis = static_cast(static_cast(function_to_bind)); + // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long +// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); + } + // ******** EVIL, EVIL CODE! ******* + // This function will be called with an invalid 'this' pointer!! + // We're just returning the 'this' pointer, converted into + // a function pointer! + inline UnvoidStaticFuncPtr GetStaticFunction() const { + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; + return horrible_cast(this); + } +#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + + // Does the closure contain this static function? + inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ + if (funcptr==0) return empty(); + // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary + // value that is not equal to any valid function pointer. + else return funcptr==reinterpret_cast(GetStaticFunction()); + } +}; + + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 3: +// +// Wrapper classes to ensure type safety +// +//////////////////////////////////////////////////////////////////////////////// + + +// Once we have the member function conversion templates, it's easy to make the +// wrapper classes. So that they will work with as many compilers as possible, +// the classes are of the form +// FastDelegate3 +// They can cope with any combination of parameters. The max number of parameters +// allowed is 8, but it is trivial to increase this limit. +// Note that we need to treat const member functions seperately. +// All this class does is to enforce type safety, and invoke the delegate with +// the correct list of parameters. + +// Because of the weird rule about the class of derived member function pointers, +// you sometimes need to apply a downcast to the 'this' pointer. +// This is the reason for the use of "implicit_cast(pthis)" in the code below. +// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, +// without this trick you'd need to write: +// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); +// but with the trick you can write +// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); + +// RetType is the type the compiler uses in compiling the template. For VC6, +// it cannot be void. DesiredRetType is the real type which is returned from +// all of the functions. It can be void. + +// Implicit conversion to "bool" is achieved using the safe_bool idiom, +// using member data pointers (MDP). This allows "if (dg)..." syntax +// Because some compilers (eg codeplay) don't have a unique value for a zero +// MDP, an extra padding member is added to the SafeBool struct. +// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so +// in that case the static function constructor is not made explicit; this +// allows "if (dg==0) ..." to compile. + +//N=0 +template +class FastDelegate0 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(); + typedef RetType (*UnvoidStaticFunctionPtr)(); + typedef RetType (detail::GenericClass::*GenericMemFn)(); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate0 type; + + // Construction and comparison functions + FastDelegate0() { clear(); } + FastDelegate0(const FastDelegate0 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate0 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate0 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate0 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate0 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate0 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate0(DesiredRetType (*function_to_bind)() ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)() ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)()) { + m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() () const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction() const { + return (*(m_Closure.GetStaticFunction()))(); } +}; + +//N=1 +template +class FastDelegate1 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate1 type; + + // Construction and comparison functions + FastDelegate1() { clear(); } + FastDelegate1(const FastDelegate1 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate1 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate1 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate1 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate1 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate1 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) { + m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1) const { + return (*(m_Closure.GetStaticFunction()))(p1); } +}; + +//N=2 +template +class FastDelegate2 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate2 type; + + // Construction and comparison functions + FastDelegate2() { clear(); } + FastDelegate2(const FastDelegate2 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate2 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate2 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate2 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate2 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate2 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) { + m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2); } +}; + +//N=3 +template +class FastDelegate3 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate3 type; + + // Construction and comparison functions + FastDelegate3() { clear(); } + FastDelegate3(const FastDelegate3 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate3 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate3 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate3 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate3 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate3 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate3(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate3(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate3(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { + m_Closure.bindstaticfunc(this, &FastDelegate3::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3); } +}; + +//N=4 +template +class FastDelegate4 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate4 type; + + // Construction and comparison functions + FastDelegate4() { clear(); } + FastDelegate4(const FastDelegate4 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate4 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate4 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate4 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate4 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate4 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate4(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate4(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate4(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + m_Closure.bindstaticfunc(this, &FastDelegate4::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4); } +}; + +//N=5 +template +class FastDelegate5 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate5 type; + + // Construction and comparison functions + FastDelegate5() { clear(); } + FastDelegate5(const FastDelegate5 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate5 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate5 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate5 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate5 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate5 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate5(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate5(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate5(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + m_Closure.bindstaticfunc(this, &FastDelegate5::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5); } +}; + +//N=6 +template +class FastDelegate6 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate6 type; + + // Construction and comparison functions + FastDelegate6() { clear(); } + FastDelegate6(const FastDelegate6 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate6 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate6 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate6 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate6 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate6 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate6(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate6(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate6(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + m_Closure.bindstaticfunc(this, &FastDelegate6::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6); } +}; + +//N=7 +template +class FastDelegate7 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate7 type; + + // Construction and comparison functions + FastDelegate7() { clear(); } + FastDelegate7(const FastDelegate7 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate7 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate7 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate7 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate7 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate7 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate7(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate7(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate7(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + m_Closure.bindstaticfunc(this, &FastDelegate7::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7); } +}; + +//N=8 +template +class FastDelegate8 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate8 type; + + // Construction and comparison functions + FastDelegate8() { clear(); } + FastDelegate8(const FastDelegate8 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate8 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate8 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate8 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate8 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate8 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate8(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate8(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate8(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + m_Closure.bindstaticfunc(this, &FastDelegate8::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8); } +}; + +//N=9 +template +class FastDelegate9 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate9 type; + + // Construction and comparison functions + FastDelegate9() { clear(); } + FastDelegate9(const FastDelegate9 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate9 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate9 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate9 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate9 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate9 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate9(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate9(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate9(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { + m_Closure.bindstaticfunc(this, &FastDelegate9::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } +}; + +//N=10 +template +class FastDelegate10 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate10 type; + + // Construction and comparison functions + FastDelegate10() { clear(); } + FastDelegate10(const FastDelegate10 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate10 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate10 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate10 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate10 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate10 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate10(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate10(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate10(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { + m_Closure.bindstaticfunc(this, &FastDelegate10::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } +}; + +//N=11 +template +class FastDelegate11 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate11 type; + + // Construction and comparison functions + FastDelegate11() { clear(); } + FastDelegate11(const FastDelegate11 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate11 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate11 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate11 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate11 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate11 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate11(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate11(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate11(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { + m_Closure.bindstaticfunc(this, &FastDelegate11::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } +}; + +//N=12 +template +class FastDelegate12 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate12 type; + + // Construction and comparison functions + FastDelegate12() { clear(); } + FastDelegate12(const FastDelegate12 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate12 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate12 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate12 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate12 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate12 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate12(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate12(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate12(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { + m_Closure.bindstaticfunc(this, &FastDelegate12::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } +}; + +//N=13 +template +class FastDelegate13 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate13 type; + + // Construction and comparison functions + FastDelegate13() { clear(); } + FastDelegate13(const FastDelegate13 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate13 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate13 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate13 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate13 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate13 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate13(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate13(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate13(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { + m_Closure.bindstaticfunc(this, &FastDelegate13::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } +}; + +//N=14 +template +class FastDelegate14 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate14 type; + + // Construction and comparison functions + FastDelegate14() { clear(); } + FastDelegate14(const FastDelegate14 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate14 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate14 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate14 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate14 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate14 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate14(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate14(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate14(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { + m_Closure.bindstaticfunc(this, &FastDelegate14::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } +}; + +//N=15 +template +class FastDelegate15 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate15 type; + + // Construction and comparison functions + FastDelegate15() { clear(); } + FastDelegate15(const FastDelegate15 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate15 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate15 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate15 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate15 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate15 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate15(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate15(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate15(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { + m_Closure.bindstaticfunc(this, &FastDelegate15::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } +}; + +//N=16 +template +class FastDelegate16 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate16 type; + + // Construction and comparison functions + FastDelegate16() { clear(); } + FastDelegate16(const FastDelegate16 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate16 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate16 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate16 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate16 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate16 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate16(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate16(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate16(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { + m_Closure.bindstaticfunc(this, &FastDelegate16::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } +}; + +//N=17 +template +class FastDelegate17 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate17 type; + + // Construction and comparison functions + FastDelegate17() { clear(); } + FastDelegate17(const FastDelegate17 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate17 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate17 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate17 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate17 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate17 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate17(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate17(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate17(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { + m_Closure.bindstaticfunc(this, &FastDelegate17::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } +}; + +//N=18 +template +class FastDelegate18 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate18 type; + + // Construction and comparison functions + FastDelegate18() { clear(); } + FastDelegate18(const FastDelegate18 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate18 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate18 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate18 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate18 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate18 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate18(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate18(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate18(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { + m_Closure.bindstaticfunc(this, &FastDelegate18::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } +}; + +//N=19 +template +class FastDelegate19 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate19 type; + + // Construction and comparison functions + FastDelegate19() { clear(); } + FastDelegate19(const FastDelegate19 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate19 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate19 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate19 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate19 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate19 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate19(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate19(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate19(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { + m_Closure.bindstaticfunc(this, &FastDelegate19::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } +}; + +//N=20 +template +class FastDelegate20 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate20 type; + + // Construction and comparison functions + FastDelegate20() { clear(); } + FastDelegate20(const FastDelegate20 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate20 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate20 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate20 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate20 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate20 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate20(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate20(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate20(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { + m_Closure.bindstaticfunc(this, &FastDelegate20::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } +}; + + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 4: +// +// FastDelegate<> class (Original author: Jody Hagins) +// Allows boost::function style syntax like: +// FastDelegate< double (int, long) > +// instead of: +// FastDelegate2< int, long, double > +// +//////////////////////////////////////////////////////////////////////////////// + +#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +// Declare FastDelegate as a class template. It will be specialized +// later for all number of arguments. +template +class FastDelegate; + +//N=0 +// Specialization to allow use of +// FastDelegate< R ( ) > +// instead of +// FastDelegate0 < R > +template +class FastDelegate< R ( ) > + // Inherit from FastDelegate0 so that it can be treated just like a FastDelegate0 + : public FastDelegate0 < R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate0 < R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=1 +// Specialization to allow use of +// FastDelegate< R ( Param1 ) > +// instead of +// FastDelegate1 < Param1, R > +template +class FastDelegate< R ( Param1 ) > + // Inherit from FastDelegate1 so that it can be treated just like a FastDelegate1 + : public FastDelegate1 < Param1, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate1 < Param1, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=2 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2 ) > +// instead of +// FastDelegate2 < Param1, Param2, R > +template +class FastDelegate< R ( Param1, Param2 ) > + // Inherit from FastDelegate2 so that it can be treated just like a FastDelegate2 + : public FastDelegate2 < Param1, Param2, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate2 < Param1, Param2, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=3 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3 ) > +// instead of +// FastDelegate3 < Param1, Param2, Param3, R > +template +class FastDelegate< R ( Param1, Param2, Param3 ) > + // Inherit from FastDelegate3 so that it can be treated just like a FastDelegate3 + : public FastDelegate3 < Param1, Param2, Param3, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate3 < Param1, Param2, Param3, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=4 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4 ) > +// instead of +// FastDelegate4 < Param1, Param2, Param3, Param4, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4 ) > + // Inherit from FastDelegate4 so that it can be treated just like a FastDelegate4 + : public FastDelegate4 < Param1, Param2, Param3, Param4, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate4 < Param1, Param2, Param3, Param4, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=5 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > +// instead of +// FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > + // Inherit from FastDelegate5 so that it can be treated just like a FastDelegate5 + : public FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=6 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > +// instead of +// FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > + // Inherit from FastDelegate6 so that it can be treated just like a FastDelegate6 + : public FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=7 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > +// instead of +// FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > + // Inherit from FastDelegate7 so that it can be treated just like a FastDelegate7 + : public FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=8 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > +// instead of +// FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > + // Inherit from FastDelegate8 so that it can be treated just like a FastDelegate8 + : public FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=9 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > +// instead of +// FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > + // Inherit from FastDelegate9 so that it can be treated just like a FastDelegate9 + : public FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=10 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > +// instead of +// FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > + // Inherit from FastDelegate10 so that it can be treated just like a FastDelegate10 + : public FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=11 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > +// instead of +// FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > + // Inherit from FastDelegate11 so that it can be treated just like a FastDelegate11 + : public FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=12 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > +// instead of +// FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > + // Inherit from FastDelegate12 so that it can be treated just like a FastDelegate12 + : public FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=13 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > +// instead of +// FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > + // Inherit from FastDelegate13 so that it can be treated just like a FastDelegate13 + : public FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=14 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > +// instead of +// FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > + // Inherit from FastDelegate14 so that it can be treated just like a FastDelegate14 + : public FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=15 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > +// instead of +// FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > + // Inherit from FastDelegate15 so that it can be treated just like a FastDelegate15 + : public FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=16 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > +// instead of +// FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > + // Inherit from FastDelegate16 so that it can be treated just like a FastDelegate16 + : public FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=17 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > +// instead of +// FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > + // Inherit from FastDelegate17 so that it can be treated just like a FastDelegate17 + : public FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=18 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > +// instead of +// FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > + // Inherit from FastDelegate18 so that it can be treated just like a FastDelegate18 + : public FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=19 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > +// instead of +// FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > + // Inherit from FastDelegate19 so that it can be treated just like a FastDelegate19 + : public FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=20 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > +// instead of +// FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > + // Inherit from FastDelegate20 so that it can be treated just like a FastDelegate20 + : public FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + + +#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 5: +// +// MakeDelegate() helper function +// +// MakeDelegate(&x, &X::func) returns a fastdelegate of the type +// necessary for calling x.func() with the correct number of arguments. +// This makes it possible to eliminate many typedefs from user code. +// +//////////////////////////////////////////////////////////////////////////////// + +// Also declare overloads of a MakeDelegate() global function to +// reduce the need for typedefs. +// We need seperate overloads for const and non-const member functions. +// Also, because of the weird rule about the class of derived member function pointers, +// implicit downcasts may need to be applied later to the 'this' pointer. +// That's why two classes (X and Y) appear in the definitions. Y must be implicitly +// castable to X. + +// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. +// GCC 3.2 and later won't compile this unless it's preceded by 'typename', +// but VC6 doesn't allow 'typename' in this context. +// So, I have to use a macro. + +#ifdef FASTDLGT_VC6 +#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type +#else +#define FASTDLGT_RETTYPE RetType +#endif + +//N=0 +template +FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)()) { + return FastDelegate0(x, func); +} + +template +FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)() const) { + return FastDelegate0(x, func); +} + +template +FastDelegate0 MakeDelegate(RetType (*func)()) { + return FastDelegate0(func); +} + +//N=1 +template +FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1)) { + return FastDelegate1(x, func); +} + +template +FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1) const) { + return FastDelegate1(x, func); +} + +template +FastDelegate1 MakeDelegate(RetType (*func)(Param1 p1)) { + return FastDelegate1(func); +} + +//N=2 +template +FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2)) { + return FastDelegate2(x, func); +} + +template +FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2) const) { + return FastDelegate2(x, func); +} + +template +FastDelegate2 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2)) { + return FastDelegate2(func); +} + +//N=3 +template +FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3)) { + return FastDelegate3(x, func); +} + +template +FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3) const) { + return FastDelegate3(x, func); +} + +template +FastDelegate3 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3)) { + return FastDelegate3(func); +} + +//N=4 +template +FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + return FastDelegate4(x, func); +} + +template +FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + return FastDelegate4(x, func); +} + +template +FastDelegate4 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + return FastDelegate4(func); +} + +//N=5 +template +FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + return FastDelegate5(x, func); +} + +template +FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + return FastDelegate5(x, func); +} + +template +FastDelegate5 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + return FastDelegate5(func); +} + +//N=6 +template +FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + return FastDelegate6(x, func); +} + +template +FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + return FastDelegate6(x, func); +} + +template +FastDelegate6 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + return FastDelegate6(func); +} + +//N=7 +template +FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + return FastDelegate7(x, func); +} + +template +FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + return FastDelegate7(x, func); +} + +template +FastDelegate7 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + return FastDelegate7(func); +} + +//N=8 +template +FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + return FastDelegate8(x, func); +} + +template +FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + return FastDelegate8(x, func); +} + +template +FastDelegate8 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + return FastDelegate8(func); +} + +//N=9 +template +FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { + return FastDelegate9(x, func); +} + +template +FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { + return FastDelegate9(x, func); +} + +template +FastDelegate9 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { + return FastDelegate9(func); +} + +//N=10 +template +FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { + return FastDelegate10(x, func); +} + +template +FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { + return FastDelegate10(x, func); +} + +template +FastDelegate10 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { + return FastDelegate10(func); +} + +//N=11 +template +FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { + return FastDelegate11(x, func); +} + +template +FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { + return FastDelegate11(x, func); +} + +template +FastDelegate11 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { + return FastDelegate11(func); +} + +//N=12 +template +FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { + return FastDelegate12(x, func); +} + +template +FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { + return FastDelegate12(x, func); +} + +template +FastDelegate12 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { + return FastDelegate12(func); +} + +//N=13 +template +FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { + return FastDelegate13(x, func); +} + +template +FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { + return FastDelegate13(x, func); +} + +template +FastDelegate13 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { + return FastDelegate13(func); +} + +//N=14 +template +FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { + return FastDelegate14(x, func); +} + +template +FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { + return FastDelegate14(x, func); +} + +template +FastDelegate14 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { + return FastDelegate14(func); +} + +//N=15 +template +FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { + return FastDelegate15(x, func); +} + +template +FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { + return FastDelegate15(x, func); +} + +template +FastDelegate15 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { + return FastDelegate15(func); +} + +//N=16 +template +FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { + return FastDelegate16(x, func); +} + +template +FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { + return FastDelegate16(x, func); +} + +template +FastDelegate16 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { + return FastDelegate16(func); +} + +//N=17 +template +FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { + return FastDelegate17(x, func); +} + +template +FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { + return FastDelegate17(x, func); +} + +template +FastDelegate17 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { + return FastDelegate17(func); +} + +//N=18 +template +FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { + return FastDelegate18(x, func); +} + +template +FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { + return FastDelegate18(x, func); +} + +template +FastDelegate18 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { + return FastDelegate18(func); +} + +//N=19 +template +FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { + return FastDelegate19(x, func); +} + +template +FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { + return FastDelegate19(x, func); +} + +template +FastDelegate19 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { + return FastDelegate19(func); +} + +//N=20 +template +FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { + return FastDelegate20(x, func); +} + +template +FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { + return FastDelegate20(x, func); +} + +template +FastDelegate20 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { + return FastDelegate20(func); +} + + + // clean up after ourselves... +#undef FASTDLGT_RETTYPE + +} // namespace fastdelegate + +#endif // !defined(FASTDELEGATE_H) diff --git a/sourcehook/generate/FastDelegate.h b/sourcehook/generate/FastDelegate.h new file mode 100644 index 0000000..a17bb1a --- /dev/null +++ b/sourcehook/generate/FastDelegate.h @@ -0,0 +1,3811 @@ +// FastDelegate.h +// Efficient delegates in C++ that generate only two lines of asm code! +// Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp +// +// - Don Clugston, Mar 2004. +// Major contributions were made by Jody Hagins. +// History: +// 24-Apr-04 1.0 * Submitted to CodeProject. +// 28-Apr-04 1.1 * Prevent most unsafe uses of evil static function hack. +// * Improved syntax for horrible_cast (thanks Paul Bludov). +// * Tested on Metrowerks MWCC and Intel ICL (IA32) +// * Compiled, but not run, on Comeau C++ and Intel Itanium ICL. +// 27-Jun-04 1.2 * Now works on Borland C++ Builder 5.5 +// * Now works on /clr "managed C++" code on VC7, VC7.1 +// * Comeau C++ now compiles without warnings. +// * Prevent the virtual inheritance case from being used on +// VC6 and earlier, which generate incorrect code. +// * Improved warning and error messages. Non-standard hacks +// now have compile-time checks to make them safer. +// * implicit_cast used instead of static_cast in many cases. +// * If calling a const member function, a const class pointer can be used. +// * MakeDelegate() global helper function added to simplify pass-by-value. +// * Added fastdelegate.clear() +// 16-Jul-04 1.2.1* Workaround for gcc bug (const member function pointers in templates) +// 30-Oct-04 1.3 * Support for (non-void) return values. +// * No more workarounds in client code! +// MSVC and Intel now use a clever hack invented by John Dlugosz: +// - The FASTDELEGATEDECLARE workaround is no longer necessary. +// - No more warning messages for VC6 +// * Less use of macros. Error messages should be more comprehensible. +// * Added include guards +// * Added FastDelegate::empty() to test if invocation is safe (Thanks Neville Franks). +// * Now tested on VS 2005 Express Beta, PGI C++ +// 24-Dec-04 1.4 * Added DelegateMemento, to allow collections of disparate delegates. +// * <,>,<=,>= comparison operators to allow storage in ordered containers. +// * Substantial reduction of code size, especially the 'Closure' class. +// * Standardised all the compiler-specific workarounds. +// * MFP conversion now works for CodePlay (but not yet supported in the full code). +// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 +// * New syntax: FastDelegate< int (char *, double) >. +// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). +// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. +// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" +// * Fully supported by CodePlay VectorC +// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! +// * More optimal assignment,== and != operators for static function pointers. + +#ifndef FASTDELEGATE_H +#define FASTDELEGATE_H + +#ifdef _MSC_VER +# if _MSC_VER > 1000 +# pragma once +# endif // _MSC_VER > 1000 +#endif // #ifdef _MSC_VER + +#include // to allow <,> comparisons + +//////////////////////////////////////////////////////////////////////////////// +// Configuration options +// +//////////////////////////////////////////////////////////////////////////////// + +// Uncomment the following #define for optimally-sized delegates. +// In this case, the generated asm code is almost identical to the code you'd get +// if the compiler had native support for delegates. +// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). +// Thus, it will not work for DOS compilers using the medium model. +// It will also probably fail on some DSP systems. +#define FASTDELEGATE_USESTATICFUNCTIONHACK + +// Uncomment the next line to allow function declarator syntax. +// It is automatically enabled for those compilers where it is known to work. +//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Compiler identification for workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Compiler identification. It's not easy to identify Visual C++ because +// many vendors fraudulently define Microsoft's identifiers. +#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) +#define FASTDLGT_ISMSVC + +#if (_MSC_VER <1300) // Many workarounds are required for VC6. +#define FASTDLGT_VC6 +#pragma warning(disable:4786) // disable this ridiculous warning +#endif + +#endif + +// Does the compiler uses Microsoft's member function pointer structure? +// If so, it needs special treatment. +// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's +// identifier, _MSC_VER. We need to filter Metrowerks out. +#if defined(_MSC_VER) && !defined(__MWERKS__) +#define FASTDLGT_MICROSOFT_MFP + +#if !defined(__VECTOR_C) +// CodePlay doesn't have the __single/multi/virtual_inheritance keywords +#define FASTDLGT_HASINHERITANCE_KEYWORDS +#endif +#endif + +// Does it allow function declarator syntax? The following compilers are known to work: +#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. +#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. +#if defined (__MWERKS__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +#ifdef __GNUC__ // Workaround GCC bug #8271 + // At present, GCC doesn't recognize constness of MFPs in templates +#define FASTDELEGATE_GCC_BUG_8271 +#endif + + + +//////////////////////////////////////////////////////////////////////////////// +// General tricks used in this code +// +// (a) Error messages are generated by typdefing an array of negative size to +// generate compile-time errors. +// (b) Warning messages on MSVC are generated by declaring unused variables, and +// enabling the "variable XXX is never used" warning. +// (c) Unions are used in a few compiler-specific cases to perform illegal casts. +// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to +// (char *) first to ensure that the correct number of *bytes* are added. +// +//////////////////////////////////////////////////////////////////////////////// +// Helper templates +// +//////////////////////////////////////////////////////////////////////////////// + + +namespace fastdelegate { +namespace detail { // we'll hide the implementation details in a nested namespace. + +// implicit_cast< > +// I believe this was originally going to be in the C++ standard but +// was left out by accident. It's even milder than static_cast. +// I use it instead of static_cast<> to emphasize that I'm not doing +// anything nasty. +// Usage is identical to static_cast<> +template +inline OutputClass implicit_cast(InputClass input){ + return input; +} + +// horrible_cast< > +// This is truly evil. It completely subverts C++'s type system, allowing you +// to cast from any class to any other class. Technically, using a union +// to perform the cast is undefined behaviour (even in C). But we can see if +// it is OK by checking that the union is the same size as each of its members. +// horrible_cast<> should only be used for compiler-specific workarounds. +// Usage is identical to reinterpret_cast<>. + +// This union is declared outside the horrible_cast because BCC 5.5.1 +// can't inline a function with a nested class, and gives a warning. +template +union horrible_union{ + OutputClass out; + InputClass in; +}; + +template +inline OutputClass horrible_cast(const InputClass input){ + horrible_union u; + // Cause a compile-time error if in, out and u are not the same size. + // If the compile fails here, it means the compiler has peculiar + // unions which would prevent the cast from working. + typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) + && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; + u.in = input; + return u.out; +} + +//////////////////////////////////////////////////////////////////////////////// +// Workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Backwards compatibility: This macro used to be necessary in the virtual inheritance +// case for Intel and Microsoft. Now it just forward-declares the class. +#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; + +// Prevent use of the static function hack with the DOS medium model. +#ifdef __MEDIUM__ +#undef FASTDELEGATE_USESTATICFUNCTIONHACK +#endif + +// DefaultVoid - a workaround for 'void' templates in VC6. +// +// (1) VC6 and earlier do not allow 'void' as a default template argument. +// (2) They also doesn't allow you to return 'void' from a function. +// +// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use +// when we'd like to use 'void'. We convert it into 'void' and back +// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. +// Workaround for (2): On VC6, the code for calling a void function is +// identical to the code for calling a non-void function in which the +// return value is never used, provided the return value is returned +// in the EAX register, rather than on the stack. +// This is true for most fundamental types such as int, enum, void *. +// Const void * is the safest option since it doesn't participate +// in any automatic conversions. But on a 16-bit compiler it might +// cause extra code to be generated, so we disable it for all compilers +// except for VC6 (and VC5). +#ifdef FASTDLGT_VC6 +// VC6 workaround +typedef const void * DefaultVoid; +#else +// On any other compiler, just use a normal void. +typedef void DefaultVoid; +#endif + +// Translate from 'DefaultVoid' to 'void'. +// Everything else is unchanged +template +struct DefaultVoidToVoid { typedef T type; }; + +template <> +struct DefaultVoidToVoid { typedef void type; }; + +// Translate from 'void' into 'DefaultVoid' +// Everything else is unchanged +template +struct VoidToDefaultVoid { typedef T type; }; + +template <> +struct VoidToDefaultVoid { typedef DefaultVoid type; }; + + + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1: +// +// Conversion of member function pointer to a standard form +// +//////////////////////////////////////////////////////////////////////////////// + +// GenericClass is a fake class, ONLY used to provide a type. +// It is vitally important that it is never defined, so that the compiler doesn't +// think it can optimize the invocation. For example, Borland generates simpler +// code if it knows the class only uses single inheritance. + +// Compilers using Microsoft's structure need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS + // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP + // (4 bytes), even when the /vmg option is used. Declaring an empty class + // would give 16 byte pointers in this case.... + class __single_inheritance GenericClass; +#endif + // ...but for Codeplay, an empty class *always* gives 4 byte pointers. + // If compiled with the /clr option ("managed C++"), the JIT compiler thinks + // it needs to load GenericClass before it can call any of its functions, + // (compiles OK but crashes at runtime!), so we need to declare an + // empty class to make it happy. + // Codeplay and VC4 can't cope with the unknown_inheritance case either. + class GenericClass {}; +#else + class GenericClass; +#endif + +// The size of a single inheritance member function pointer. +const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); + +// SimplifyMemFunc< >::Convert() +// +// A template function that converts an arbitrary member function pointer into the +// simplest possible form of member function pointer, using a supplied 'this' pointer. +// According to the standard, this can be done legally with reinterpret_cast<>. +// For (non-standard) compilers which use member function pointers which vary in size +// depending on the class, we need to use knowledge of the internal structure of a +// member function pointer, as used by the compiler. Template specialization is used +// to distinguish between the sizes. Because some compilers don't support partial +// template specialisation, I use full specialisation of a wrapper struct. + +// general case -- don't know how to convert it. Force a compile failure +template +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // Unsupported member function type -- force a compile failure. + // (it's illegal to have a array with negative size). + typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; + return 0; + } +}; + +// For compilers where all member func ptrs are the same size, everything goes here. +// For non-standard compilers, only single_inheritance classes go here. +template <> +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { +#if defined __DMC__ + // Digital Mars doesn't allow you to cast between abitrary PMF's, + // even though the standard says you can. The 32-bit compiler lets you + // static_cast through an int, but the DOS compiler doesn't. + bound_func = horrible_cast(function_to_bind); +#else + bound_func = reinterpret_cast(function_to_bind); +#endif + return reinterpret_cast(pthis); + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1b: +// +// Workarounds for Microsoft and Intel +// +//////////////////////////////////////////////////////////////////////////////// + + +// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), +// need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) +// at the start of each function for extra safety, but VC6 seems to ICE +// intermittently if you do this inside a template. + +// __multiple_inheritance classes go here +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +template<> +struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // We need to use a horrible_cast to do this conversion. + // In MSVC, a multiple inheritance member pointer is internally defined as: + union { + XFuncType func; + struct { + GenericMemFuncType funcaddress; // points to the actual member function + int delta; // #BYTES to be added to the 'this' pointer + }s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); + } +}; + +// virtual inheritance is a real nuisance. It's inefficient and complicated. +// On MSVC and Intel, there isn't enough information in the pointer itself to +// enable conversion to a closure pointer. Earlier versions of this code didn't +// work for all cases, and generated a compile-time error instead. +// But a very clever hack invented by John M. Dlugosz solves this problem. +// My code is somewhat different to his: I have no asm code, and I make no +// assumptions about the calling convention that is used. + +// In VC++ and ICL, a virtual_inheritance member pointer +// is internally defined as: +struct MicrosoftVirtualMFP { + void (GenericClass::*codeptr)(); // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtable_index; // or 0 if no virtual inheritance +}; +// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the +// m_codeptr member is *always* called, regardless of the values of the other +// members. (This is *not* true for other compilers, eg GCC, which obtain the +// function address from the vtable if a virtual function is being called). +// Dlugosz's trick is to make the codeptr point to a probe function which +// returns the 'this' pointer that was used. + +// Define a generic class that uses virtual inheritance. +// It has a trival member function that returns the value of the 'this' pointer. +struct GenericVirtualClass : virtual public GenericClass +{ + typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); + GenericVirtualClass * GetThis() { return this; } +}; + +// __virtual_inheritance classes go here +template <> +struct SimplifyMemFunc +{ + + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + union { + XFuncType func; + GenericClass* (X::*ProbeFunc)(); + MicrosoftVirtualMFP s; + } u; + u.func = function_to_bind; + bound_func = reinterpret_cast(u.s.codeptr); + union { + GenericVirtualClass::ProbePtrType virtfunc; + MicrosoftVirtualMFP s; + } u2; + // Check that the horrible_cast<>s will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) + && sizeof(function_to_bind)==sizeof(u.ProbeFunc) + && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; + // Unfortunately, taking the address of a MF prevents it from being inlined, so + // this next line can't be completely optimised away by the compiler. + u2.virtfunc = &GenericVirtualClass::GetThis; + u.s.codeptr = u2.s.codeptr; + return (pthis->*u.ProbeFunc)(); + } +}; + +#if (_MSC_VER <1300) + +// Nasty hack for Microsoft Visual C++ 6.0 +// unknown_inheritance classes go here +// There is a compiler bug in MSVC6 which generates incorrect code in this case!! +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // There is an apalling but obscure compiler bug in MSVC6 and earlier: + // vtable_index and 'vtordisp' are always set to 0 in the + // unknown_inheritance case! + // This means that an incorrect function could be called!!! + // Compiling with the /vmg option leads to potentially incorrect code. + // This is probably the reason that the IDE has a user interface for specifying + // the /vmg option, but it is disabled - you can only specify /vmg on + // the command line. In VC1.5 and earlier, the compiler would ICE if it ever + // encountered this situation. + // It is OK to use the /vmg option if /vmm or /vms is specified. + + // Fortunately, the wrong function is only called in very obscure cases. + // It only occurs when a derived class overrides a virtual function declared + // in a virtual base class, and the member function + // points to the *Derived* version of that function. The problem can be + // completely averted in 100% of cases by using the *Base class* for the + // member fpointer. Ie, if you use the base class as an interface, you'll + // stay out of trouble. + // Occasionally, you might want to point directly to a derived class function + // that isn't an override of a base class. In this case, both vtable_index + // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. + // We can generate correct code in this case. To prevent an incorrect call from + // ever being made, on MSVC6 we generate a warning, and call a function to + // make the program crash instantly. + typedef char ERROR_VC6CompilerBug[-100]; + return 0; + } +}; + + +#else + +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +// unknown_inheritance classes go here +// This is probably the ugliest bit of code I've ever written. Look at the casts! +// There is a compiler bug in MSVC6 which prevents it from using this code. +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // The member function pointer is 16 bytes long. We can't use a normal cast, but + // we can use a union to do the conversion. + union { + XFuncType func; + // In VC++ and ICL, an unknown_inheritance member pointer + // is internally defined as: + struct { + GenericMemFuncType m_funcaddress; // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtordisp; // #bytes to add to 'this' to find the vtable + int vtable_index; // or 0 if no virtual inheritance + } s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + int virtual_delta = 0; + if (u.s.vtable_index) { // Virtual inheritance is used + // First, get to the vtable. + // It is 'vtordisp' bytes from the start of the class. + const int * vtable = *reinterpret_cast( + reinterpret_cast(pthis) + u.s.vtordisp ); + + // 'vtable_index' tells us where in the table we should be looking. + virtual_delta = u.s.vtordisp + *reinterpret_cast( + reinterpret_cast(vtable) + u.s.vtable_index); + } + // The int at 'virtual_delta' gives us the amount to add to 'this'. + // Finally we can add the three components together. Phew! + return reinterpret_cast( + reinterpret_cast(pthis) + u.s.delta + virtual_delta); + }; +}; +#endif // MSVC 7 and greater + +#endif // MS/Intel hacks + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 2: +// +// Define the delegate storage, and cope with static functions +// +//////////////////////////////////////////////////////////////////////////////// + +// DelegateMemento -- an opaque structure which can hold an arbitary delegate. +// It knows nothing about the calling convention or number of arguments used by +// the function pointed to. +// It supplies comparison operators so that it can be stored in STL collections. +// It cannot be set to anything other than null, nor invoked directly: +// it must be converted to a specific delegate. + +// Implementation: +// There are two possible implementations: the Safe method and the Evil method. +// DelegateMemento - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// A static function pointer is stored inside the class. +// Here are the valid values: +// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ +// | 0 | 0 | 0 | Empty | +// | !=0 |(dontcare)| Invoker | Static function| +// | 0 | !=0 | !=0* | Method call | +// +--------------------+----------+------------+----------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// When stored stored inside a specific delegate, the 'dontcare' entries are replaced +// with a reference to the delegate itself. This complicates the = and == operators +// for the delegate class. + +// DelegateMemento - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. In this case the DelegateMemento implementation is simple: +// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ +// | 0 | 0 | Empty | +// | !=0 | !=0* | Static function or method call| +// +----------+------------+-------------------------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + +class DelegateMemento { +protected: + // the data is protected, not private, because many + // compilers have problems with template friends. + typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. + detail::GenericClass *m_pthis; + GenericMemFuncType m_pFunction; + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + typedef void (*GenericFuncPtr)(); // arbitrary code pointer + GenericFuncPtr m_pStaticFunction; +#endif + +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; + void clear() { + m_pthis=0; m_pFunction=0; m_pStaticFunction=0; + } +#else + DelegateMemento() : m_pthis(0), m_pFunction(0) {}; + void clear() { m_pthis=0; m_pFunction=0; } +#endif +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + inline bool IsEqual (const DelegateMemento &x) const{ + // We have to cope with the static function pointers as a special case + if (m_pFunction!=x.m_pFunction) return false; + // the static function ptrs must either both be equal, or both be 0. + if (m_pStaticFunction!=x.m_pStaticFunction) return false; + if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; + else return true; + } +#else // Evil Method + inline bool IsEqual (const DelegateMemento &x) const{ + return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; + } +#endif + // Provide a strict weak ordering for DelegateMementos. + inline bool IsLess(const DelegateMemento &right) const { + // deal with static function pointers first +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) + return m_pStaticFunction < right.m_pStaticFunction; +#endif + if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; + // There are no ordering operators for member function pointers, + // but we can fake one by comparing each byte. The resulting ordering is + // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. + return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; + + } + // BUGFIX (Mar 2005): + // We can't just compare m_pFunction because on Metrowerks, + // m_pFunction can be zero even if the delegate is not empty! + inline bool operator ! () const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } + inline bool empty() const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } +public: + DelegateMemento & operator = (const DelegateMemento &right) { + SetMementoFrom(right); + return *this; + } + inline bool operator <(const DelegateMemento &right) { + return IsLess(right); + } + inline bool operator >(const DelegateMemento &right) { + return right.IsLess(*this); + } + DelegateMemento (const DelegateMemento &right) : + m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + , m_pStaticFunction (right.m_pStaticFunction) +#endif + {} +protected: + void SetMementoFrom(const DelegateMemento &right) { + m_pFunction = right.m_pFunction; + m_pthis = right.m_pthis; +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = right.m_pStaticFunction; +#endif + } +}; + + +// ClosurePtr<> +// +// A private wrapper class that adds function signatures to DelegateMemento. +// It's the class that does most of the actual work. +// The signatures are specified by: +// GenericMemFunc: must be a type of GenericClass member function pointer. +// StaticFuncPtr: must be a type of function pointer with the same signature +// as GenericMemFunc. +// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 +// where it never returns void (returns DefaultVoid instead). + +// An outer class, FastDelegateN<>, handles the invoking and creates the +// necessary typedefs. +// This class does everything else. + +namespace detail { + +template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> +class ClosurePtr : public DelegateMemento { +public: + // These functions are for setting the delegate to a member function. + + // Here's the clever bit: we convert an arbitrary member function into a + // standard form. XMemFunc should be a member function of class X, but I can't + // enforce that here. It needs to be enforced by the wrapper class. + template < class X, class XMemFunc > + inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { + m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(pthis, function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } + // For const member functions, we only need a const class pointer. + // Since we know that the member function is const, it's safe to + // remove the const qualifier from the 'this' pointer with a const_cast. + // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. + template < class X, class XMemFunc> + inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { + m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(const_cast(pthis), function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates + template < class X, class XMemFunc> + inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { + bindconstmemfunc(pthis, function_to_bind); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#endif + // These functions are required for invoking the stored function + inline GenericClass *GetClosureThis() const { return m_pthis; } + inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } + +// There are a few ways of dealing with static function pointers. +// There's a standard-compliant, but tricky method. +// There's also a straightforward hack, that won't work on DOS compilers using the +// medium memory model. It's so evil that I can't recommend it, but I've +// implemented it anyway because it produces very nice asm code. + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + +// ClosurePtr<> - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// I store the function pointer inside the class, and the delegate then +// points to itself. Whenever the delegate is copied, these self-references +// must be transformed, and this complicates the = and == operators. +public: + // The next two functions are for operator ==, =, and the copy constructor. + // We may need to convert the m_pthis pointers, so that + // they remain as self-references. + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { + SetMementoFrom(x); + if (m_pStaticFunction!=0) { + // transform self references... + m_pthis=reinterpret_cast(pParent); + } + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + template < class DerivedClass, class ParentInvokerSig > + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind ) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + bindmemfunc(pParent, static_function_invoker); + } + m_pStaticFunction=reinterpret_cast(function_to_bind); + } + inline UnvoidStaticFuncPtr GetStaticFunction() const { + return reinterpret_cast(m_pStaticFunction); + } +#else + +// ClosurePtr<> - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and +// speeds up comparison and assignment. If C++ provided direct language support +// for delegates, they would produce asm code that was almost identical to this. +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { + SetMementoFrom(right); + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + // ******** EVIL, EVIL CODE! ******* + template < class DerivedClass, class ParentInvokerSig> + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + // We'll be ignoring the 'this' pointer, but we need to make sure we pass + // a valid value to bindmemfunc(). + bindmemfunc(pParent, static_function_invoker); + } + + // WARNING! Evil hack. We store the function in the 'this' pointer! + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; + m_pthis = horrible_cast(function_to_bind); + // MSVC, SunC++ and DMC accept the following (non-standard) code: +// m_pthis = static_cast(static_cast(function_to_bind)); + // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long +// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); + } + // ******** EVIL, EVIL CODE! ******* + // This function will be called with an invalid 'this' pointer!! + // We're just returning the 'this' pointer, converted into + // a function pointer! + inline UnvoidStaticFuncPtr GetStaticFunction() const { + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; + return horrible_cast(this); + } +#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + + // Does the closure contain this static function? + inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ + if (funcptr==0) return empty(); + // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary + // value that is not equal to any valid function pointer. + else return funcptr==reinterpret_cast(GetStaticFunction()); + } +}; + + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 3: +// +// Wrapper classes to ensure type safety +// +//////////////////////////////////////////////////////////////////////////////// + + +// Once we have the member function conversion templates, it's easy to make the +// wrapper classes. So that they will work with as many compilers as possible, +// the classes are of the form +// FastDelegate3 +// They can cope with any combination of parameters. The max number of parameters +// allowed is 8, but it is trivial to increase this limit. +// Note that we need to treat const member functions seperately. +// All this class does is to enforce type safety, and invoke the delegate with +// the correct list of parameters. + +// Because of the weird rule about the class of derived member function pointers, +// you sometimes need to apply a downcast to the 'this' pointer. +// This is the reason for the use of "implicit_cast(pthis)" in the code below. +// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, +// without this trick you'd need to write: +// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); +// but with the trick you can write +// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); + +// RetType is the type the compiler uses in compiling the template. For VC6, +// it cannot be void. DesiredRetType is the real type which is returned from +// all of the functions. It can be void. + +// Implicit conversion to "bool" is achieved using the safe_bool idiom, +// using member data pointers (MDP). This allows "if (dg)..." syntax +// Because some compilers (eg codeplay) don't have a unique value for a zero +// MDP, an extra padding member is added to the SafeBool struct. +// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so +// in that case the static function constructor is not made explicit; this +// allows "if (dg==0) ..." to compile. + +//N=0 +template +class FastDelegate0 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(); + typedef RetType (*UnvoidStaticFunctionPtr)(); + typedef RetType (detail::GenericClass::*GenericMemFn)(); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate0 type; + + // Construction and comparison functions + FastDelegate0() { clear(); } + FastDelegate0(const FastDelegate0 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate0 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate0 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate0 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate0 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate0 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate0(DesiredRetType (*function_to_bind)() ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)() ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)()) { + m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() () const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction() const { + return (*(m_Closure.GetStaticFunction()))(); } +}; + +//N=1 +template +class FastDelegate1 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate1 type; + + // Construction and comparison functions + FastDelegate1() { clear(); } + FastDelegate1(const FastDelegate1 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate1 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate1 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate1 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate1 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate1 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) { + m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1) const { + return (*(m_Closure.GetStaticFunction()))(p1); } +}; + +//N=2 +template +class FastDelegate2 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate2 type; + + // Construction and comparison functions + FastDelegate2() { clear(); } + FastDelegate2(const FastDelegate2 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate2 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate2 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate2 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate2 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate2 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) { + m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2); } +}; + +//N=3 +template +class FastDelegate3 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate3 type; + + // Construction and comparison functions + FastDelegate3() { clear(); } + FastDelegate3(const FastDelegate3 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate3 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate3 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate3 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate3 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate3 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate3(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate3(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate3(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { + m_Closure.bindstaticfunc(this, &FastDelegate3::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3); } +}; + +//N=4 +template +class FastDelegate4 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate4 type; + + // Construction and comparison functions + FastDelegate4() { clear(); } + FastDelegate4(const FastDelegate4 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate4 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate4 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate4 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate4 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate4 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate4(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate4(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate4(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + m_Closure.bindstaticfunc(this, &FastDelegate4::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4); } +}; + +//N=5 +template +class FastDelegate5 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate5 type; + + // Construction and comparison functions + FastDelegate5() { clear(); } + FastDelegate5(const FastDelegate5 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate5 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate5 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate5 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate5 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate5 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate5(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate5(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate5(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + m_Closure.bindstaticfunc(this, &FastDelegate5::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5); } +}; + +//N=6 +template +class FastDelegate6 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate6 type; + + // Construction and comparison functions + FastDelegate6() { clear(); } + FastDelegate6(const FastDelegate6 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate6 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate6 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate6 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate6 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate6 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate6(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate6(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate6(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + m_Closure.bindstaticfunc(this, &FastDelegate6::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6); } +}; + +//N=7 +template +class FastDelegate7 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate7 type; + + // Construction and comparison functions + FastDelegate7() { clear(); } + FastDelegate7(const FastDelegate7 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate7 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate7 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate7 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate7 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate7 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate7(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate7(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate7(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + m_Closure.bindstaticfunc(this, &FastDelegate7::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7); } +}; + +//N=8 +template +class FastDelegate8 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate8 type; + + // Construction and comparison functions + FastDelegate8() { clear(); } + FastDelegate8(const FastDelegate8 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate8 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate8 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate8 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate8 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate8 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate8(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate8(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate8(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + m_Closure.bindstaticfunc(this, &FastDelegate8::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8); } +}; + +//N=9 +template +class FastDelegate9 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate9 type; + + // Construction and comparison functions + FastDelegate9() { clear(); } + FastDelegate9(const FastDelegate9 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate9 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate9 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate9 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate9 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate9 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate9(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate9(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate9(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { + m_Closure.bindstaticfunc(this, &FastDelegate9::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } +}; + +//N=10 +template +class FastDelegate10 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate10 type; + + // Construction and comparison functions + FastDelegate10() { clear(); } + FastDelegate10(const FastDelegate10 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate10 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate10 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate10 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate10 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate10 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate10(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate10(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate10(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { + m_Closure.bindstaticfunc(this, &FastDelegate10::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } +}; + +//N=11 +template +class FastDelegate11 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate11 type; + + // Construction and comparison functions + FastDelegate11() { clear(); } + FastDelegate11(const FastDelegate11 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate11 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate11 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate11 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate11 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate11 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate11(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate11(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate11(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { + m_Closure.bindstaticfunc(this, &FastDelegate11::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } +}; + +//N=12 +template +class FastDelegate12 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate12 type; + + // Construction and comparison functions + FastDelegate12() { clear(); } + FastDelegate12(const FastDelegate12 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate12 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate12 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate12 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate12 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate12 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate12(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate12(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate12(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { + m_Closure.bindstaticfunc(this, &FastDelegate12::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } +}; + +//N=13 +template +class FastDelegate13 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate13 type; + + // Construction and comparison functions + FastDelegate13() { clear(); } + FastDelegate13(const FastDelegate13 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate13 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate13 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate13 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate13 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate13 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate13(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate13(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate13(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { + m_Closure.bindstaticfunc(this, &FastDelegate13::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } +}; + +//N=14 +template +class FastDelegate14 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate14 type; + + // Construction and comparison functions + FastDelegate14() { clear(); } + FastDelegate14(const FastDelegate14 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate14 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate14 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate14 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate14 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate14 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate14(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate14(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate14(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { + m_Closure.bindstaticfunc(this, &FastDelegate14::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } +}; + +//N=15 +template +class FastDelegate15 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate15 type; + + // Construction and comparison functions + FastDelegate15() { clear(); } + FastDelegate15(const FastDelegate15 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate15 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate15 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate15 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate15 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate15 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate15(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate15(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate15(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { + m_Closure.bindstaticfunc(this, &FastDelegate15::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } +}; + +//N=16 +template +class FastDelegate16 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate16 type; + + // Construction and comparison functions + FastDelegate16() { clear(); } + FastDelegate16(const FastDelegate16 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate16 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate16 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate16 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate16 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate16 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate16(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate16(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate16(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { + m_Closure.bindstaticfunc(this, &FastDelegate16::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } +}; + +//N=17 +template +class FastDelegate17 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate17 type; + + // Construction and comparison functions + FastDelegate17() { clear(); } + FastDelegate17(const FastDelegate17 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate17 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate17 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate17 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate17 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate17 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate17(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate17(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate17(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { + m_Closure.bindstaticfunc(this, &FastDelegate17::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } +}; + +//N=18 +template +class FastDelegate18 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate18 type; + + // Construction and comparison functions + FastDelegate18() { clear(); } + FastDelegate18(const FastDelegate18 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate18 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate18 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate18 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate18 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate18 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate18(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate18(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate18(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { + m_Closure.bindstaticfunc(this, &FastDelegate18::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } +}; + +//N=19 +template +class FastDelegate19 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate19 type; + + // Construction and comparison functions + FastDelegate19() { clear(); } + FastDelegate19(const FastDelegate19 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate19 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate19 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate19 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate19 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate19 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate19(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate19(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate19(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { + m_Closure.bindstaticfunc(this, &FastDelegate19::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } +}; + +//N=20 +template +class FastDelegate20 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate20 type; + + // Construction and comparison functions + FastDelegate20() { clear(); } + FastDelegate20(const FastDelegate20 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate20 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate20 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate20 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate20 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate20 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate20(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate20(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate20(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { + m_Closure.bindstaticfunc(this, &FastDelegate20::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } +}; + + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 4: +// +// FastDelegate<> class (Original author: Jody Hagins) +// Allows boost::function style syntax like: +// FastDelegate< double (int, long) > +// instead of: +// FastDelegate2< int, long, double > +// +//////////////////////////////////////////////////////////////////////////////// + +#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +// Declare FastDelegate as a class template. It will be specialized +// later for all number of arguments. +template +class FastDelegate; + +//N=0 +// Specialization to allow use of +// FastDelegate< R ( ) > +// instead of +// FastDelegate0 < R > +template +class FastDelegate< R ( ) > + // Inherit from FastDelegate0 so that it can be treated just like a FastDelegate0 + : public FastDelegate0 < R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate0 < R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=1 +// Specialization to allow use of +// FastDelegate< R ( Param1 ) > +// instead of +// FastDelegate1 < Param1, R > +template +class FastDelegate< R ( Param1 ) > + // Inherit from FastDelegate1 so that it can be treated just like a FastDelegate1 + : public FastDelegate1 < Param1, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate1 < Param1, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=2 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2 ) > +// instead of +// FastDelegate2 < Param1, Param2, R > +template +class FastDelegate< R ( Param1, Param2 ) > + // Inherit from FastDelegate2 so that it can be treated just like a FastDelegate2 + : public FastDelegate2 < Param1, Param2, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate2 < Param1, Param2, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=3 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3 ) > +// instead of +// FastDelegate3 < Param1, Param2, Param3, R > +template +class FastDelegate< R ( Param1, Param2, Param3 ) > + // Inherit from FastDelegate3 so that it can be treated just like a FastDelegate3 + : public FastDelegate3 < Param1, Param2, Param3, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate3 < Param1, Param2, Param3, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=4 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4 ) > +// instead of +// FastDelegate4 < Param1, Param2, Param3, Param4, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4 ) > + // Inherit from FastDelegate4 so that it can be treated just like a FastDelegate4 + : public FastDelegate4 < Param1, Param2, Param3, Param4, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate4 < Param1, Param2, Param3, Param4, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=5 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > +// instead of +// FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > + // Inherit from FastDelegate5 so that it can be treated just like a FastDelegate5 + : public FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=6 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > +// instead of +// FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > + // Inherit from FastDelegate6 so that it can be treated just like a FastDelegate6 + : public FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=7 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > +// instead of +// FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > + // Inherit from FastDelegate7 so that it can be treated just like a FastDelegate7 + : public FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=8 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > +// instead of +// FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > + // Inherit from FastDelegate8 so that it can be treated just like a FastDelegate8 + : public FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=9 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > +// instead of +// FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > + // Inherit from FastDelegate9 so that it can be treated just like a FastDelegate9 + : public FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=10 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > +// instead of +// FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > + // Inherit from FastDelegate10 so that it can be treated just like a FastDelegate10 + : public FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=11 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > +// instead of +// FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > + // Inherit from FastDelegate11 so that it can be treated just like a FastDelegate11 + : public FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=12 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > +// instead of +// FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > + // Inherit from FastDelegate12 so that it can be treated just like a FastDelegate12 + : public FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=13 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > +// instead of +// FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > + // Inherit from FastDelegate13 so that it can be treated just like a FastDelegate13 + : public FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=14 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > +// instead of +// FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > + // Inherit from FastDelegate14 so that it can be treated just like a FastDelegate14 + : public FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=15 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > +// instead of +// FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > + // Inherit from FastDelegate15 so that it can be treated just like a FastDelegate15 + : public FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=16 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > +// instead of +// FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > + // Inherit from FastDelegate16 so that it can be treated just like a FastDelegate16 + : public FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=17 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > +// instead of +// FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > + // Inherit from FastDelegate17 so that it can be treated just like a FastDelegate17 + : public FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=18 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > +// instead of +// FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > + // Inherit from FastDelegate18 so that it can be treated just like a FastDelegate18 + : public FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=19 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > +// instead of +// FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > + // Inherit from FastDelegate19 so that it can be treated just like a FastDelegate19 + : public FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=20 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > +// instead of +// FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > + // Inherit from FastDelegate20 so that it can be treated just like a FastDelegate20 + : public FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + + +#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 5: +// +// MakeDelegate() helper function +// +// MakeDelegate(&x, &X::func) returns a fastdelegate of the type +// necessary for calling x.func() with the correct number of arguments. +// This makes it possible to eliminate many typedefs from user code. +// +//////////////////////////////////////////////////////////////////////////////// + +// Also declare overloads of a MakeDelegate() global function to +// reduce the need for typedefs. +// We need seperate overloads for const and non-const member functions. +// Also, because of the weird rule about the class of derived member function pointers, +// implicit downcasts may need to be applied later to the 'this' pointer. +// That's why two classes (X and Y) appear in the definitions. Y must be implicitly +// castable to X. + +// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. +// GCC 3.2 and later won't compile this unless it's preceded by 'typename', +// but VC6 doesn't allow 'typename' in this context. +// So, I have to use a macro. + +#ifdef FASTDLGT_VC6 +#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type +#else +#define FASTDLGT_RETTYPE RetType +#endif + +//N=0 +template +FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)()) { + return FastDelegate0(x, func); +} + +template +FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)() const) { + return FastDelegate0(x, func); +} + +template +FastDelegate0 MakeDelegate(RetType (*func)()) { + return FastDelegate0(func); +} + +//N=1 +template +FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1)) { + return FastDelegate1(x, func); +} + +template +FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1) const) { + return FastDelegate1(x, func); +} + +template +FastDelegate1 MakeDelegate(RetType (*func)(Param1 p1)) { + return FastDelegate1(func); +} + +//N=2 +template +FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2)) { + return FastDelegate2(x, func); +} + +template +FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2) const) { + return FastDelegate2(x, func); +} + +template +FastDelegate2 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2)) { + return FastDelegate2(func); +} + +//N=3 +template +FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3)) { + return FastDelegate3(x, func); +} + +template +FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3) const) { + return FastDelegate3(x, func); +} + +template +FastDelegate3 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3)) { + return FastDelegate3(func); +} + +//N=4 +template +FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + return FastDelegate4(x, func); +} + +template +FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + return FastDelegate4(x, func); +} + +template +FastDelegate4 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + return FastDelegate4(func); +} + +//N=5 +template +FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + return FastDelegate5(x, func); +} + +template +FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + return FastDelegate5(x, func); +} + +template +FastDelegate5 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + return FastDelegate5(func); +} + +//N=6 +template +FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + return FastDelegate6(x, func); +} + +template +FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + return FastDelegate6(x, func); +} + +template +FastDelegate6 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + return FastDelegate6(func); +} + +//N=7 +template +FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + return FastDelegate7(x, func); +} + +template +FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + return FastDelegate7(x, func); +} + +template +FastDelegate7 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + return FastDelegate7(func); +} + +//N=8 +template +FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + return FastDelegate8(x, func); +} + +template +FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + return FastDelegate8(x, func); +} + +template +FastDelegate8 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + return FastDelegate8(func); +} + +//N=9 +template +FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { + return FastDelegate9(x, func); +} + +template +FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { + return FastDelegate9(x, func); +} + +template +FastDelegate9 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { + return FastDelegate9(func); +} + +//N=10 +template +FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { + return FastDelegate10(x, func); +} + +template +FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { + return FastDelegate10(x, func); +} + +template +FastDelegate10 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { + return FastDelegate10(func); +} + +//N=11 +template +FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { + return FastDelegate11(x, func); +} + +template +FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { + return FastDelegate11(x, func); +} + +template +FastDelegate11 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { + return FastDelegate11(func); +} + +//N=12 +template +FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { + return FastDelegate12(x, func); +} + +template +FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { + return FastDelegate12(x, func); +} + +template +FastDelegate12 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { + return FastDelegate12(func); +} + +//N=13 +template +FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { + return FastDelegate13(x, func); +} + +template +FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { + return FastDelegate13(x, func); +} + +template +FastDelegate13 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { + return FastDelegate13(func); +} + +//N=14 +template +FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { + return FastDelegate14(x, func); +} + +template +FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { + return FastDelegate14(x, func); +} + +template +FastDelegate14 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { + return FastDelegate14(func); +} + +//N=15 +template +FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { + return FastDelegate15(x, func); +} + +template +FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { + return FastDelegate15(x, func); +} + +template +FastDelegate15 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { + return FastDelegate15(func); +} + +//N=16 +template +FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { + return FastDelegate16(x, func); +} + +template +FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { + return FastDelegate16(x, func); +} + +template +FastDelegate16 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { + return FastDelegate16(func); +} + +//N=17 +template +FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { + return FastDelegate17(x, func); +} + +template +FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { + return FastDelegate17(x, func); +} + +template +FastDelegate17 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { + return FastDelegate17(func); +} + +//N=18 +template +FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { + return FastDelegate18(x, func); +} + +template +FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { + return FastDelegate18(x, func); +} + +template +FastDelegate18 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { + return FastDelegate18(func); +} + +//N=19 +template +FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { + return FastDelegate19(x, func); +} + +template +FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { + return FastDelegate19(x, func); +} + +template +FastDelegate19 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { + return FastDelegate19(func); +} + +//N=20 +template +FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { + return FastDelegate20(x, func); +} + +template +FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { + return FastDelegate20(x, func); +} + +template +FastDelegate20 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { + return FastDelegate20(func); +} + + + // clean up after ourselves... +#undef FASTDLGT_RETTYPE + +} // namespace fastdelegate + +#endif // !defined(FASTDELEGATE_H) diff --git a/sourcehook/generate/FastDelegate.hxx b/sourcehook/generate/FastDelegate.hxx new file mode 100644 index 0000000..6f2fe49 --- /dev/null +++ b/sourcehook/generate/FastDelegate.hxx @@ -0,0 +1,1054 @@ +// FastDelegate.h +// Efficient delegates in C++ that generate only two lines of asm code! +// Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp +// +// - Don Clugston, Mar 2004. +// Major contributions were made by Jody Hagins. +// History: +// 24-Apr-04 1.0 * Submitted to CodeProject. +// 28-Apr-04 1.1 * Prevent most unsafe uses of evil static function hack. +// * Improved syntax for horrible_cast (thanks Paul Bludov). +// * Tested on Metrowerks MWCC and Intel ICL (IA32) +// * Compiled, but not run, on Comeau C++ and Intel Itanium ICL. +// 27-Jun-04 1.2 * Now works on Borland C++ Builder 5.5 +// * Now works on /clr "managed C++" code on VC7, VC7.1 +// * Comeau C++ now compiles without warnings. +// * Prevent the virtual inheritance case from being used on +// VC6 and earlier, which generate incorrect code. +// * Improved warning and error messages. Non-standard hacks +// now have compile-time checks to make them safer. +// * implicit_cast used instead of static_cast in many cases. +// * If calling a const member function, a const class pointer can be used. +// * MakeDelegate() global helper function added to simplify pass-by-value. +// * Added fastdelegate.clear() +// 16-Jul-04 1.2.1* Workaround for gcc bug (const member function pointers in templates) +// 30-Oct-04 1.3 * Support for (non-void) return values. +// * No more workarounds in client code! +// MSVC and Intel now use a clever hack invented by John Dlugosz: +// - The FASTDELEGATEDECLARE workaround is no longer necessary. +// - No more warning messages for VC6 +// * Less use of macros. Error messages should be more comprehensible. +// * Added include guards +// * Added FastDelegate::empty() to test if invocation is safe (Thanks Neville Franks). +// * Now tested on VS 2005 Express Beta, PGI C++ +// 24-Dec-04 1.4 * Added DelegateMemento, to allow collections of disparate delegates. +// * <,>,<=,>= comparison operators to allow storage in ordered containers. +// * Substantial reduction of code size, especially the 'Closure' class. +// * Standardised all the compiler-specific workarounds. +// * MFP conversion now works for CodePlay (but not yet supported in the full code). +// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 +// * New syntax: FastDelegate< int (char *, double) >. +// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). +// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. +// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" +// * Fully supported by CodePlay VectorC +// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! +// * More optimal assignment,== and != operators for static function pointers. + +#ifndef FASTDELEGATE_H +#define FASTDELEGATE_H + +#ifdef _MSC_VER +# if _MSC_VER > 1000 +# pragma once +# endif // _MSC_VER > 1000 +#endif // #ifdef _MSC_VER + +#include // to allow <,> comparisons + +//////////////////////////////////////////////////////////////////////////////// +// Configuration options +// +//////////////////////////////////////////////////////////////////////////////// + +// Uncomment the following #define for optimally-sized delegates. +// In this case, the generated asm code is almost identical to the code you'd get +// if the compiler had native support for delegates. +// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). +// Thus, it will not work for DOS compilers using the medium model. +// It will also probably fail on some DSP systems. +#define FASTDELEGATE_USESTATICFUNCTIONHACK + +// Uncomment the next line to allow function declarator syntax. +// It is automatically enabled for those compilers where it is known to work. +//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Compiler identification for workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Compiler identification. It's not easy to identify Visual C++ because +// many vendors fraudulently define Microsoft's identifiers. +#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) +#define FASTDLGT_ISMSVC + +#if (_MSC_VER <1300) // Many workarounds are required for VC6. +#define FASTDLGT_VC6 +#pragma warning(disable:4786) // disable this ridiculous warning +#endif + +#endif + +// Does the compiler uses Microsoft's member function pointer structure? +// If so, it needs special treatment. +// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's +// identifier, _MSC_VER. We need to filter Metrowerks out. +#if defined(_MSC_VER) && !defined(__MWERKS__) +#define FASTDLGT_MICROSOFT_MFP + +#if !defined(__VECTOR_C) +// CodePlay doesn't have the __single/multi/virtual_inheritance keywords +#define FASTDLGT_HASINHERITANCE_KEYWORDS +#endif +#endif + +// Does it allow function declarator syntax? The following compilers are known to work: +#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. +#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. +#if defined (__MWERKS__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +#ifdef __GNUC__ // Workaround GCC bug #8271 + // At present, GCC doesn't recognize constness of MFPs in templates +#define FASTDELEGATE_GCC_BUG_8271 +#endif + + + +//////////////////////////////////////////////////////////////////////////////// +// General tricks used in this code +// +// (a) Error messages are generated by typdefing an array of negative size to +// generate compile-time errors. +// (b) Warning messages on MSVC are generated by declaring unused variables, and +// enabling the "variable XXX is never used" warning. +// (c) Unions are used in a few compiler-specific cases to perform illegal casts. +// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to +// (char *) first to ensure that the correct number of *bytes* are added. +// +//////////////////////////////////////////////////////////////////////////////// +// Helper templates +// +//////////////////////////////////////////////////////////////////////////////// + + +namespace fastdelegate { +namespace detail { // we'll hide the implementation details in a nested namespace. + +// implicit_cast< > +// I believe this was originally going to be in the C++ standard but +// was left out by accident. It's even milder than static_cast. +// I use it instead of static_cast<> to emphasize that I'm not doing +// anything nasty. +// Usage is identical to static_cast<> +template +inline OutputClass implicit_cast(InputClass input){ + return input; +} + +// horrible_cast< > +// This is truly evil. It completely subverts C++'s type system, allowing you +// to cast from any class to any other class. Technically, using a union +// to perform the cast is undefined behaviour (even in C). But we can see if +// it is OK by checking that the union is the same size as each of its members. +// horrible_cast<> should only be used for compiler-specific workarounds. +// Usage is identical to reinterpret_cast<>. + +// This union is declared outside the horrible_cast because BCC 5.5.1 +// can't inline a function with a nested class, and gives a warning. +template +union horrible_union{ + OutputClass out; + InputClass in; +}; + +template +inline OutputClass horrible_cast(const InputClass input){ + horrible_union u; + // Cause a compile-time error if in, out and u are not the same size. + // If the compile fails here, it means the compiler has peculiar + // unions which would prevent the cast from working. + typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) + && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; + u.in = input; + return u.out; +} + +//////////////////////////////////////////////////////////////////////////////// +// Workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Backwards compatibility: This macro used to be necessary in the virtual inheritance +// case for Intel and Microsoft. Now it just forward-declares the class. +#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; + +// Prevent use of the static function hack with the DOS medium model. +#ifdef __MEDIUM__ +#undef FASTDELEGATE_USESTATICFUNCTIONHACK +#endif + +// DefaultVoid - a workaround for 'void' templates in VC6. +// +// (1) VC6 and earlier do not allow 'void' as a default template argument. +// (2) They also doesn't allow you to return 'void' from a function. +// +// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use +// when we'd like to use 'void'. We convert it into 'void' and back +// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. +// Workaround for (2): On VC6, the code for calling a void function is +// identical to the code for calling a non-void function in which the +// return value is never used, provided the return value is returned +// in the EAX register, rather than on the stack. +// This is true for most fundamental types such as int, enum, void *. +// Const void * is the safest option since it doesn't participate +// in any automatic conversions. But on a 16-bit compiler it might +// cause extra code to be generated, so we disable it for all compilers +// except for VC6 (and VC5). +#ifdef FASTDLGT_VC6 +// VC6 workaround +typedef const void * DefaultVoid; +#else +// On any other compiler, just use a normal void. +typedef void DefaultVoid; +#endif + +// Translate from 'DefaultVoid' to 'void'. +// Everything else is unchanged +template +struct DefaultVoidToVoid { typedef T type; }; + +template <> +struct DefaultVoidToVoid { typedef void type; }; + +// Translate from 'void' into 'DefaultVoid' +// Everything else is unchanged +template +struct VoidToDefaultVoid { typedef T type; }; + +template <> +struct VoidToDefaultVoid { typedef DefaultVoid type; }; + + + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1: +// +// Conversion of member function pointer to a standard form +// +//////////////////////////////////////////////////////////////////////////////// + +// GenericClass is a fake class, ONLY used to provide a type. +// It is vitally important that it is never defined, so that the compiler doesn't +// think it can optimize the invocation. For example, Borland generates simpler +// code if it knows the class only uses single inheritance. + +// Compilers using Microsoft's structure need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS + // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP + // (4 bytes), even when the /vmg option is used. Declaring an empty class + // would give 16 byte pointers in this case.... + class __single_inheritance GenericClass; +#endif + // ...but for Codeplay, an empty class *always* gives 4 byte pointers. + // If compiled with the /clr option ("managed C++"), the JIT compiler thinks + // it needs to load GenericClass before it can call any of its functions, + // (compiles OK but crashes at runtime!), so we need to declare an + // empty class to make it happy. + // Codeplay and VC4 can't cope with the unknown_inheritance case either. + class GenericClass {}; +#else + class GenericClass; +#endif + +// The size of a single inheritance member function pointer. +const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); + +// SimplifyMemFunc< >::Convert() +// +// A template function that converts an arbitrary member function pointer into the +// simplest possible form of member function pointer, using a supplied 'this' pointer. +// According to the standard, this can be done legally with reinterpret_cast<>. +// For (non-standard) compilers which use member function pointers which vary in size +// depending on the class, we need to use knowledge of the internal structure of a +// member function pointer, as used by the compiler. Template specialization is used +// to distinguish between the sizes. Because some compilers don't support partial +// template specialisation, I use full specialisation of a wrapper struct. + +// general case -- don't know how to convert it. Force a compile failure +template +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // Unsupported member function type -- force a compile failure. + // (it's illegal to have a array with negative size). + typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; + return 0; + } +}; + +// For compilers where all member func ptrs are the same size, everything goes here. +// For non-standard compilers, only single_inheritance classes go here. +template <> +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { +#if defined __DMC__ + // Digital Mars doesn't allow you to cast between abitrary PMF's, + // even though the standard says you can. The 32-bit compiler lets you + // static_cast through an int, but the DOS compiler doesn't. + bound_func = horrible_cast(function_to_bind); +#else + bound_func = reinterpret_cast(function_to_bind); +#endif + return reinterpret_cast(pthis); + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1b: +// +// Workarounds for Microsoft and Intel +// +//////////////////////////////////////////////////////////////////////////////// + + +// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), +// need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) +// at the start of each function for extra safety, but VC6 seems to ICE +// intermittently if you do this inside a template. + +// __multiple_inheritance classes go here +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +template<> +struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // We need to use a horrible_cast to do this conversion. + // In MSVC, a multiple inheritance member pointer is internally defined as: + union { + XFuncType func; + struct { + GenericMemFuncType funcaddress; // points to the actual member function + int delta; // #BYTES to be added to the 'this' pointer + }s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); + } +}; + +// virtual inheritance is a real nuisance. It's inefficient and complicated. +// On MSVC and Intel, there isn't enough information in the pointer itself to +// enable conversion to a closure pointer. Earlier versions of this code didn't +// work for all cases, and generated a compile-time error instead. +// But a very clever hack invented by John M. Dlugosz solves this problem. +// My code is somewhat different to his: I have no asm code, and I make no +// assumptions about the calling convention that is used. + +// In VC++ and ICL, a virtual_inheritance member pointer +// is internally defined as: +struct MicrosoftVirtualMFP { + void (GenericClass::*codeptr)(); // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtable_index; // or 0 if no virtual inheritance +}; +// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the +// m_codeptr member is *always* called, regardless of the values of the other +// members. (This is *not* true for other compilers, eg GCC, which obtain the +// function address from the vtable if a virtual function is being called). +// Dlugosz's trick is to make the codeptr point to a probe function which +// returns the 'this' pointer that was used. + +// Define a generic class that uses virtual inheritance. +// It has a trival member function that returns the value of the 'this' pointer. +struct GenericVirtualClass : virtual public GenericClass +{ + typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); + GenericVirtualClass * GetThis() { return this; } +}; + +// __virtual_inheritance classes go here +template <> +struct SimplifyMemFunc +{ + + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + union { + XFuncType func; + GenericClass* (X::*ProbeFunc)(); + MicrosoftVirtualMFP s; + } u; + u.func = function_to_bind; + bound_func = reinterpret_cast(u.s.codeptr); + union { + GenericVirtualClass::ProbePtrType virtfunc; + MicrosoftVirtualMFP s; + } u2; + // Check that the horrible_cast<>s will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) + && sizeof(function_to_bind)==sizeof(u.ProbeFunc) + && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; + // Unfortunately, taking the address of a MF prevents it from being inlined, so + // this next line can't be completely optimised away by the compiler. + u2.virtfunc = &GenericVirtualClass::GetThis; + u.s.codeptr = u2.s.codeptr; + return (pthis->*u.ProbeFunc)(); + } +}; + +#if (_MSC_VER <1300) + +// Nasty hack for Microsoft Visual C++ 6.0 +// unknown_inheritance classes go here +// There is a compiler bug in MSVC6 which generates incorrect code in this case!! +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // There is an apalling but obscure compiler bug in MSVC6 and earlier: + // vtable_index and 'vtordisp' are always set to 0 in the + // unknown_inheritance case! + // This means that an incorrect function could be called!!! + // Compiling with the /vmg option leads to potentially incorrect code. + // This is probably the reason that the IDE has a user interface for specifying + // the /vmg option, but it is disabled - you can only specify /vmg on + // the command line. In VC1.5 and earlier, the compiler would ICE if it ever + // encountered this situation. + // It is OK to use the /vmg option if /vmm or /vms is specified. + + // Fortunately, the wrong function is only called in very obscure cases. + // It only occurs when a derived class overrides a virtual function declared + // in a virtual base class, and the member function + // points to the *Derived* version of that function. The problem can be + // completely averted in 100% of cases by using the *Base class* for the + // member fpointer. Ie, if you use the base class as an interface, you'll + // stay out of trouble. + // Occasionally, you might want to point directly to a derived class function + // that isn't an override of a base class. In this case, both vtable_index + // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. + // We can generate correct code in this case. To prevent an incorrect call from + // ever being made, on MSVC6 we generate a warning, and call a function to + // make the program crash instantly. + typedef char ERROR_VC6CompilerBug[-100]; + return 0; + } +}; + + +#else + +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +// unknown_inheritance classes go here +// This is probably the ugliest bit of code I've ever written. Look at the casts! +// There is a compiler bug in MSVC6 which prevents it from using this code. +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // The member function pointer is 16 bytes long. We can't use a normal cast, but + // we can use a union to do the conversion. + union { + XFuncType func; + // In VC++ and ICL, an unknown_inheritance member pointer + // is internally defined as: + struct { + GenericMemFuncType m_funcaddress; // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtordisp; // #bytes to add to 'this' to find the vtable + int vtable_index; // or 0 if no virtual inheritance + } s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + int virtual_delta = 0; + if (u.s.vtable_index) { // Virtual inheritance is used + // First, get to the vtable. + // It is 'vtordisp' bytes from the start of the class. + const int * vtable = *reinterpret_cast( + reinterpret_cast(pthis) + u.s.vtordisp ); + + // 'vtable_index' tells us where in the table we should be looking. + virtual_delta = u.s.vtordisp + *reinterpret_cast( + reinterpret_cast(vtable) + u.s.vtable_index); + } + // The int at 'virtual_delta' gives us the amount to add to 'this'. + // Finally we can add the three components together. Phew! + return reinterpret_cast( + reinterpret_cast(pthis) + u.s.delta + virtual_delta); + }; +}; +#endif // MSVC 7 and greater + +#endif // MS/Intel hacks + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 2: +// +// Define the delegate storage, and cope with static functions +// +//////////////////////////////////////////////////////////////////////////////// + +// DelegateMemento -- an opaque structure which can hold an arbitary delegate. +// It knows nothing about the calling convention or number of arguments used by +// the function pointed to. +// It supplies comparison operators so that it can be stored in STL collections. +// It cannot be set to anything other than null, nor invoked directly: +// it must be converted to a specific delegate. + +// Implementation: +// There are two possible implementations: the Safe method and the Evil method. +// DelegateMemento - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// A static function pointer is stored inside the class. +// Here are the valid values: +// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ +// | 0 | 0 | 0 | Empty | +// | !=0 |(dontcare)| Invoker | Static function| +// | 0 | !=0 | !=0* | Method call | +// +--------------------+----------+------------+----------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// When stored stored inside a specific delegate, the 'dontcare' entries are replaced +// with a reference to the delegate itself. This complicates the = and == operators +// for the delegate class. + +// DelegateMemento - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. In this case the DelegateMemento implementation is simple: +// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ +// | 0 | 0 | Empty | +// | !=0 | !=0* | Static function or method call| +// +----------+------------+-------------------------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + +class DelegateMemento { +protected: + // the data is protected, not private, because many + // compilers have problems with template friends. + typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. + detail::GenericClass *m_pthis; + GenericMemFuncType m_pFunction; + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + typedef void (*GenericFuncPtr)(); // arbitrary code pointer + GenericFuncPtr m_pStaticFunction; +#endif + +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; + void clear() { + m_pthis=0; m_pFunction=0; m_pStaticFunction=0; + } +#else + DelegateMemento() : m_pthis(0), m_pFunction(0) {}; + void clear() { m_pthis=0; m_pFunction=0; } +#endif +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + inline bool IsEqual (const DelegateMemento &x) const{ + // We have to cope with the static function pointers as a special case + if (m_pFunction!=x.m_pFunction) return false; + // the static function ptrs must either both be equal, or both be 0. + if (m_pStaticFunction!=x.m_pStaticFunction) return false; + if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; + else return true; + } +#else // Evil Method + inline bool IsEqual (const DelegateMemento &x) const{ + return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; + } +#endif + // Provide a strict weak ordering for DelegateMementos. + inline bool IsLess(const DelegateMemento &right) const { + // deal with static function pointers first +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) + return m_pStaticFunction < right.m_pStaticFunction; +#endif + if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; + // There are no ordering operators for member function pointers, + // but we can fake one by comparing each byte. The resulting ordering is + // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. + return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; + + } + // BUGFIX (Mar 2005): + // We can't just compare m_pFunction because on Metrowerks, + // m_pFunction can be zero even if the delegate is not empty! + inline bool operator ! () const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } + inline bool empty() const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } +public: + DelegateMemento & operator = (const DelegateMemento &right) { + SetMementoFrom(right); + return *this; + } + inline bool operator <(const DelegateMemento &right) { + return IsLess(right); + } + inline bool operator >(const DelegateMemento &right) { + return right.IsLess(*this); + } + DelegateMemento (const DelegateMemento &right) : + m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + , m_pStaticFunction (right.m_pStaticFunction) +#endif + {} +protected: + void SetMementoFrom(const DelegateMemento &right) { + m_pFunction = right.m_pFunction; + m_pthis = right.m_pthis; +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = right.m_pStaticFunction; +#endif + } +}; + + +// ClosurePtr<> +// +// A private wrapper class that adds function signatures to DelegateMemento. +// It's the class that does most of the actual work. +// The signatures are specified by: +// GenericMemFunc: must be a type of GenericClass member function pointer. +// StaticFuncPtr: must be a type of function pointer with the same signature +// as GenericMemFunc. +// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 +// where it never returns void (returns DefaultVoid instead). + +// An outer class, FastDelegateN<>, handles the invoking and creates the +// necessary typedefs. +// This class does everything else. + +namespace detail { + +template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> +class ClosurePtr : public DelegateMemento { +public: + // These functions are for setting the delegate to a member function. + + // Here's the clever bit: we convert an arbitrary member function into a + // standard form. XMemFunc should be a member function of class X, but I can't + // enforce that here. It needs to be enforced by the wrapper class. + template < class X, class XMemFunc > + inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { + m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(pthis, function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } + // For const member functions, we only need a const class pointer. + // Since we know that the member function is const, it's safe to + // remove the const qualifier from the 'this' pointer with a const_cast. + // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. + template < class X, class XMemFunc> + inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { + m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(const_cast(pthis), function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates + template < class X, class XMemFunc> + inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { + bindconstmemfunc(pthis, function_to_bind); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#endif + // These functions are required for invoking the stored function + inline GenericClass *GetClosureThis() const { return m_pthis; } + inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } + +// There are a few ways of dealing with static function pointers. +// There's a standard-compliant, but tricky method. +// There's also a straightforward hack, that won't work on DOS compilers using the +// medium memory model. It's so evil that I can't recommend it, but I've +// implemented it anyway because it produces very nice asm code. + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + +// ClosurePtr<> - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// I store the function pointer inside the class, and the delegate then +// points to itself. Whenever the delegate is copied, these self-references +// must be transformed, and this complicates the = and == operators. +public: + // The next two functions are for operator ==, =, and the copy constructor. + // We may need to convert the m_pthis pointers, so that + // they remain as self-references. + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { + SetMementoFrom(x); + if (m_pStaticFunction!=0) { + // transform self references... + m_pthis=reinterpret_cast(pParent); + } + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + template < class DerivedClass, class ParentInvokerSig > + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind ) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + bindmemfunc(pParent, static_function_invoker); + } + m_pStaticFunction=reinterpret_cast(function_to_bind); + } + inline UnvoidStaticFuncPtr GetStaticFunction() const { + return reinterpret_cast(m_pStaticFunction); + } +#else + +// ClosurePtr<> - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and +// speeds up comparison and assignment. If C++ provided direct language support +// for delegates, they would produce asm code that was almost identical to this. +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { + SetMementoFrom(right); + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + // ******** EVIL, EVIL CODE! ******* + template < class DerivedClass, class ParentInvokerSig> + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + // We'll be ignoring the 'this' pointer, but we need to make sure we pass + // a valid value to bindmemfunc(). + bindmemfunc(pParent, static_function_invoker); + } + + // WARNING! Evil hack. We store the function in the 'this' pointer! + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; + m_pthis = horrible_cast(function_to_bind); + // MSVC, SunC++ and DMC accept the following (non-standard) code: +// m_pthis = static_cast(static_cast(function_to_bind)); + // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long +// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); + } + // ******** EVIL, EVIL CODE! ******* + // This function will be called with an invalid 'this' pointer!! + // We're just returning the 'this' pointer, converted into + // a function pointer! + inline UnvoidStaticFuncPtr GetStaticFunction() const { + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; + return horrible_cast(this); + } +#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + + // Does the closure contain this static function? + inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ + if (funcptr==0) return empty(); + // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary + // value that is not equal to any valid function pointer. + else return funcptr==reinterpret_cast(GetStaticFunction()); + } +}; + + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 3: +// +// Wrapper classes to ensure type safety +// +//////////////////////////////////////////////////////////////////////////////// + + +// Once we have the member function conversion templates, it's easy to make the +// wrapper classes. So that they will work with as many compilers as possible, +// the classes are of the form +// FastDelegate3 +// They can cope with any combination of parameters. The max number of parameters +// allowed is 8, but it is trivial to increase this limit. +// Note that we need to treat const member functions seperately. +// All this class does is to enforce type safety, and invoke the delegate with +// the correct list of parameters. + +// Because of the weird rule about the class of derived member function pointers, +// you sometimes need to apply a downcast to the 'this' pointer. +// This is the reason for the use of "implicit_cast(pthis)" in the code below. +// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, +// without this trick you'd need to write: +// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); +// but with the trick you can write +// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); + +// RetType is the type the compiler uses in compiling the template. For VC6, +// it cannot be void. DesiredRetType is the real type which is returned from +// all of the functions. It can be void. + +// Implicit conversion to "bool" is achieved using the safe_bool idiom, +// using member data pointers (MDP). This allows "if (dg)..." syntax +// Because some compilers (eg codeplay) don't have a unique value for a zero +// MDP, an extra padding member is added to the SafeBool struct. +// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so +// in that case the static function constructor is not made explicit; this +// allows "if (dg==0) ..." to compile. + +@VARARGS +template<@CLASSARGS, class RetType=detail::DefaultVoid> +class FastDelegate@NUM { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(@FUNCARGS); + typedef RetType (*UnvoidStaticFunctionPtr)(@FUNCARGS); + typedef RetType (detail::GenericClass::*GenericMemFn)(@FUNCARGS); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate@NUM type; + + // Construction and comparison functions + FastDelegate@NUM() { clear(); } + FastDelegate@NUM(const FastDelegate@NUM &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate@NUM &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate@NUM &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate@NUM &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate@NUM &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate@NUM &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate@NUM(Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate@NUM(const Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate@NUM(DesiredRetType (*function_to_bind)(@FUNCARGS) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(@FUNCARGS) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(@FUNCARGS)) { + m_Closure.bindstaticfunc(this, &FastDelegate@NUM::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (@FUNCARGS) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(@INVOKEARGS); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(@FUNCARGS) const { + return (*(m_Closure.GetStaticFunction()))(@INVOKEARGS); } +}; + +@ENDVAR + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 4: +// +// FastDelegate<> class (Original author: Jody Hagins) +// Allows boost::function style syntax like: +// FastDelegate< double (int, long) > +// instead of: +// FastDelegate2< int, long, double > +// +//////////////////////////////////////////////////////////////////////////////// + +#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +// Declare FastDelegate as a class template. It will be specialized +// later for all number of arguments. +template +class FastDelegate; + +@VARARGS +// Specialization to allow use of +// FastDelegate< R ( @SELARGS ) > +// instead of +// FastDelegate@NUM < @SELARGS, R > +template +class FastDelegate< R ( @SELARGS ) > + // Inherit from FastDelegate@NUM so that it can be treated just like a FastDelegate@NUM + : public FastDelegate@NUM < @SELARGS, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate@NUM < @SELARGS, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( @FUNCARGS )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( @FUNCARGS ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( @FUNCARGS )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +@ENDVAR + +#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 5: +// +// MakeDelegate() helper function +// +// MakeDelegate(&x, &X::func) returns a fastdelegate of the type +// necessary for calling x.func() with the correct number of arguments. +// This makes it possible to eliminate many typedefs from user code. +// +//////////////////////////////////////////////////////////////////////////////// + +// Also declare overloads of a MakeDelegate() global function to +// reduce the need for typedefs. +// We need seperate overloads for const and non-const member functions. +// Also, because of the weird rule about the class of derived member function pointers, +// implicit downcasts may need to be applied later to the 'this' pointer. +// That's why two classes (X and Y) appear in the definitions. Y must be implicitly +// castable to X. + +// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. +// GCC 3.2 and later won't compile this unless it's preceded by 'typename', +// but VC6 doesn't allow 'typename' in this context. +// So, I have to use a macro. + +#ifdef FASTDLGT_VC6 +#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type +#else +#define FASTDLGT_RETTYPE RetType +#endif + +@VARARGS +template +FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE> MakeDelegate(Y* x, RetType (X::*func)(@FUNCARGS)) { + return FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE>(x, func); +} + +template +FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE> MakeDelegate(Y* x, RetType (X::*func)(@FUNCARGS) const) { + return FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE>(x, func); +} + +template <@CLASSARGS, class RetType> +FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE> MakeDelegate(RetType (*func)(@FUNCARGS)) { + return FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE>(func); +} + +@ENDVAR + + // clean up after ourselves... +#undef FASTDLGT_RETTYPE + +} // namespace fastdelegate + +#endif // !defined(FASTDELEGATE_H) diff --git a/sourcehook/generate/generate b/sourcehook/generate/generate new file mode 100755 index 0000000..f537ff3 --- /dev/null +++ b/sourcehook/generate/generate @@ -0,0 +1,7 @@ +#/bin/sh + +./shworker.bin iter sourcehook.hxx sourcehook.h $1 +./shworker.bin iter sh_memfuncinfo.hxx sh_memfuncinfo.h $1 +./shworker.bin hopter FastDelegate.hxx FastDelegate.h $1 + +cp *.h .. diff --git a/sourcehook/generate/generate.bat b/sourcehook/generate/generate.bat new file mode 100644 index 0000000..53c863a --- /dev/null +++ b/sourcehook/generate/generate.bat @@ -0,0 +1,10 @@ +:: Generates everything +:: Usage: +:: generate.bat + + +shworker iter sourcehook.hxx sourcehook.h %1 +shworker iter sh_memfuncinfo.hxx sh_memfuncinfo.h %1 +shworker hopter FastDelegate.hxx FastDelegate.h %1 + +copy *.h .. \ No newline at end of file diff --git a/sourcehook/generate/sh_memfuncinfo.h b/sourcehook/generate/sh_memfuncinfo.h new file mode 100644 index 0000000..fbfddab --- /dev/null +++ b/sourcehook/generate/sh_memfuncinfo.h @@ -0,0 +1,912 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +/** + * @brief This file provides a way for getting information about a member function. + * @file sh_memfuncinfo.h + */ + +#ifndef __SHINT_MEMFUNC_INFO_H__ +#define __SHINT_MEMFUNC_INFO_H__ + +namespace SourceHook +{ + + // Don Clugston: + // implicit_cast< > + // I believe this was originally going to be in the C++ standard but + // was left out by accident. It's even milder than static_cast. + // I use it instead of static_cast<> to emphasize that I'm not doing + // anything nasty. + // Usage is identical to static_cast<> + template + inline OutputClass implicit_cast(InputClass input){ + return input; + } + + + struct MemFuncInfo + { + bool isVirtual; // Is the function virtual? + int thisptroffs; // The this pointer the function expects to be called with + // If -1, you need to call the GetFuncInfo_GetThisPtr function + int vtblindex; // The function's index in the vtable (0-based, 1=second entry, 2=third entry, ...) + int vtbloffs; // The vtable pointer + }; + + // Ideas by Don Clugston. + // Check out his excellent paper: http://www.codeproject.com/cpp/FastDelegate.asp + + template struct MFI_Impl + { + template static inline void GetFuncInfo(MFP *mfp, MemFuncInfo &out) + { + static char weird_memfunc_pointer_exclamation_mark_arrow_error[N-1000]; + } + }; + +# if SH_COMP == SH_COMP_GCC + + template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16 + { + struct GCC_MemFunPtr + { + union + { + void *funcadr; // always even + intptr_t vtable_index_plus1; // = vindex+1, always odd + }; + intptr_t delta; + }; + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + GCC_MemFunPtr *mfp_detail = (GCC_MemFunPtr*)&mfp; + out.thisptroffs = mfp_detail->delta; + if (mfp_detail->vtable_index_plus1 & 1) + { + out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE; + out.vtbloffs = 0; + out.isVirtual = true; + } + else + out.isVirtual = false; + } + }; + +# elif SH_COMP == SH_COMP_MSVC + + namespace + { + int MFI_GetVtblOffset(void *mfp) + { + unsigned char *addr = (unsigned char*)mfp; + if (*addr == 0xE9) // Jmp + { + // May or may not be! + // Check where it'd jump + addr += 5 /*size of the instruction*/ + *(unsigned long*)(addr + 1); + } + + // Check whether it's a virtual function call + // They look like this: + // 004125A0 8B 01 mov eax,dword ptr [ecx] + // 004125A2 FF 60 04 jmp dword ptr [eax+4] + // ==OR== + // 00411B80 8B 01 mov eax,dword ptr [ecx] + // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] + + // However, for vararg functions, they look like this: + // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] + // 0048F0B4 8B 00 mov eax,dword ptr [eax] + // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] + // ==OR== + // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] + // 0048F0B4 8B 00 mov eax,dword ptr [eax] + // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] + + // With varargs, the this pointer is passed as if it was the first argument + + bool ok = false; + if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && + addr[4] == 0x8B && addr[5] == 0x00) + { + addr += 6; + ok = true; + } + else if (addr[0] == 0x8B && addr[1] == 0x01) + { + addr += 2; + ok = true; + } + if (!ok) + return -1; + + if (*addr++ == 0xFF) + { + if (*addr == 0x60) + { + return *++addr / 4; + } + else if (*addr == 0xA0) + { + return *((unsigned int*)++addr) / 4; + } + else if (*addr == 0x20) + return 0; + else + return -1; + } + return -1; + } + } + + template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones + { + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + out.thisptroffs = 0; + out.vtbloffs = 0; + } + }; + + template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones! + { + struct MSVC_MemFunPtr2 + { + void *funcadr; + int delta; + }; + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + out.thisptroffs = reinterpret_cast(&mfp)->delta; + out.vtbloffs = 0; + } + }; + + // By Don Clugston, adapted + template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG + { + class __single_inheritance GenericClass; + class GenericClass {}; + + struct MicrosoftVirtualMFP { + void (GenericClass::*codeptr)(); // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtable_index; // or 0 if no virtual inheritance + }; + + struct GenericVirtualClass : virtual public GenericClass + { + typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); + GenericVirtualClass * GetThis() { return this; } + }; + + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + // This pointer + /* + union { + MFP func; + GenericClass* (T::*ProbeFunc)(); + MicrosoftVirtualMFP s; + } u; + u.func = mfp; + union { + GenericVirtualClass::ProbePtrType virtfunc; + MicrosoftVirtualMFP s; + } u2; + + // Check that the horrible_cast<>s will work + typedef int ERROR_CantUsehorrible_cast[sizeof(mfp)==sizeof(u.s) + && sizeof(mfp)==sizeof(u.ProbeFunc) + && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; + // Unfortunately, taking the address of a MF prevents it from being inlined, so + // this next line can't be completely optimised away by the compiler. + u2.virtfunc = &GenericVirtualClass::GetThis; + u.s.codeptr = u2.s.codeptr; + out.thisptroffs = (reinterpret_cast(NULL)->*u.ProbeFunc)(); + */ + out.thisptroffs = -1; + out.vtbloffs = 0; + } + }; + + // Don: Nasty hack for Microsoft and Intel (IA32 and Itanium) + // unknown_inheritance classes go here + // This is probably the ugliest bit of code I've ever written. Look at the casts! + // There is a compiler bug in MSVC6 which prevents it from using this code. + template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN + { + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + + // The member function pointer is 16 bytes long. We can't use a normal cast, but + // we can use a union to do the conversion. + union { + MFP func; + // In VC++ and ICL, an unknown_inheritance member pointer + // is internally defined as: + struct { + void *m_funcaddress; // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtordisp; // #bytes to add to 'this' to find the vtable + int vtable_index; // or 0 if no virtual inheritance + } s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(u.func)==sizeof(u.s)? 1 : -1]; + u.func = mfp; + int virtual_delta = 0; + if (u.s.vtable_index) { // Virtual inheritance is used + /* + // First, get to the vtable. + // It is 'vtordisp' bytes from the start of the class. + int * vtable = *reinterpret_cast( + reinterpret_cast(thisptr) + u.s.vtordisp ); + + // 'vtable_index' tells us where in the table we should be looking. + virtual_delta = u.s.vtordisp + *reinterpret_cast( + reinterpret_cast(vtable) + u.s.vtable_index); + // The int at 'virtual_delta' gives us the amount to add to 'this'. + // Finally we can add the three components together. Phew! + out.thisptr = reinterpret_cast( + reinterpret_cast(thisptr) + u.s.delta + virtual_delta); + */ + out.vtbloffs = u.s.vtordisp; + out.thisptroffs = -1; + } + else + { + out.vtbloffs = out.vtblindex < 0 ? 0 : u.s.delta; + out.thisptroffs = u.s.delta; + } + }; + }; +# else +# error Unsupported compiler +# endif + + // This version does not take a this pointer + // Useful for hookdecls, as they ensure that mfp is correct through a static_cast + template inline void GetFuncInfo(X mfp, MemFuncInfo &out) + { + MFI_Impl::GetFuncInfo(mfp, out); + } + + // Versions which do take a this + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(), MemFuncInfo &out) + { + RetType(Y::*mfp2)() = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)() const, MemFuncInfo &out) + { + RetType(Y::*mfp2)() const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + // GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it +#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + +#endif + +} + +#endif diff --git a/sourcehook/generate/sh_memfuncinfo.hxx b/sourcehook/generate/sh_memfuncinfo.hxx new file mode 100644 index 0000000..5ed37ab --- /dev/null +++ b/sourcehook/generate/sh_memfuncinfo.hxx @@ -0,0 +1,332 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +/** + * @brief This file provides a way for getting information about a member function. + * @file sh_memfuncinfo.h + */ + +#ifndef __SHINT_MEMFUNC_INFO_H__ +#define __SHINT_MEMFUNC_INFO_H__ + +namespace SourceHook +{ + + // Don Clugston: + // implicit_cast< > + // I believe this was originally going to be in the C++ standard but + // was left out by accident. It's even milder than static_cast. + // I use it instead of static_cast<> to emphasize that I'm not doing + // anything nasty. + // Usage is identical to static_cast<> + template + inline OutputClass implicit_cast(InputClass input){ + return input; + } + + + struct MemFuncInfo + { + bool isVirtual; // Is the function virtual? + int thisptroffs; // The this pointer the function expects to be called with + // If -1, you need to call the GetFuncInfo_GetThisPtr function + int vtblindex; // The function's index in the vtable (0-based, 1=second entry, 2=third entry, ...) + int vtbloffs; // The vtable pointer + }; + + // Ideas by Don Clugston. + // Check out his excellent paper: http://www.codeproject.com/cpp/FastDelegate.asp + + template struct MFI_Impl + { + template static inline void GetFuncInfo(MFP *mfp, MemFuncInfo &out) + { + static char weird_memfunc_pointer_exclamation_mark_arrow_error[N-1000]; + } + }; + +# if SH_COMP == SH_COMP_GCC + + template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16 + { + struct GCC_MemFunPtr + { + union + { + void *funcadr; // always even + intptr_t vtable_index_plus1; // = vindex+1, always odd + }; + intptr_t delta; + }; + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + GCC_MemFunPtr *mfp_detail = (GCC_MemFunPtr*)&mfp; + out.thisptroffs = mfp_detail->delta; + if (mfp_detail->vtable_index_plus1 & 1) + { + out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE; + out.vtbloffs = 0; + out.isVirtual = true; + } + else + out.isVirtual = false; + } + }; + +# elif SH_COMP == SH_COMP_MSVC + + namespace + { + int MFI_GetVtblOffset(void *mfp) + { + unsigned char *addr = (unsigned char*)mfp; + if (*addr == 0xE9) // Jmp + { + // May or may not be! + // Check where it'd jump + addr += 5 /*size of the instruction*/ + *(unsigned long*)(addr + 1); + } + + // Check whether it's a virtual function call + // They look like this: + // 004125A0 8B 01 mov eax,dword ptr [ecx] + // 004125A2 FF 60 04 jmp dword ptr [eax+4] + // ==OR== + // 00411B80 8B 01 mov eax,dword ptr [ecx] + // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] + + // However, for vararg functions, they look like this: + // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] + // 0048F0B4 8B 00 mov eax,dword ptr [eax] + // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] + // ==OR== + // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] + // 0048F0B4 8B 00 mov eax,dword ptr [eax] + // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] + + // With varargs, the this pointer is passed as if it was the first argument + + bool ok = false; + if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && + addr[4] == 0x8B && addr[5] == 0x00) + { + addr += 6; + ok = true; + } + else if (addr[0] == 0x8B && addr[1] == 0x01) + { + addr += 2; + ok = true; + } + if (!ok) + return -1; + + if (*addr++ == 0xFF) + { + if (*addr == 0x60) + { + return *++addr / 4; + } + else if (*addr == 0xA0) + { + return *((unsigned int*)++addr) / 4; + } + else if (*addr == 0x20) + return 0; + else + return -1; + } + return -1; + } + } + + template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones + { + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + out.thisptroffs = 0; + out.vtbloffs = 0; + } + }; + + template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones! + { + struct MSVC_MemFunPtr2 + { + void *funcadr; + int delta; + }; + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + out.thisptroffs = reinterpret_cast(&mfp)->delta; + out.vtbloffs = 0; + } + }; + + // By Don Clugston, adapted + template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG + { + class __single_inheritance GenericClass; + class GenericClass {}; + + struct MicrosoftVirtualMFP { + void (GenericClass::*codeptr)(); // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtable_index; // or 0 if no virtual inheritance + }; + + struct GenericVirtualClass : virtual public GenericClass + { + typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); + GenericVirtualClass * GetThis() { return this; } + }; + + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + // This pointer + /* + union { + MFP func; + GenericClass* (T::*ProbeFunc)(); + MicrosoftVirtualMFP s; + } u; + u.func = mfp; + union { + GenericVirtualClass::ProbePtrType virtfunc; + MicrosoftVirtualMFP s; + } u2; + + // Check that the horrible_cast<>s will work + typedef int ERROR_CantUsehorrible_cast[sizeof(mfp)==sizeof(u.s) + && sizeof(mfp)==sizeof(u.ProbeFunc) + && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; + // Unfortunately, taking the address of a MF prevents it from being inlined, so + // this next line can't be completely optimised away by the compiler. + u2.virtfunc = &GenericVirtualClass::GetThis; + u.s.codeptr = u2.s.codeptr; + out.thisptroffs = (reinterpret_cast(NULL)->*u.ProbeFunc)(); + */ + out.thisptroffs = -1; + out.vtbloffs = 0; + } + }; + + // Don: Nasty hack for Microsoft and Intel (IA32 and Itanium) + // unknown_inheritance classes go here + // This is probably the ugliest bit of code I've ever written. Look at the casts! + // There is a compiler bug in MSVC6 which prevents it from using this code. + template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN + { + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + + // The member function pointer is 16 bytes long. We can't use a normal cast, but + // we can use a union to do the conversion. + union { + MFP func; + // In VC++ and ICL, an unknown_inheritance member pointer + // is internally defined as: + struct { + void *m_funcaddress; // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtordisp; // #bytes to add to 'this' to find the vtable + int vtable_index; // or 0 if no virtual inheritance + } s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(u.func)==sizeof(u.s)? 1 : -1]; + u.func = mfp; + int virtual_delta = 0; + if (u.s.vtable_index) { // Virtual inheritance is used + /* + // First, get to the vtable. + // It is 'vtordisp' bytes from the start of the class. + int * vtable = *reinterpret_cast( + reinterpret_cast(thisptr) + u.s.vtordisp ); + + // 'vtable_index' tells us where in the table we should be looking. + virtual_delta = u.s.vtordisp + *reinterpret_cast( + reinterpret_cast(vtable) + u.s.vtable_index); + // The int at 'virtual_delta' gives us the amount to add to 'this'. + // Finally we can add the three components together. Phew! + out.thisptr = reinterpret_cast( + reinterpret_cast(thisptr) + u.s.delta + virtual_delta); + */ + out.vtbloffs = u.s.vtordisp; + out.thisptroffs = -1; + } + else + { + out.vtbloffs = out.vtblindex < 0 ? 0 : u.s.delta; + out.thisptroffs = u.s.delta; + } + }; + }; +# else +# error Unsupported compiler +# endif + + // This version does not take a this pointer + // Useful for hookdecls, as they ensure that mfp is correct through a static_cast + template inline void GetFuncInfo(X mfp, MemFuncInfo &out) + { + MFI_Impl::GetFuncInfo(mfp, out); + } + + // Versions which do take a this +@[$1,0,$a: + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]), MemFuncInfo &out) + { + RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } +@] + + // GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it +#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 + +@[$1,0,$a: + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + +@] + +#endif + +} + +#endif diff --git a/sourcehook/generate/shworker.bin b/sourcehook/generate/shworker.bin new file mode 100755 index 0000000000000000000000000000000000000000..18d35bd2ec92e780d2384dbf192640497b82ae37 GIT binary patch literal 54998 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 XRI!`2;db_HgI+>5lKQxTZw>zg{q0Ax literal 0 HcmV?d00001 diff --git a/sourcehook/generate/shworker.exe b/sourcehook/generate/shworker.exe new file mode 100644 index 0000000000000000000000000000000000000000..a251da14479b56dd75dd15f925de69e066c036c2 GIT binary patch literal 352256 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 literal 0 HcmV?d00001 diff --git a/sourcehook/generate/shworker/Makefile b/sourcehook/generate/shworker/Makefile new file mode 100644 index 0000000..86ac5bf --- /dev/null +++ b/sourcehook/generate/shworker/Makefile @@ -0,0 +1,13 @@ +default: shworker + +bin: + mkdir bin + +fd_hopter.o: fd_hopter.cpp bin + gcc -fPIC -O2 -o bin/$@ -c $< + +main.o: shworker.cpp bin + gcc -fPIC -O2 -o bin/$@ -c $< + +shworker: fd_hopter.o main.o bin + gcc -ldl -lstdc++ bin/fd_hopter.o bin/main.o -o bin/shworker.bin diff --git a/sourcehook/generate/shworker/fd_hopter.cpp b/sourcehook/generate/shworker/fd_hopter.cpp new file mode 100644 index 0000000..7fc149d --- /dev/null +++ b/sourcehook/generate/shworker/fd_hopter.cpp @@ -0,0 +1,370 @@ +// From fastdelegate +// http://www.codeproject.com/cpp/FastDelegate.asp + +// Modified to be run from shworker by PM + + +// HOPTER.EXE -- A simple header generator for vararg templates +/* MOTIVATION + C++ doesn't have a vararg feature for templates. This can be a + nuisance when writing class libraries. There are a few options: + (a) manually repeat code. This is tedious and error prone. + (b) Use macros. Messy, can't cope with template + arguments, and users get hard-to-interpret error messages. + (c) Use the boost preprocessor library. This slows compilation, + and introduces a dependency on boost. + (d) Write a program to automatically generate the code. + I've never seen a general program to do this job, so this is + a very simple command-line program to do it. + + Why is it called Hopter? + I wanted a word that started with h, to be reminiscent of header + files. At the time, my 2yo son kept talking about 'Hopter Copters' + (he couldn't pronounce 'helicopter'). + It also reflects the level of sophistication of this program -- + it was named by a two year old. + + IMPLEMENTATION + + When you analyze the problem, you find that the requirements + are very simple. + Varargs are needed in two places: templates and functions. + You want to use them in two ways: when declaring the template + or function, and when invoking the function / selecting the + template. + + It's a brain-dead implementation, which just does a search-and-replace + of specific strings. It could be done with a few lines using sed on + a *NIX platform. Because I use Windows, I've done a quick and dirty + implementation using CString. + +In a file, @VARARGS at the start of a line indicates the start of the code +to be expanded. @ENDVAR at the start of a line marks the end of the +expansion. + + declare template -- template <@CLASSARGS> class SomeClass + template + class SomeClass + + declare function -- somefunc(@FUNCARGS) + somefunc(Param1 p1, Param2 p2) + + select template -- SomeClass<@SELARGS> + SomeClass + + invoke function -- somefunc(@INVOKEARGS) + somefunc(p1, p2) + + I also provide @NUM which is the number of arguments. + The case where @NUM is zero is a special case: for template declarations, + the entire template<> bit needs to disappear. When other arguments are + involved, either at the beginning or end of the list, there a commas + which might need to be removed. + + I've used .hxx as the extension for these files. This enables C++ + I wanted to use an unusual file extension (.HOH) for these files, because they + aren't real header files. But I also like to use the C++ syntax highlighting + in Visual Studio. I chose .hxx because MSVC treats it as C++, but it + seems to very rarely used. + + Installation (for VC6, if you want to use .HOH as the extension instead): + Go into the registry and change + HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Text Editor\Tabs/Language Settings\C/C++\FileExtensions from cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2 + to cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2;hoh by adding “;hoh” to the end. + Then add this as a custom build step to the main file of your project: + hopter $(InputDir)\*.hoh $(InputDir)\*.h + +*/ + +#include +#include +#include + +// This is a quick-n-dirty implementation of a CString replacement. +// It promises nothing more than to provide enough functionality to get +// this program to run. +// Note that I have really never used CString, so the information to +// implement the members that are used in this program come from +// online documentation at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cstring.asp +// Also, I have only used VC++ a few times, a long time ago, so +// I really do not know what all their alphabet soup is suppoed to +// mean, so I just made a guess... + + +class CString +{ +public: + enum { MAX_FORMAT_STRING_SIZE = 8 * 1044 }; + CString() + : str_() + { + } + + CString( + CString const & rhs) + : str_(rhs.str_) + { + } + + CString( + char ch, + int repeat = 1) + : str_(repeat, ch) + { + } + + CString( + char const * s) + : str_(s) + { + } + + CString & operator=( + CString const & rhs) + { + str_ = rhs.str_; + return *this; + } + + CString & operator=( + char const * s) + { + str_ = s; + return *this; + } + + CString & operator=( + char ch) + { + str_ = ch; + return *this; + } + + void Format( + char const * fmt, + ...) + { + char buffer[ MAX_FORMAT_STRING_SIZE ]; + va_list ap; + va_start(ap, fmt); + vsprintf(buffer, fmt, ap); + va_end(ap); + str_ = buffer; + } + + char operator[]( + int x) const + { + return str_[x]; + } + + CString & operator+=( + CString const & x) + { + str_ += x.str_; return *this; + } + + int Replace( + CString const & lhs, + CString const & rhs) + { + int rval = 0; + std::string::size_type pos = 0; + while (pos < str_.length()) + { + pos = str_.find(lhs.str_, pos); + if (pos != std::string::npos) + { + str_.replace(pos, lhs.GetLength(), rhs.str_); + pos += rhs.GetLength(); + ++rval; + } + } + return rval; + } + + int GetLength() const + { + return str_.length(); + } + + operator char const * () const + { + return str_.c_str(); + } + +private: + std::string str_; +}; + + +CString operator+( + CString const & x, + CString const & y) +{ + CString result(x); + result += y; + return result; +} + + +/* Example: This is an excerpt from boost::function_template.hpp + +#define BOOST_FUNCTION_FUNCTION_INVOKER \ + BOOST_JOIN(function_invoker,BOOST_FUNCTION_NUM_ARGS) +#define BOOST_FUNCTION_VOID_FUNCTION_INVOKER \ + BOOST_JOIN(void_function_invoker,BOOST_FUNCTION_NUM_ARGS) + + template< + typename FunctionPtr, + typename R BOOST_FUNCTION_COMMA + BOOST_FUNCTION_TEMPLATE_PARMS + > + struct BOOST_FUNCTION_GET_FUNCTION_INVOKER + { + typedef typename ct_if<(is_void::value), + BOOST_FUNCTION_VOID_FUNCTION_INVOKER< + FunctionPtr, + R BOOST_FUNCTION_COMMA + BOOST_FUNCTION_TEMPLATE_ARGS + >, + BOOST_FUNCTION_FUNCTION_INVOKER< + FunctionPtr, + R BOOST_FUNCTION_COMMA + BOOST_FUNCTION_TEMPLATE_ARGS + > + >::type type; + }; + +Using HOPTER, this can be written as: + + template< typename FunctionPtr, typename R, @CLASSARGS> + struct get_function_invoker@NUM + { + typedef typename ct_if<(is_void::value), + void_function_invoker@NUM, + function_invoker@NUM + >::type type; + }; +*/ + +int MaxNumArgs; + +/// Makes the necessary subsititutions in 'bigblock', and writes to fout. +void PrintVarArgs(FILE *fout, CString bigblock, int num) { + CString numstr; + CString invokelist; + CString funclist; + CString selectlist; + CString classlist; + CString commastr; + numstr.Format("%d", num); + if (num==0) { + invokelist=""; + funclist=""; + selectlist=""; + commastr=""; + classlist=""; + }else { + invokelist="p1"; + funclist="Param1 p1"; + selectlist = "Param1"; + classlist = "class Param1"; + commastr=", "; + CString str; + for (int k=2; k<=num; k++) { + str.Format(", p%d", k); + invokelist+=str; + str.Format(", Param%d p%d", k, k); + funclist+=str; + str.Format(", Param%d", k); + selectlist += str; + str.Format(", class Param%d", k); + classlist += str; + } + } + + // Simple replacement of number of arguments + bigblock.Replace("@NUM", numstr); + + // Template declarations + if (num==0) bigblock.Replace("template<@CLASSARGS>", ""); + else bigblock.Replace("template<@CLASSARGS>", + (CString)"template<" + classlist+">"); + if (num==0) bigblock.Replace("template <@CLASSARGS>", ""); + else bigblock.Replace("template <@CLASSARGS>", + (CString)"template<" + classlist+">"); + bigblock.Replace(",@CLASSARGS", commastr + classlist); + bigblock.Replace(", @CLASSARGS", commastr + classlist); + bigblock.Replace("@CLASSARGS, ", classlist + commastr); + bigblock.Replace("@CLASSARGS,", classlist + commastr); + bigblock.Replace("@CLASSARGS", classlist); + + // Template selections + CString selargstr; + if (num==0) selargstr = ""; + else selargstr = (CString)"<"+selectlist+">"; + + bigblock.Replace("<@SELARGS>", selargstr); + bigblock.Replace("< @SELARGS >", selargstr); + bigblock.Replace(",@SELARGS", commastr + selectlist); + bigblock.Replace(", @SELARGS", commastr + selectlist); + bigblock.Replace("@SELARGS, ", selectlist + commastr); + bigblock.Replace("@SELARGS,", selectlist + commastr); + bigblock.Replace("@SELARGS", selectlist); + + // Function declarations + bigblock.Replace(",@FUNCARGS", commastr + funclist); + bigblock.Replace(", @FUNCARGS", commastr + funclist); + bigblock.Replace("@FUNCARGS, ", funclist + commastr); + bigblock.Replace("@FUNCARGS,", funclist + commastr); + bigblock.Replace("@FUNCARGS", funclist); + + // Function invocation + bigblock.Replace(",@INVOKEARGS", commastr + invokelist); + bigblock.Replace(", @INVOKEARGS", commastr + invokelist); + bigblock.Replace("@INVOKEARGS, ", invokelist + commastr); + bigblock.Replace("@INVOKEARGS,", invokelist + commastr); + bigblock.Replace("@INVOKEARGS", invokelist); + + fprintf(fout, bigblock); +} + +int action_hopter(int numargs, const char *filenamein, const char *filenameout) +{ + + MaxNumArgs = numargs; + + FILE * fin; + FILE *fout; + + fin =fopen(filenamein,"rt"); + if (!fin) { printf("Error, can't open %s\n", filenamein); return 1; }; + fout = fopen (filenameout, "wt"); + if (!fout) { printf("Error, can't open %s\n", filenameout); return 1; }; + char buf[5000]; + for (;;) { + if (!fgets(buf, 5000, fin)) break; + if (!strncmp(buf, "@VARARGS", 8)) { + // found a match... + CString bigblock; + for (;;) { + if (feof(fin)) { printf("No matching @ENDVAR !!??\n"); return 1; }; + fgets(buf, 5000, fin); + if (!strncmp(buf, "@ENDVAR", 7)) break; + bigblock+=buf; + } +// fprintf(fout, "// Auto-generated code [[[\n"); + for (int k=0; k<=MaxNumArgs; k++) { + fprintf(fout, "//N=%d\n", k); + PrintVarArgs(fout, bigblock, k); + } +// fprintf(fout, "// ]]] End auto-generated code\n"); + } else { + fprintf(fout, "%s", buf); + } + } + fclose(fin); + fclose(fout); + return 0; +} diff --git a/sourcehook/generate/shworker/msvc7/shworker.vcproj b/sourcehook/generate/shworker/msvc7/shworker.vcproj new file mode 100644 index 0000000..159bd19 --- /dev/null +++ b/sourcehook/generate/shworker/msvc7/shworker.vcproj @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcehook/generate/shworker/msvc8/shworker.vcproj b/sourcehook/generate/shworker/msvc8/shworker.vcproj new file mode 100644 index 0000000..997949d --- /dev/null +++ b/sourcehook/generate/shworker/msvc8/shworker.vcproj @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcehook/generate/shworker/shworker.cpp b/sourcehook/generate/shworker/shworker.cpp new file mode 100644 index 0000000..5e0047c --- /dev/null +++ b/sourcehook/generate/shworker/shworker.cpp @@ -0,0 +1,767 @@ +// SHWorker +// Inspired by "Hopter" that comes with FastDelegate (http://www.codeproject.com/cpp/FastDelegate.asp) +// Much more powerful (and ugly) though + +/* + + INPUT FILE DIRECTIVES + + $a is the first additional argument, $b the second, ... + + --- + ITERATION + + @[variable,min,max:code|separator@] + + variable: this will be replaced in code by its current value. + vars are always $ and a number. + min: first value to be used for variable + max: last value to be used for variable + code: the code that will be inserted on each iteration. + separator: optional. this will be inserted between iterations. + If you don't use a separator, you may leave out the | + IMPORTANT: iterations will only be performed if max >= min + + --- ARITHMETIC EXPRESSION + + @(expr) + + expr may contain: + variables + constants + operators (currently only + and * are supported) + + --- CONDITION + + @[expr operator expr:code@] + + Example: @[$1!=0:hello@] + + Currently only != and == are supported operators. + + + Yes, error handling in here is weird, some stuff uses return values, other code uses exceptions. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include "stdio.h" + +#ifdef __linux__ +# define stricmp strcasecmp +#endif + +// Ensure that the template version is being used! +#ifdef min +#undef min +#endif + +using namespace std; + +extern int action_hopter(int numargs, const char *filenamein, const char *filenameout); + +typedef map varmap; + +struct MyError +{ + const char *m_desc; + + MyError(const char *desc) : m_desc(desc) + { + } + + void Print() + { + cout << m_desc << endl; + } +}; + +struct SyntaxError : MyError +{ + SyntaxError() : MyError("Syntax error in expression") + { + } +}; +struct OtherError : MyError +{ + OtherError() : MyError("WTF") + { + } +}; + +void trim_string(std::string &str) +{ + size_t first = str.find_first_not_of(" \t\v\n\r"); + if (first == std::string::npos) + { + str.clear(); + return; + } + + size_t last = str.length(); + for (std::string::reverse_iterator riter = str.rbegin(); riter != str.rend(); ++riter) + { + char ch = *riter; + if (ch != ' ' && + ch != '\t' && + ch != '\v' && + ch != '\n' && + ch != '\r') + break; + --last; + } + str = str.substr(first, last - first); +} + +// unused +bool ExtractToken(std::string &strin, std::string &strout) +{ + trim_string(strin); + if (strin.begin() == strin.end()) + { + strout.clear(); + return false; + } + size_t first = strin.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFHIJKLMNOPQRSTUVWXYZ_0123456789"); + if (first == 0) + { + if (strin.size() > 1 && strin.at(0) == '/' && strin.at(1) == '/') + { + // One-line comment, find its end + first = strin.find('\n') + 1; + } + else if (strin.size() > 1 && strin.at(0) == '/' && strin.at(1) == '*') + { + // Multi-line comment, find its end + first = strin.find("*/") + 2; + } + strin = strin.substr(1); + strout.clear(); + return true; + } + strout = strin.substr(0, first); + strin = strin.substr(first); + return true; +} + +// Returns the number of occurencies replaced +int DoReplace(string &str, const string &what, const string &with) +{ + int cnt=0; + size_t where = str.find(what); + + while (where != string::npos) + { + str.replace(where, what.size(), with); + ++cnt; + where = str.find(what, where); + } + return cnt; +} + +int DoReplace(string &str, const char *what, const char *with) +{ + int cnt=0; + size_t where = str.find(what); + size_t whatsize = strlen(what); + while (where != string::npos) + { + str.replace(where, whatsize, with); + ++cnt; + where = str.find(what, where); + } + return cnt; +} + + +class ExprParser +{ + // grammar: + /* + expr -> expr + term { do_add } + | expr - term { do_sub } + | term + + term -> term * factor { do_mul } + | term / factor { do_div } + | term % factor { do_mod } + + factor -> (expr) + | numeric constant { push } + + + equivalent to: + + expr -> term moreterms + moreterms -> + term { do_add } moreterms + moreterms -> - term { do_sub } moreterms + moreterms -> epsilon + + term -> factor morefactors + morefactors -> * factor { do_mul } morefactors + morefactors -> / factor { do_div } morefactors + morefactors -> % factor { do_mod } morefactors + morefactors -> epsilon + + factor -> (expr) + factor -> numeric constant { push } + + */ + + string::const_iterator m_begin; + string::const_iterator m_end; + string::const_iterator m_iter; + + int m_lookahead; + int m_tokenval; + + stack m_stack; + static const int DONE = 256; + static const int NUM = 257; + + int lexan() + { + while (1) + { + if (m_iter == m_end) + return DONE; + + int t = *m_iter++; + + if (t == ' ' || t == '\t') + ; // Remove whitespace + else if (isdigit(t)) + { + --m_iter; + + m_tokenval = 0; + while (m_iter != m_end && isdigit(*m_iter)) + { + m_tokenval *= 10; + m_tokenval += *m_iter - '0'; + ++m_iter; + } + return NUM; + } + else + return t; + } + } + + void match(int t) + { + if (m_lookahead == t) + m_lookahead = lexan(); + else + throw SyntaxError(); + } + void factor() + { + switch (m_lookahead) + { + case '(': + match('('); expr(); match(')'); + break; + case NUM: + m_stack.push(m_tokenval); match(NUM); + break; + default: + throw SyntaxError(); + } + } + void term() + { + factor(); + while (1) + { + switch (m_lookahead) + { + case '*': + match('*'); factor(); do_mul(); + continue; + case '/': + match('/'); factor(); do_div(); + continue; + case '%': + match('%'); factor(); do_mod(); + continue; + default: + return; + } + + } + } + + void expr() + { + term(); + while (1) + { + switch (m_lookahead) + { + case '+': + match('+'); term(); do_add(); + continue; + case '-': + match('-'); term(); do_sub(); + continue; + default: + return; + } + } + } + + void do_add() + { + int a2 = m_stack.top(); m_stack.pop(); + int a1 = m_stack.top(); m_stack.pop(); + m_stack.push(a1 + a2); + } + + void do_sub() + { + int a2 = m_stack.top(); m_stack.pop(); + int a1 = m_stack.top(); m_stack.pop(); + m_stack.push(a1 - a2); + } + + void do_mul() + { + int a2 = m_stack.top(); m_stack.pop(); + int a1 = m_stack.top(); m_stack.pop(); + m_stack.push(a1 * a2); + } + + void do_div() + { + int a2 = m_stack.top(); m_stack.pop(); + int a1 = m_stack.top(); m_stack.pop(); + m_stack.push(a1 / a2); + } + + void do_mod() + { + int a2 = m_stack.top(); m_stack.pop(); + int a1 = m_stack.top(); m_stack.pop(); + m_stack.push(a1 % a2); + } + +public: + ExprParser(string::const_iterator begin, string::const_iterator end) : + m_begin(begin), m_end(end), m_iter(begin) + { + m_lookahead = lexan(); + expr(); + } + + operator int() + { + if (m_stack.size() != 1) + throw OtherError(); + + return m_stack.top(); + } +}; + +int parse_expr(string::const_iterator begin, string::const_iterator end) +{ + return ExprParser(begin, end); +} + +size_t find_first_directive(const string &buf, size_t begin=0) +{ + for (;;) + { + if (begin >= buf.size()) + return string::npos; + + size_t firstdirpos = buf.find('@', begin); + if (firstdirpos == string::npos) + return firstdirpos; + + if (buf.size() > firstdirpos+1) + { + if (buf[firstdirpos+1] == '[' || buf[firstdirpos+1] == '(') + return firstdirpos; + } + begin = firstdirpos+1; + } +} + +// buf begins with a section. Find its end! +size_t find_section_end(const string &buf) +{ + int starttype = buf[1]; + int endtype = (buf[1] == '(') ? ')' : ']'; + + int nestlevel = 0; + + if (starttype == '(') + { + for (string::const_iterator iter = buf.begin(); iter != buf.end(); ++iter) + { + if (*iter == starttype) + ++nestlevel; + if (*iter == endtype) + { + if (--nestlevel == 0) + return iter - buf.begin() + 1; + } + } + return string::npos; + } + else if (starttype == '[') + { + int lastchar = 0; + for (string::const_iterator iter = buf.begin(); iter != buf.end(); ++iter) + { + if (lastchar == '@' && *iter == starttype) + ++nestlevel; + if (lastchar == '@' && *iter == endtype) + { + if (--nestlevel == 0) + return iter - buf.begin() + 1; + } + lastchar = *iter; + } + return string::npos; + } + + return string::npos; +} + +// replaces variables and additional arguments +void replace_vars(string &buf, int argc, int *argv, const varmap &vars) +{ + char varname[] = "$ "; + char value[32]; + + for (int i = 0; i < argc; ++i) + { + varname[1] = 'a' + i; + sprintf(value, "%d", argv[i]); + DoReplace(buf, varname, value); + } + + for (varmap::const_iterator iter = vars.begin(); iter != vars.end(); ++iter) + { + varname[1] = '0' + iter->first; + sprintf(value, "%d", iter->second); + DoReplace(buf, varname, value); + } +} + +// do_input +// params: +// argc: number of additional arguments +// argv: additional arguments +// outfile: output file +// buf: string to be processed. IMPORTANT: buf is modified! +// curvars: variables buffer. +// retval: +// 0 on success, non-zero on error + +int do_input(int argc, int *argv, ofstream &outfile, string &buf, varmap &curvars) +{ + for (;;) + { + // Find the next directive. + size_t firstdirpos = find_first_directive(buf); + + // Output everything that came before, and remove it from buf + outfile << buf.substr(0, firstdirpos); + if (firstdirpos == string::npos) + return 0; + buf = buf.substr(firstdirpos); + + // Now find the matching end. + size_t sectionend = find_section_end(buf); + if (sectionend == string::npos) + { + cout << "ERROR: Section not closed!" << endl; + return 1; + } + + // Place the section in its own buffer and remove it from the input string. + string sect(buf.begin(), buf.begin() + sectionend); + buf = buf.substr(sectionend); + + // CASE1: Arithmetic expression + if (sect[1] == '(') + { + replace_vars(sect, argc, argv, curvars); + outfile << parse_expr(sect.begin()+1, sect.end()); + } + else if (sect[1] == '[') + { + int is_iter = 0; // 0 -> no; 1 -> maybe (only used in check); 2 -> yes + char lastchar = 0; + // This could be an iteration OR a conditional thing. + // Pretty braindead check: iterations begin with a variable, then a comma. + for (string::iterator iter = sect.begin() + 2; iter != sect.end(); ++iter) + { + if (*iter == ' ' || *iter == '\t') + ; + else if (is_iter == 0 && lastchar == '$' && isdigit(*iter)) + is_iter = 1; + else if (is_iter == 1 && *iter == ',') + { + is_iter = 2; + break; + } + else if (*iter == '$') + ; + else + break; + lastchar = *iter; + } + if (is_iter == 2) + { + // CASE2: iteration + // Looks like: @[var,min,max:code|sep@] + // Replace known variables / additional arguments + replace_vars(sect, argc, argv, curvars); + + // get the parts! + string varname; + int varnum; + int expr_min; + int expr_max; + + // varname + size_t comma = sect.find(','); + if (comma == string::npos) + { + cout << "Invalid iteration syntax" << endl; + return 1; + } + varname.assign(sect.begin() + 2, sect.begin() + comma); + trim_string(varname); + if (varname.size() != 2 || varname[0] != '$' || !isdigit(varname[1])) + { + cout << "Invalid variable name" << endl; + return 1; + } + varnum = varname[1] - '0'; + + // min + ++comma; + size_t nextcomma = sect.find(',', comma); + if (nextcomma == string::npos) + { + cout << "Invalid iteration syntax" << endl; + return 1; + } + expr_min = parse_expr(sect.begin() + comma, sect.begin() + nextcomma); + + // max + comma = nextcomma + 1; + nextcomma = sect.find(':', comma); + if (nextcomma == string::npos) + { + cout << "Invalid iteration syntax" << endl; + return 1; + } + + expr_max = parse_expr(sect.begin() + comma, sect.begin() + nextcomma); + + // separator + size_t sepbegin = sect.find('|'); + size_t sepend = string::npos; + if (sepbegin != string::npos && sepbegin < nextcomma) + { + // There's a separator! + ++sepbegin; + sepend = nextcomma; + } + else + sepbegin = string::npos; + + + ++nextcomma; // nextcomma is now where code begins! + + size_t codeend = sect.size() - 2; + + // Check whether the var is already taken + if (curvars.find(varnum) != curvars.end()) + { + cout << "Variable $" << varnum << "already taken!" << endl; + return 1; + } + + // Do iterations!! + for (int i = expr_min; i <= expr_max; ++i) + { + curvars[varnum] = i; + + string code(sect.begin() + nextcomma, sect.begin() + codeend); + replace_vars(code, argc, argv, curvars); + + // Feed it through the input routine (RECURSE!!!!!! YEAH!) + do_input(argc, argv, outfile, code, curvars); + + // Add separator if required + if (sepbegin != string::npos && i != expr_max) + { + string tmp(sect.begin() + sepbegin, sect.begin() + sepend); + do_input(argc, argv, outfile, tmp, curvars); + } + } + // Remove the var! + curvars.erase(varnum); + } + else + { + // CASE3: conditional thing. + // Looks like: @[expr1 operator expr2:code@] + + // Find the operator position + + enum OP_TYPE + { + OP_EQ, + OP_NEQ + }; + + OP_TYPE op; + size_t oppos = sect.find("=="); + if (oppos != string::npos) + op = OP_EQ; + else + { + oppos = sect.find("!="); + if (oppos != string::npos) + op = OP_NEQ; + else + { + cout << "Conditional expression without operator!?" << endl; + return 1; + } + } + size_t colon = sect.find(':'); + + // Now we've got everything. Parse first expr: + int expr1 = parse_expr(sect.begin() + 2, sect.begin() + oppos); + int expr2 = parse_expr(sect.begin() + oppos + 2, sect.begin() + colon); + if ((op == OP_EQ && expr1 == expr2) || + (op == OP_NEQ && expr1 != expr2)) + { + // Condition is true, process it! + // The text may still contain arithmetic exprs or other cond. exprs + // so send it through do_input + string tmp(sect.substr(colon+1, sect.size() - colon - 3)); + do_input(argc, argv, outfile, tmp, curvars); + } + } + } + else + { + cout << "WTF" << endl; + return 1; + } + } + + return 0; +} + + + +// action_iter +// params: +// filenamein: input file name +// filenameout: output file name +// argc: number of additional arguments +// argv: additional arguments +// retval: 0 on success, non-zero on error + +// Convert additional arguments +// Read whole input file to memory and open output file +// Pass to do_input() +int action_iter(const char *filenamein, const char *filenameout, int argc, const char *argv[]) +{ + // Convert additional arguments + const int MAX_ARGC = 10; + int converted_argv[MAX_ARGC]; + + int i; + for (i = 0; i < argc && i < MAX_ARGC; ++i) + converted_argv[i] = atoi(argv[i]); + + if (argc != i) + cout << "WARNING: Not all additional arguments processed!" << endl; + + + // Read whole input file to memory and open output file + ifstream fin(filenamein); + ofstream fout(filenameout); + + if (!fin) + { + cout << "Could not open file \"" << filenamein << "\"." << endl; + return 1; + } + if (!fout) + { + cout << "Could not open file \"" << filenameout << "\"." << endl; + return 1; + } + string input_str( + istreambuf_iterator (fin.rdbuf()), + istreambuf_iterator ()); + + + // Begin processing input + varmap vars; + try + { + return do_input(argc, converted_argv, fout, input_str, vars); + } + catch (MyError err) + { + err.Print(); + return 1; + } +} + +// MAIN +// Prints usage if required +// Calls action_hopter OR action_iter +int main(int argc, const char **argv) +{ + if (argc < 4) + { + cout << "Usage:" << endl << " shworker [iter/hopter] ..." << endl; + cout << " shworker iter filename.in filename.out [param1, param2, ...]" << endl; + cout << " shworker hopter filename.in filename.out [num-of-args]" << endl; + return 1; + } + + const char *action = argv[1]; + + if (stricmp(action, "hopter") == 0) + { + const char *filenamein = argv[2]; + const char *filenameout = argv[3]; + int argsnum = atoi(argv[4]); + + return action_hopter(argsnum, filenamein, filenameout); + } + else if (stricmp(action, "iter") == 0) + { + const char *filenamein = argv[2]; + const char *filenameout = argv[3]; + int additional_argc = argc - 4; + const char ** additional_argv = argv + 4; + return action_iter(filenamein, filenameout, additional_argc, additional_argv); + } + else + { + cout << "Unrecognized action: " << argv[1] << endl; + return 1; + } +} diff --git a/sourcehook/generate/sourcehook.h b/sourcehook/generate/sourcehook.h new file mode 100644 index 0000000..49e6813 --- /dev/null +++ b/sourcehook/generate/sourcehook.h @@ -0,0 +1,6104 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +/** +* @file sourcehook.h +* @brief Contains the public SourceHook API +*/ + +#ifndef __SOURCEHOOK_H__ +#define __SOURCEHOOK_H__ + +// Interface revisions: +// 1 - Initial revision +// 2 - Changed to virtual functions for iterators and all queries +// 3 - Added "hook loop status variable" +// 4 - Reentrant +#define SH_IFACE_VERSION 4 +#define SH_IMPL_VERSION 3 + +// Hookman version: +// 1 - Support for recalls, performance optimisations +#define SH_HOOKMAN_VERSION 1 + +// The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook +// It's used in various macros +#ifndef SH_GLOB_SHPTR +#define SH_GLOB_SHPTR g_SHPtr +#endif + +// Used to identify the current plugin +#ifndef SH_GLOB_PLUGPTR +#define SH_GLOB_PLUGPTR g_PLID +#endif + +#ifdef SH_DEBUG +# include +# include + +# define SH_ASSERT(x, info) \ + do { \ + if (!(x)) \ + { \ + printf("SOURCEHOOK DEBUG ASSERTION FAILED: %s:%u(%s): %s: ", __FILE__, __LINE__, __FUNCTION__, #x); \ + printf info; \ + putchar('\n'); \ + abort(); \ + } \ + } while(0) + +#else +# define SH_ASSERT(x, info) +#endif + +// System +#define SH_SYS_WIN32 1 +#define SH_SYS_LINUX 2 + +#ifdef _WIN32 +# define SH_SYS SH_SYS_WIN32 +#elif defined __linux__ +# define SH_SYS SH_SYS_LINUX +#else +# error Unsupported system +#endif + +// Compiler +#define SH_COMP_GCC 1 +#define SH_COMP_MSVC 2 + +#ifdef _MSC_VER +# define SH_COMP SH_COMP_MSVC +#elif defined __GNUC__ +# define SH_COMP SH_COMP_GCC +#else +# error Unsupported compiler +#endif + +#if SH_COMP==SH_COMP_MSVC +# define vsnprintf _vsnprintf +#endif + +#if SH_SYS != SH_SYS_WIN32 +# include +#endif + +#define SH_PTRSIZE sizeof(void*) + +#include "FastDelegate.h" +#include "sh_memfuncinfo.h" + +// Good old metamod! + +// Flags returned by a plugin's api function. +// NOTE: order is crucial, as greater/less comparisons are made. +enum META_RES +{ + MRES_IGNORED=0, // plugin didn't take any action + MRES_HANDLED, // plugin did something, but real function should still be called + MRES_OVERRIDE, // call real function, but use my return value + MRES_SUPERCEDE // skip real function; use my return value +}; + + +namespace SourceHook +{ + /** + * @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers + */ + const int STRBUF_LEN=4096; + + /** + * @brief An empty class. No inheritance used. Used for original-function-call hacks + */ + class EmptyClass + { + }; + + /** + * @brief Implicit cast. + */ + template + inline Out implicit_cast(In input) + { + return input; + } + + /** + * @brief A plugin typedef + * + * SourceHook doesn't really care what this is. As long as the ==, != and = operators work on it and every + * plugin has a unique identifier, everything is ok. + * It should also be possible to set it to 0. + */ + typedef int Plugin; + + struct ProtoInfo + { + ProtoInfo(int rtsz, int nop, const int *p) : beginningNull(0), retTypeSize(rtsz), numOfParams(nop), params(p) + { + } + int beginningNull; //!< To distinguish from old protos (which never begin with 0) + int retTypeSize; //!< 0 if void + int numOfParams; //!< number of parameters + const int *params; //!< params[0]=0 (or -1 for vararg), params[1]=size of first param, ... + }; + + /** + * @brief Specifies the actions for hook managers + */ + enum HookManagerAction + { + HA_GetInfo = 0, //!< Store info about the hook manager + HA_Register, //!< Save the IHookManagerInfo pointer for future reference + HA_Unregister //!< Clear the saved pointer + }; + + struct IHookManagerInfo; + + /** + * @brief Pointer to hook manager interface function + * + * A "hook manager" is a the only thing that knows the actual protoype of the function at compile time. + * + * @param ha What the hook manager should do + * @param hi A pointer to IHookManagerInfo + */ + typedef int (*HookManagerPubFunc)(HookManagerAction ha, IHookManagerInfo *hi); + + class ISHDelegate + { + public: + virtual void DeleteThis() = 0; // Ugly, I know + virtual bool IsEqual(ISHDelegate *other) = 0; + }; + + template class CSHDelegate : public ISHDelegate + { + T m_Deleg; + public: + CSHDelegate(T deleg) : m_Deleg(deleg) + { + } + + CSHDelegate(const CSHDelegate &other) : m_Deleg(other.m_Deleg) + { + } + + void DeleteThis() + { + delete this; + } + + bool IsEqual(ISHDelegate *other) + { + return static_cast* >(other)->GetDeleg() == GetDeleg(); + } + + T &GetDeleg() + { + return m_Deleg; + } + }; + + struct IHookList + { + struct IIter + { + virtual bool End() = 0; + virtual void Next() = 0; + virtual ISHDelegate *Handler() = 0; + virtual int ThisPtrOffs() = 0; + }; + virtual IIter *GetIter() = 0; + virtual void ReleaseIter(IIter *pIter) = 0; + }; + + struct IIface + { + virtual void *GetPtr() = 0; + virtual IHookList *GetPreHooks() = 0; + virtual IHookList *GetPostHooks() = 0; + }; + + struct IVfnPtr + { + virtual void *GetVfnPtr() = 0; + virtual void *GetOrigEntry() = 0; + + virtual IIface *FindIface(void *ptr) = 0; + }; + + struct IHookManagerInfo + { + virtual IVfnPtr *FindVfnPtr(void *vfnptr) = 0; + + virtual void SetInfo(int vtbloffs, int vtblidx, const char *proto) = 0; + virtual void SetHookfuncVfnptr(void *hookfunc_vfnptr) = 0; + + // Added 23.12.2005 (yup! I'm coding RIGHT BEFORE CHRISTMAS!) + // If the hookman doesn't set this, it defaults 0 + // SourceHook prefers hookmans with higher version numbers + virtual void SetVersion(int version) = 0; + }; + + class AutoHookIter + { + IHookList *m_pList; + IHookList::IIter *m_pIter; + public: + AutoHookIter(IHookList *pList) + : m_pList(pList), m_pIter(pList->GetIter()) + { + } + + ~AutoHookIter() + { + if (m_pList) + m_pList->ReleaseIter(m_pIter); + } + + bool End() + { + return m_pIter->End(); + } + + void Next() + { + m_pIter->Next(); + } + + ISHDelegate *Handler() + { + return m_pIter->Handler(); + } + + int ThisPtrOffs() + { + return m_pIter->ThisPtrOffs(); + } + + void SetToZero() + { + m_pList = 0; + } + }; + + template struct CallClass + { + virtual B *GetThisPtr() = 0; + virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; + }; + + typedef CallClass GenericCallClass; + typedef CallClass ManualCallClass; + + // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) + // - Today is an important day. + // I'm adding support for functions which return references. + + // How it works: + // SH_SETUPCALLS doesn't use plain rettype to store the temporary return values (plugin ret, orig ret, + // override ret) anymore; instead, it uses SourceHook::ReferenceCarrier::type + // this is typedefed to the original rettype normally, but if the rettype is a reference, it's a special class + // which stores the reference as a pointer, and implements constructors, operator= and a conversion operator. + // special cases were needed for getoverrideret / getorigret; these are implemented through the + // SourceHook::MacroRefHelpers structs. + // Furthermore, SetOverrideRet had to be changed a bit; see SourceHook::OverrideFunctor somewhere down in this file. + template struct ReferenceCarrier + { + typedef T type; + }; + + template struct ReferenceCarrier + { + class type + { + T *m_StoredRef; + public: + type() : m_StoredRef(NULL) + { + } + type(T& ref) : m_StoredRef(&ref) + { + } + + T& operator= (T& ref) + { + m_StoredRef = &ref; + return ref; + } + + operator T& () const + { + return *m_StoredRef; + } + }; + }; + + /** + * @brief The main SourceHook interface + */ + class ISourceHook + { + public: + /** + * @brief Return interface version + */ + virtual int GetIfaceVersion() = 0; + + /** + * @brief Return implementation version + */ + virtual int GetImplVersion() = 0; + + /** + * @brief Add a hook. + * + * @return True if the function succeeded, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param iface The interface pointer + * @param ifacesize The size of the class iface points to + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) = 0; + + /** + * @brief Removes a hook. + * + * @return True if the function succeeded, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param iface The interface pointer + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) = 0; + + /** + * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins + * + * @param plug The unique identifier of the plugin in question + */ + virtual bool IsPluginInUse(Plugin plug) = 0; + + /** + * @brief Return a pointer to a callclass. Generate a new one if required. + * + * @param iface The interface pointer + * @param size Size of the class instance + */ + virtual GenericCallClass *GetCallClass(void *iface, size_t size) = 0; + + /** + * @brief Release a callclass + * + * @param ptr Pointer to the callclass + */ + virtual void ReleaseCallClass(GenericCallClass *ptr) = 0; + + virtual void SetRes(META_RES res) = 0; //!< Sets the meta result + virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the + //!< previously calledhandler + virtual META_RES GetStatus() = 0; //!< Gets the highest meta result + virtual const void *GetOrigRet() = 0; //!< Gets the original result. + //!< If not in post function, undefined + virtual const void *GetOverrideRet() = 0; //!< Gets the override result. + //!< If none is specified, NULL + virtual void *GetIfacePtr() = 0; //!< Gets the interface pointer + ////////////////////////////////////////////////////////////////////////// + // For hook managers + virtual void HookLoopBegin(IIface *pIface) = 0; //!< Should be called when a hook loop begins + virtual void HookLoopEnd() = 0; //!< Should be called when a hook loop exits + virtual void SetCurResPtr(META_RES *mres) = 0; //!< Sets pointer to the current meta result + virtual void SetPrevResPtr(META_RES *mres) = 0; //!< Sets pointer to previous meta result + virtual void SetStatusPtr(META_RES *mres) = 0; //!< Sets pointer to the status variable + virtual void SetIfacePtrPtr(void **pp) = 0; //!< Sets pointer to the interface this pointer + virtual void SetOrigRetPtr(const void *ptr) = 0; //!< Sets the original return pointer + virtual void SetOverrideRetPtr(void *ptr) = 0; //!< Sets the override result pointer + virtual bool ShouldContinue() = 0; //!< Returns false if the hook loop should exit + + /** + * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. + * + * @param plug The owner of the hook manager + * @param pubFunc The hook manager's info function + */ + virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) = 0; + + virtual void DoRecall() = 0; //!< Initiates a recall sequence + /* + HOW RECALLS WORK: + + The problem: + Users want the ability to change parameters of the called function + from inside their handler. + The solution: + 1) Mark as "recall" + 2) Recall the function + 3) => SH's hook func gets called: + 4) The first iterator points at the first hook the last hookfunc didn't execute yet + 5) does all iteration and returns normally + 6) The user's handler returns immediately + 7) The hook func returns immediately as well + + Also note that the recalled hookfunc starts with the status the recalling hookfunc + ended with. The last handler (doing the recall) is also able to specify its own + META_RES. + */ + + virtual void *GetOverrideRetPtr() = 0; //!< Returns the pointer set by SetOverrideRetPtr + + /** + * @brief Set up the hook loop. Equivalent to calling: + * SetStatusPtr, SetPrevResPtr, SetCurResPtr, SetIfacePtrPtr, SetOrigRetPtr, Get/SetOverrideRetPtr + * + * @param statusPtr pointer to status variable + * @param prevResPtr pointer to previous result variable + * @param curResPtr pointer to current result variable + * @param ifacePtrPtr pointer to interface this pointer variable + * @param origRetPr pointer to original return value variable. NULL for void funcs + * @param overrideRetPtr pointer to override return value variable. NULL for void funcs + * + * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr + * when the hook func is being called as part of a recall + */ + virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, + void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; + + //!< + }; + + // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: + // These have to be able to return references. If T is a reference, the pointers returned + // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. + template struct MacroRefHelpers + { + inline static const T* GetOrigRet(ISourceHook *shptr) + { + return reinterpret_cast(shptr->GetOrigRet()); + } + inline static const T* GetOverrideRet(ISourceHook *shptr) + { + return reinterpret_cast(shptr->GetOverrideRet()); + } + }; + + template struct MacroRefHelpers + { + inline static T* GetOrigRet(ISourceHook *shptr) + { + T &ref = *reinterpret_cast::type *>(shptr->GetOrigRet()); + return &ref; + } + inline static T* GetOverrideRet(ISourceHook *shptr) + { + T &ref = *reinterpret_cast::type *>(shptr->GetOverrideRet()); + return &ref; + } + }; +} + +/************************************************************************/ +/* High level interface */ +/************************************************************************/ +#define META_RESULT_STATUS SH_GLOB_SHPTR->GetStatus() +#define META_RESULT_PREVIOUS SH_GLOB_SHPTR->GetPrevRes() +#define META_RESULT_ORIG_RET(type) *SourceHook::MacroRefHelpers::GetOrigRet(SH_GLOB_SHPTR) +#define META_RESULT_OVERRIDE_RET(type) *SourceHook::MacroRefHelpers::GetOverrideRet(SH_GLOB_SHPTR) +#define META_IFACEPTR(type) reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()) + +#define SET_META_RESULT(result) SH_GLOB_SHPTR->SetRes(result) +#define RETURN_META(result) do { SET_META_RESULT(result); return; } while(0) +#define RETURN_META_VALUE(result, value) do { SET_META_RESULT(result); return (value); } while(0) + +// If a hook on a function which returns a reference does not want to specify a return value, +// it can use this macro. +// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! +#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) + +// only call these from the hook handlers directly! +// :TODO: enforce it ? + +// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? +// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE + +// SourceHook::SetOverrideRet is defined later. +#define RETURN_META_NEWPARAMS(result, memfuncptr, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams; \ + RETURN_META(MRES_SUPERCEDE); \ + } while (0) + +#define RETURN_META_VALUE_NEWPARAMS(result, value, memfuncptr, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + if ((result) >= MRES_OVERRIDE) \ + { \ + /* meh, set the override result here because we don't get a chance to return */ \ + /* before continuing the hook loop through the recall */ \ + SourceHook::SetOverrideResult(memfuncptr)(SH_GLOB_SHPTR, value); \ + } \ + RETURN_META_VALUE(MRES_SUPERCEDE, \ + (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams); \ + } while (0) + +// :TODO: thisptroffs in MNEWPARAMS ?? + +#if SH_COMP == SH_COMP_MSVC + +#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ + union \ + { \ + SH_MFHCls(hookname)::ECMFP mfp; \ + void *addr; \ + } u; \ + SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ + u.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ + SH_MFHCls(hookname)::ms_MFI.vtblindex]; + +#elif SH_COMP == SH_COMP_GCC + +#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ + union \ + { \ + SH_MFHCls(hookname)::ECMFP mfp; \ + struct \ + { \ + void *addr; \ + intptr_t adjustor; \ + } s; \ + } u; \ + SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ + u.s.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ + SH_MFHCls(hookname)::ms_MFI.vtblindex]; \ + u.s.adjustor = 0; + +#endif + +#define RETURN_META_MNEWPARAMS(result, hookname, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ + (thisptr->*(u.mfp)) newparams; \ + RETURN_META(MRES_SUPERCEDE); \ + } while (0) + +#define RETURN_META_VALUE_MNEWPARAMS(result, value, hookname, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + if ((result) >= MRES_OVERRIDE) \ + { \ + /* see RETURN_META_VALUE_NEWPARAMS */ \ + SourceHook::SetOverrideResult(SH_GLOB_SHPTR, value); \ + } \ + SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ + RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ + } while (0) + +/** +* @brief Get/generate callclass for an interface pointer +* +* @param ifaceptr The interface pointer +*/ +template +inline SourceHook::CallClass *SH_GET_CALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr) +{ + return reinterpret_cast*>( + shptr->GetCallClass(reinterpret_cast(ptr), sizeof(ifacetype))); +} + +template +inline SourceHook::CallClass *SH_GET_MCALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr, int ifacesize) +{ + return reinterpret_cast*>( + shptr->GetCallClass(reinterpret_cast(ptr), ifacesize)); +} + +template +inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::CallClass *ptr) +{ + shptr->ReleaseCallClass(reinterpret_cast(ptr)); +} + +#define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ + do { \ + SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ + SH_MFHCls(hookname)::ms_MFI.thisptroffs = pthisptroffs; \ + SH_MFHCls(hookname)::ms_MFI.vtblindex = pvtblindex; \ + SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ + } while (0) + +#define SH_GET_CALLCLASS(ptr) SH_GET_CALLCLASS_R(SH_GLOB_SHPTR, ptr) +#define SH_GET_MCALLCLASS(ptr, size) SH_GET_MCALLCLASS_R(SH_GLOB_SHPTR, reinterpret_cast(ptr), size) +#define SH_RELEASE_CALLCLASS(ptr) SH_RELEASE_CALLCLASS_R(SH_GLOB_SHPTR, ptr) + +#define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ + __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ + post, handler) +#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + +#define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ + __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ + post, handler) +#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + + +#define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ + __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) +#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + +#define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ + __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) +#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + + +#define SH_NOATTRIB + + + + +#if SH_COMP == SH_COMP_MSVC +# define SH_SETUP_MFP(mfp) \ + reinterpret_cast(&mfp)[0] = vfnptr_origentry; +#elif SH_COMP == SH_COMP_GCC +# define SH_SETUP_MFP(mfp) \ + reinterpret_cast(&mfp)[0] = vfnptr_origentry; \ + reinterpret_cast(&mfp)[1] = 0; +#else +# error Not supported yet. +#endif + +////////////////////////////////////////////////////////////////////////// +#define SH_FHCls(ift, iff, ov) __SourceHook_FHCls_##ift##iff##ov +#define SH_MFHCls(hookname) __SourceHook_MFHCls_##hookname + +#define SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) \ + SH_FHCls(ifacetype,ifacefunc,overload)() \ + { \ + GetFuncInfo(funcptr, ms_MFI); \ + } \ + \ + static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ + { \ + using namespace ::SourceHook; \ + GetFuncInfo(funcptr, ms_MFI); \ + /* Verify interface version */ \ + if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ + return 1; \ + \ + if (action == HA_GetInfo) \ + { \ + param->SetVersion(SH_HOOKMAN_VERSION); \ + param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ + reinterpret_cast(&ms_Proto)); \ + \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(&SH_FHCls(ifacetype,ifacefunc,overload)::Func, mfi); \ + param->SetHookfuncVfnptr( \ + reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ + return 0; \ + } \ + else if (action == HA_Register) \ + { \ + ms_HI = param; \ + return 0; \ + } \ + else if (action == HA_Unregister) \ + { \ + ms_HI = NULL; \ + return 0; \ + } \ + else \ + return 1; \ + } + +// It has to be possible to use the macros in namespaces +// -> So we need to access and extend the global SourceHook namespace +// We use a namespace alias for this +#define SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, funcptr) \ + struct SH_FHCls(ifacetype,ifacefunc,overload) \ + { \ + static SH_FHCls(ifacetype,ifacefunc,overload) ms_Inst; \ + static ::SourceHook::MemFuncInfo ms_MFI; \ + static ::SourceHook::IHookManagerInfo *ms_HI; \ + static ::SourceHook::ProtoInfo ms_Proto; \ + SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) + +#define SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, funcptr) \ + }; \ + SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ + ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ + ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ + bool __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ + SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ + { \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(funcptr, mfi); \ + if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ + return false; /* No non-virtual functions / virtual inheritance supported */ \ + \ + return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ + SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ + new CSHDelegate(handler), post); \ + } \ + bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ + SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ + { \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(funcptr, mfi); \ + if (mfi.thisptroffs < 0) \ + return false; /* No virtual inheritance supported */ \ + \ + CSHDelegate tmp(handler); \ + return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ + SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, &tmp, post); \ + } \ + +#define SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ + struct SH_MFHCls(hookname) \ + { \ + static SH_MFHCls(hookname) ms_Inst; \ + static ::SourceHook::MemFuncInfo ms_MFI; \ + static ::SourceHook::IHookManagerInfo *ms_HI; \ + static ::SourceHook::ProtoInfo ms_Proto; \ + \ + SH_MFHCls(hookname)() \ + { \ + ms_MFI.isVirtual = true; \ + ms_MFI.thisptroffs = pthisptroffs; \ + ms_MFI.vtblindex = pvtblidx; \ + ms_MFI.vtbloffs = pvtbloffs; \ + } \ + static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ + { \ + using namespace ::SourceHook; \ + /* we don't set ms_MFI here because manual hookmans can be reconfigured */ \ + /* :FIXME: possible problem: someone adding a hook from a constructor of a global entity */ \ + /* which is construced before SH_MFHCls(hookname)() gets called? */ \ + /* Verify interface version */ \ + if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ + return 1; \ + \ + if (action == HA_GetInfo) \ + { \ + param->SetVersion(SH_HOOKMAN_VERSION); \ + param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ + reinterpret_cast(&ms_Proto)); \ + \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(&SH_MFHCls(hookname)::Func, mfi); \ + param->SetHookfuncVfnptr( \ + reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ + return 0; \ + } \ + else if (action == HA_Register) \ + { \ + ms_HI = param; \ + return 0; \ + } \ + else if (action == HA_Unregister) \ + { \ + ms_HI = NULL; \ + return 0; \ + } \ + else \ + return 1; \ + } + +#define SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ + }; \ + SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ + ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ + ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ + bool __SourceHook_FHMAdd##hookname(void *iface, bool post, \ + SH_MFHCls(hookname)::FD handler) \ + { \ + return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ + SH_MFHCls(hookname)::HookManPubFunc, \ + new ::SourceHook::CSHDelegate(handler), post); \ + } \ + bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ + SH_MFHCls(hookname)::FD handler) \ + { \ + ::SourceHook::CSHDelegate tmp(handler); \ + return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ + SH_MFHCls(hookname)::HookManPubFunc, &tmp, post); \ + } \ + + +#define SH_SETUPCALLS(rettype, paramtypes, params) \ + /* 1) Find the vfnptr */ \ + using namespace ::SourceHook; \ + void *ourvfnptr = reinterpret_cast( \ + *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ + IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ + SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ + \ + void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ + /* ... and the iface */ \ + IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ + if (!ifinfo) \ + { \ + /* The iface info was not found. Redirect the call to the original function. */ \ + rettype (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + return (reinterpret_cast(this)->*mfp)params; \ + } \ + /* 2) Declare some vars and set it up */ \ + SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ + IHookList *prelist = ifinfo->GetPreHooks(); \ + IHookList *postlist = ifinfo->GetPostHooks(); \ + META_RES status = MRES_IGNORED; \ + META_RES prev_res; \ + META_RES cur_res; \ + typedef ReferenceCarrier::type my_rettype; \ + my_rettype orig_ret; \ + my_rettype override_ret; \ + my_rettype plugin_ret; \ + void* ifptr; \ + my_rettype *pOverrideRet = reinterpret_cast(SH_GLOB_SHPTR->SetupHookLoop( \ + &status, &prev_res, &cur_res, &ifptr, &orig_ret, &override_ret)); + +#define SH_CALL_HOOKS(post, params) \ + if (SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + prev_res = MRES_IGNORED; \ + for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ + { \ + cur_res = MRES_IGNORED; \ + ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ + plugin_ret = reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ + prev_res = cur_res; \ + if (cur_res > status) \ + status = cur_res; \ + if (cur_res >= MRES_OVERRIDE) \ + *pOverrideRet = plugin_ret; \ + if (!SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + iter.SetToZero(); \ + break; \ + } \ + } \ + } + +#define SH_CALL_ORIG(rettype, paramtypes, params) \ + if (status != MRES_SUPERCEDE) \ + { \ + rettype (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + orig_ret = (reinterpret_cast(this)->*mfp)params; \ + } \ + else \ + orig_ret = override_ret; \ + +#define SH_RETURN() \ + SH_GLOB_SHPTR->HookLoopEnd(); \ + return status >= MRES_OVERRIDE ? *pOverrideRet : orig_ret; + +#define SH_HANDLEFUNC(paramtypes, params, rettype) \ + SH_SETUPCALLS(rettype, paramtypes, params) \ + SH_CALL_HOOKS(pre, params) \ + SH_CALL_ORIG(rettype, paramtypes, params) \ + SH_CALL_HOOKS(post, params) \ + SH_RETURN() + +////////////////////////////////////////////////////////////////////////// +#define SH_SETUPCALLS_void(paramtypes, params) \ + /* 1) Find the vfnptr */ \ + using namespace ::SourceHook; \ + void *ourvfnptr = reinterpret_cast( \ + *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ + IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ + SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ + \ + void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ + /* ... and the iface */ \ + IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ + if (!ifinfo) \ + { \ + /* The iface info was not found. Redirect the call to the original function. */ \ + void (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + (reinterpret_cast(this)->*mfp)params; \ + return; \ + } \ + /* 2) Declare some vars and set it up */ \ + SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ + IHookList *prelist = ifinfo->GetPreHooks(); \ + IHookList *postlist = ifinfo->GetPostHooks(); \ + META_RES status = MRES_IGNORED; \ + META_RES prev_res; \ + META_RES cur_res; \ + void* ifptr; \ + SH_GLOB_SHPTR->SetupHookLoop(&status, &prev_res, &cur_res, &ifptr, NULL, NULL); \ + +#define SH_CALL_HOOKS_void(post, params) \ + if (SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + prev_res = MRES_IGNORED; \ + for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ + { \ + cur_res = MRES_IGNORED; \ + ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ + reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ + prev_res = cur_res; \ + if (cur_res > status) \ + status = cur_res; \ + if (!SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + iter.SetToZero(); \ + break; \ + } \ + } \ + } + +#define SH_CALL_ORIG_void(paramtypes, params) \ + if (status != MRES_SUPERCEDE) \ + { \ + void (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + (reinterpret_cast(this)->*mfp)params; \ + } + +#define SH_RETURN_void() \ + SH_GLOB_SHPTR->HookLoopEnd(); + +#define SH_HANDLEFUNC_void(paramtypes, params) \ + SH_SETUPCALLS_void(paramtypes, params) \ + SH_CALL_HOOKS_void(pre, params) \ + SH_CALL_ORIG_void(paramtypes, params) \ + SH_CALL_HOOKS_void(post, params) \ + SH_RETURN_void() + + +// Special vafmt handlers +// :TODO: what +#define SH_HANDLEFUNC_vafmt(paramtypes, params_orig, params_plug, rettype) \ + SH_SETUPCALLS(rettype, paramtypes, params_orig) \ + SH_CALL_HOOKS(pre, params_plug) \ + SH_CALL_ORIG(rettype, paramtypes, params_orig) \ + SH_CALL_HOOKS(post, params_plug) \ + SH_RETURN() + +#define SH_HANDLEFUNC_void_vafmt(paramtypes, params_orig, params_plug) \ + SH_SETUPCALLS_void(paramtypes, params_orig) \ + SH_CALL_HOOKS_void(pre, params_plug) \ + SH_CALL_ORIG_void(paramtypes, params_orig) \ + SH_CALL_HOOKS_void(post, params_plug) \ + SH_RETURN_void() + +////////////////////////////////////////////////////////////////////////// + +// :FIXME: +// sizeof on references returns the size of the datatype, NOT the pointer size or something +// -> one should probably flag references in __SourceHook_ParamSizes_* ! +// or simply assume that their size is sizeof(void*)=SH_PTRSIZE... could be doable through a simple template + + +// ********* Support for 0 arguments ********* +#define SH_DECL_HOOK0(ifacetype, ifacefunc, attr, overload, rettype) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate0 FD; \ + virtual rettype Func() \ + { SH_HANDLEFUNC((), (), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK0_void(ifacetype, ifacefunc, attr, overload) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate0<> FD; \ + virtual void Func() \ + { SH_HANDLEFUNC_void((), ()); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK0_vafmt(ifacetype, ifacefunc, attr, overload, rettype) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual rettype Func(const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((...), ("%s", buf), (buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK0_void_vafmt(ifacetype, ifacefunc, attr, overload) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual void Func(const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((...), ("%s", buf), (buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK0(hookname, vtblidx, vtbloffs, thisptroffs, rettype) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate0 FD; \ + virtual rettype Func() \ + { SH_HANDLEFUNC((), (), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 0, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK0_void(hookname, vtblidx, vtbloffs, thisptroffs) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate0<> FD; \ + virtual void Func() \ + { SH_HANDLEFUNC_void((), ()); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 0, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 1 arguments ********* +#define SH_DECL_HOOK1(ifacetype, ifacefunc, attr, overload, rettype, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual rettype Func(param1 p1) \ + { SH_HANDLEFUNC((param1), (p1), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK1_void(ifacetype, ifacefunc, attr, overload, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual void Func(param1 p1) \ + { SH_HANDLEFUNC_void((param1), (p1)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK1_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual rettype Func(param1 p1, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, ...), (p1, "%s", buf), (p1, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK1_void_vafmt(ifacetype, ifacefunc, attr, overload, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual void Func(param1 p1, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, ...), (p1, "%s", buf), (p1, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK1(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual rettype Func(param1 p1) \ + { SH_HANDLEFUNC((param1), (p1), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 1, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK1_void(hookname, vtblidx, vtbloffs, thisptroffs, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual void Func(param1 p1) \ + { SH_HANDLEFUNC_void((param1), (p1)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 1, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 2 arguments ********* +#define SH_DECL_HOOK2(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual rettype Func(param1 p1, param2 p2) \ + { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK2_void(ifacetype, ifacefunc, attr, overload, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual void Func(param1 p1, param2 p2) \ + { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK2_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual rettype Func(param1 p1, param2 p2, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK2_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual void Func(param1 p1, param2 p2, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK2(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual rettype Func(param1 p1, param2 p2) \ + { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 2, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK2_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual void Func(param1 p1, param2 p2) \ + { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 2, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 3 arguments ********* +#define SH_DECL_HOOK3(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3) \ + { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK3_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3) \ + { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK3_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK3_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK3(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3) \ + { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 3, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK3_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3) \ + { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 3, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 4 arguments ********* +#define SH_DECL_HOOK4(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ + { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK4_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK4_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK4_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK4(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ + { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 4, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK4_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 4, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 5 arguments ********* +#define SH_DECL_HOOK5(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK5_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK5_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK5_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK5(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 5, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK5_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 5, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 6 arguments ********* +#define SH_DECL_HOOK6(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK6_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK6_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK6_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK6(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 6, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK6_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 6, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 7 arguments ********* +#define SH_DECL_HOOK7(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK7_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK7_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK7_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK7(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 7, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK7_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 7, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 8 arguments ********* +#define SH_DECL_HOOK8(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK8_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK8_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK8_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK8(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 8, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK8_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 8, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 9 arguments ********* +#define SH_DECL_HOOK9(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK9_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK9_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK9_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK9(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 9, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK9_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 9, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 10 arguments ********* +#define SH_DECL_HOOK10(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK10_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK10_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK10_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK10(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 10, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK10_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 10, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 11 arguments ********* +#define SH_DECL_HOOK11(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK11_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK11_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK11_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK11(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 11, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK11_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 11, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 12 arguments ********* +#define SH_DECL_HOOK12(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK12_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK12_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK12_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK12(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 12, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK12_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 12, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 13 arguments ********* +#define SH_DECL_HOOK13(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK13_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK13_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK13_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK13(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 13, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK13_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 13, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 14 arguments ********* +#define SH_DECL_HOOK14(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK14_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK14_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK14_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK14(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 14, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK14_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 14, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 15 arguments ********* +#define SH_DECL_HOOK15(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK15_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK15_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK15_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK15(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 15, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK15_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 15, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 16 arguments ********* +#define SH_DECL_HOOK16(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK16_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK16_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK16_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK16(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 16, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK16_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 16, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 17 arguments ********* +#define SH_DECL_HOOK17(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK17_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK17_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK17_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK17(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 17, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK17_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 17, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 18 arguments ********* +#define SH_DECL_HOOK18(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK18_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK18_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK18_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK18(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 18, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK18_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 18, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 19 arguments ********* +#define SH_DECL_HOOK19(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK19_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK19_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK19_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK19(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 19, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK19_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 19, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 20 arguments ********* +#define SH_DECL_HOOK20(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK20_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK20_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate21 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK20_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate21 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK20(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 20, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK20_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 20, __SourceHook_ParamSizesM_##hookname); \ + + + + +////////////////////////////////////////////////////////////////////////// +// SH_CALL + +#if SH_COMP == SH_COMP_MSVC + +# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ + void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ + if (!origfunc) \ + return (m_CC->GetThisPtr()->*m_MFP)call; \ + \ + /* It's hooked. Call the original function. */ \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + void *addr; \ + } u; \ + u.addr = origfunc; \ + \ + void *adjustedthisptr = reinterpret_cast(reinterpret_cast(m_CC->GetThisPtr()) + mfi.thisptroffs); \ + return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ +} + +# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + char *adjustedthisptr = reinterpret_cast(m_CC->GetThisPtr()) + m_ThisPtrOffs; \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + void *addr; \ + } u; \ + u.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ + if (!u.addr) \ + u.addr = (*reinterpret_cast(adjustedthisptr + m_VtblOffs))[m_VtblIdx]; \ + \ + return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ +} + +#elif SH_COMP == SH_COMP_GCC + +# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ + void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ + if (!origfunc) \ + return (m_CC->GetThisPtr()->*m_MFP)call; \ + \ + /* It's hooked. Call the original function. */ \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + struct \ + { \ + void *addr; \ + intptr_t adjustor; \ + } s; \ + } u; \ + u.s.addr = origfunc; \ + u.s.adjustor = mfi.thisptroffs; \ + \ + return (reinterpret_cast(m_CC->GetThisPtr())->*u.mfpnew)call; \ +} + +# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + char *thisptr = reinterpret_cast(m_CC->GetThisPtr()); \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + struct { \ + void *addr; \ + intptr_t adjustor; \ + } s; \ + } u; \ + u.s.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ + if (!u.s.addr) \ + u.s.addr = (*reinterpret_cast(thisptr + m_ThisPtrOffs + m_VtblOffs))[m_VtblIdx]; \ + \ + u.s.adjustor = m_ThisPtrOffs; \ + return (reinterpret_cast(thisptr)->*u.mfpnew)call; \ +} + +#endif + +namespace SourceHook +{ + + // Support for 0 arguments + template class ExecutableClass0 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass0(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()() const + SH_MAKE_EXECUTABLECLASS_OB((), ()) + + + template RetType operator()(Param1 p1) const + SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) + + template RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass0 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass0(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()() const + SH_MAKE_MEXECUTABLECLASS_OB((), ()) + + + template RetType operator()(Param1 p1) const + SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) + + template RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 1 arguments + template class ExecutableClass1 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass1(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1) const + SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) + + + template RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass1 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass1(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1) const + SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) + + + template RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 2 arguments + template class ExecutableClass2 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass2(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass2 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass2(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 3 arguments + template class ExecutableClass3 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass3(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass3 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass3(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 4 arguments + template class ExecutableClass4 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass4(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass4 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass4(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 5 arguments + template class ExecutableClass5 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass5(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass5 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass5(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 6 arguments + template class ExecutableClass6 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass6(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass6 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass6(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 7 arguments + template class ExecutableClass7 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass7(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass7 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass7(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 8 arguments + template class ExecutableClass8 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass8(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass8 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass8(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 9 arguments + template class ExecutableClass9 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass9(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass9 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass9(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 10 arguments + template class ExecutableClass10 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass10(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass10 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass10(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 11 arguments + template class ExecutableClass11 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass11(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass11 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass11(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 12 arguments + template class ExecutableClass12 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass12(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass12 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass12(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 13 arguments + template class ExecutableClass13 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass13(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass13 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass13(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 14 arguments + template class ExecutableClass14 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass14(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass14 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass14(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 15 arguments + template class ExecutableClass15 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass15(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass15 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass15(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 16 arguments + template class ExecutableClass16 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass16(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass16 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass16(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 17 arguments + template class ExecutableClass17 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass17(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass17 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass17(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 18 arguments + template class ExecutableClass18 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass18(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass18 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass18(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 19 arguments + template class ExecutableClass19 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass19(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass19 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass19(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 20 arguments + template class ExecutableClass20 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass20(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + + }; + + template class MExecutableClass20 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass20(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + + }; + + +} + +// SH_CALL needs to deduce the return type -> it uses templates and function overloading +// That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP +// The only purpose of the mfp2 parameter is to extract the return type + + +// Support for 0 arguments +template +SourceHook::ExecutableClass0, MFP, RetType> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()) +{ + return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); +} + +template +SourceHook::ExecutableClass0, MFP, RetType> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()const) +{ + return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); +} + +template +SourceHook::MExecutableClass0 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass0(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 1 arguments +template +SourceHook::ExecutableClass1, MFP, RetType, Param1> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)) +{ + return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); +} + +template +SourceHook::ExecutableClass1, MFP, RetType, Param1> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const) +{ + return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); +} + +template +SourceHook::MExecutableClass1 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass1(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 2 arguments +template +SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)) +{ + return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); +} + +template +SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const) +{ + return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); +} + +template +SourceHook::MExecutableClass2 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass2(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 3 arguments +template +SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)) +{ + return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); +} + +template +SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const) +{ + return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); +} + +template +SourceHook::MExecutableClass3 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass3(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 4 arguments +template +SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)) +{ + return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); +} + +template +SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const) +{ + return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); +} + +template +SourceHook::MExecutableClass4 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass4(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 5 arguments +template +SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)) +{ + return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); +} + +template +SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const) +{ + return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); +} + +template +SourceHook::MExecutableClass5 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass5(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 6 arguments +template +SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)) +{ + return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); +} + +template +SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const) +{ + return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); +} + +template +SourceHook::MExecutableClass6 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass6(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 7 arguments +template +SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) +{ + return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); +} + +template +SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const) +{ + return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); +} + +template +SourceHook::MExecutableClass7 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass7(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 8 arguments +template +SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) +{ + return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); +} + +template +SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const) +{ + return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); +} + +template +SourceHook::MExecutableClass8 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass8(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 9 arguments +template +SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) +{ + return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); +} + +template +SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const) +{ + return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); +} + +template +SourceHook::MExecutableClass9 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass9(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 10 arguments +template +SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) +{ + return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); +} + +template +SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const) +{ + return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); +} + +template +SourceHook::MExecutableClass10 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass10(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 11 arguments +template +SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) +{ + return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); +} + +template +SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const) +{ + return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); +} + +template +SourceHook::MExecutableClass11 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass11(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 12 arguments +template +SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) +{ + return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); +} + +template +SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const) +{ + return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); +} + +template +SourceHook::MExecutableClass12 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass12(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 13 arguments +template +SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) +{ + return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); +} + +template +SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const) +{ + return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); +} + +template +SourceHook::MExecutableClass13 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass13(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 14 arguments +template +SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) +{ + return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); +} + +template +SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const) +{ + return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); +} + +template +SourceHook::MExecutableClass14 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass14(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 15 arguments +template +SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) +{ + return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); +} + +template +SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const) +{ + return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); +} + +template +SourceHook::MExecutableClass15 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass15(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 16 arguments +template +SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) +{ + return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); +} + +template +SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const) +{ + return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); +} + +template +SourceHook::MExecutableClass16 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass16(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 17 arguments +template +SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) +{ + return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); +} + +template +SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const) +{ + return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); +} + +template +SourceHook::MExecutableClass17 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass17(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 18 arguments +template +SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) +{ + return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); +} + +template +SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const) +{ + return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); +} + +template +SourceHook::MExecutableClass18 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass18(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 19 arguments +template +SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) +{ + return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); +} + +template +SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const) +{ + return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); +} + +template +SourceHook::MExecutableClass19 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass19(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 20 arguments +template +SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) +{ + return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); +} + +template +SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const) +{ + return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); +} + +template +SourceHook::MExecutableClass20 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass20(ptr, vtbloffs, vtblidx, thisptroffs); +} + + +#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 +// GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it + + +// Support for 0 arguments +template +SourceHook::ExecutableClass0, MFP, RetType> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)) +{ + return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); +} + +template +SourceHook::ExecutableClass0, MFP, RetType> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)const) +{ + return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); +} + + +// Support for 1 arguments +template +SourceHook::ExecutableClass1, MFP, RetType, Param1> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)) +{ + return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); +} + +template +SourceHook::ExecutableClass1, MFP, RetType, Param1> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const) +{ + return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); +} + + +// Support for 2 arguments +template +SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)) +{ + return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); +} + +template +SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const) +{ + return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); +} + + +// Support for 3 arguments +template +SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)) +{ + return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); +} + +template +SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const) +{ + return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); +} + + +// Support for 4 arguments +template +SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)) +{ + return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); +} + +template +SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const) +{ + return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); +} + + +// Support for 5 arguments +template +SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)) +{ + return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); +} + +template +SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const) +{ + return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); +} + + +// Support for 6 arguments +template +SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)) +{ + return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); +} + +template +SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const) +{ + return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); +} + + +// Support for 7 arguments +template +SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)) +{ + return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); +} + +template +SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const) +{ + return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); +} + + +// Support for 8 arguments +template +SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)) +{ + return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); +} + +template +SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const) +{ + return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); +} + + +// Support for 9 arguments +template +SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)) +{ + return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); +} + +template +SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const) +{ + return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); +} + + +// Support for 10 arguments +template +SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)) +{ + return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); +} + +template +SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const) +{ + return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); +} + + +// Support for 11 arguments +template +SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)) +{ + return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); +} + +template +SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const) +{ + return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); +} + + +// Support for 12 arguments +template +SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)) +{ + return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); +} + +template +SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const) +{ + return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); +} + + +// Support for 13 arguments +template +SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)) +{ + return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); +} + +template +SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const) +{ + return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); +} + + +// Support for 14 arguments +template +SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)) +{ + return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); +} + +template +SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const) +{ + return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); +} + + +// Support for 15 arguments +template +SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)) +{ + return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); +} + +template +SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const) +{ + return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); +} + + +// Support for 16 arguments +template +SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)) +{ + return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); +} + +template +SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const) +{ + return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); +} + + +// Support for 17 arguments +template +SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)) +{ + return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); +} + +template +SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const) +{ + return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); +} + + +// Support for 18 arguments +template +SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)) +{ + return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); +} + +template +SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const) +{ + return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); +} + + +// Support for 19 arguments +template +SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)) +{ + return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); +} + +template +SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const) +{ + return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); +} + + +// Support for 20 arguments +template +SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)) +{ + return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); +} + +template +SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const) +{ + return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); +} + + + +#endif + +#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp)) +#define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ + SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) + +#undef SH_MAKE_EXECUTABLECLASS_OB + +////////////////////////////////////////////////////////////////////////// +// SetOverrideRet and RecallGetIface for recalls +// These take a ISourceHook pointer instead of using SH_GLOB_SHPTR directly +// The reason is that the user may want to redefine SH_GLOB_SHPTR - then the macros +// (META_RETURN_VALUE_NEWPARAMS) should obey the new pointer. + +namespace SourceHook +{ + template + void SetOverrideResult(ISourceHook *shptr, const RetType res) + { + *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; + } + + // SetOverrideResult used to be implemented like this: + // SetOverrideResult(shptr, memfuncptr, return); + // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference + // (it thought it was ambigous - the ref and non-ref type) + // so now SetOverrideResult(memfuncptr) deduces the ret type, and returns a functor which does the work + // new syntax: SetOverrideResult(memfuncptr)(shptr, return) + // This also allows us to create a special version for references which respects ReferenceCarrier. + + template struct OverrideFunctor + { + void operator()(ISourceHook *shptr, T res) + { + *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; + } + }; + template struct OverrideFunctor + { + void operator()(ISourceHook *shptr, T &res) + { + // overrideretptr points to ReferenceCarrier + *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; + } + }; + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)()) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)()) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + +} + +#endif + // The pope is dead. -> :( diff --git a/sourcehook/generate/sourcehook.hxx b/sourcehook/generate/sourcehook.hxx new file mode 100755 index 0000000..1431c12 --- /dev/null +++ b/sourcehook/generate/sourcehook.hxx @@ -0,0 +1,1370 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +/** +* @file sourcehook.h +* @brief Contains the public SourceHook API +*/ + +#ifndef __SOURCEHOOK_H__ +#define __SOURCEHOOK_H__ + +// Interface revisions: +// 1 - Initial revision +// 2 - Changed to virtual functions for iterators and all queries +// 3 - Added "hook loop status variable" +// 4 - Reentrant +#define SH_IFACE_VERSION 4 +#define SH_IMPL_VERSION 3 + +// Hookman version: +// 1 - Support for recalls, performance optimisations +#define SH_HOOKMAN_VERSION 1 + +// The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook +// It's used in various macros +#ifndef SH_GLOB_SHPTR +#define SH_GLOB_SHPTR g_SHPtr +#endif + +// Used to identify the current plugin +#ifndef SH_GLOB_PLUGPTR +#define SH_GLOB_PLUGPTR g_PLID +#endif + +#ifdef SH_DEBUG +# include +# include + +# define SH_ASSERT(x, info) \ + do { \ + if (!(x)) \ + { \ + printf("SOURCEHOOK DEBUG ASSERTION FAILED: %s:%u(%s): %s: ", __FILE__, __LINE__, __FUNCTION__, #x); \ + printf info; \ + putchar('\n'); \ + abort(); \ + } \ + } while(0) + +#else +# define SH_ASSERT(x, info) +#endif + +// System +#define SH_SYS_WIN32 1 +#define SH_SYS_LINUX 2 + +#ifdef _WIN32 +# define SH_SYS SH_SYS_WIN32 +#elif defined __linux__ +# define SH_SYS SH_SYS_LINUX +#else +# error Unsupported system +#endif + +// Compiler +#define SH_COMP_GCC 1 +#define SH_COMP_MSVC 2 + +#ifdef _MSC_VER +# define SH_COMP SH_COMP_MSVC +#elif defined __GNUC__ +# define SH_COMP SH_COMP_GCC +#else +# error Unsupported compiler +#endif + +#if SH_COMP==SH_COMP_MSVC +# define vsnprintf _vsnprintf +#endif + +#if SH_SYS != SH_SYS_WIN32 +# include +#endif + +#define SH_PTRSIZE sizeof(void*) + +#include "FastDelegate.h" +#include "sh_memfuncinfo.h" + +// Good old metamod! + +// Flags returned by a plugin's api function. +// NOTE: order is crucial, as greater/less comparisons are made. +enum META_RES +{ + MRES_IGNORED=0, // plugin didn't take any action + MRES_HANDLED, // plugin did something, but real function should still be called + MRES_OVERRIDE, // call real function, but use my return value + MRES_SUPERCEDE // skip real function; use my return value +}; + + +namespace SourceHook +{ + /** + * @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers + */ + const int STRBUF_LEN=4096; + + /** + * @brief An empty class. No inheritance used. Used for original-function-call hacks + */ + class EmptyClass + { + }; + + /** + * @brief Implicit cast. + */ + template + inline Out implicit_cast(In input) + { + return input; + } + + /** + * @brief A plugin typedef + * + * SourceHook doesn't really care what this is. As long as the ==, != and = operators work on it and every + * plugin has a unique identifier, everything is ok. + * It should also be possible to set it to 0. + */ + typedef int Plugin; + + struct ProtoInfo + { + ProtoInfo(int rtsz, int nop, const int *p) : beginningNull(0), retTypeSize(rtsz), numOfParams(nop), params(p) + { + } + int beginningNull; //!< To distinguish from old protos (which never begin with 0) + int retTypeSize; //!< 0 if void + int numOfParams; //!< number of parameters + const int *params; //!< params[0]=0 (or -1 for vararg), params[1]=size of first param, ... + }; + + /** + * @brief Specifies the actions for hook managers + */ + enum HookManagerAction + { + HA_GetInfo = 0, //!< Store info about the hook manager + HA_Register, //!< Save the IHookManagerInfo pointer for future reference + HA_Unregister //!< Clear the saved pointer + }; + + struct IHookManagerInfo; + + /** + * @brief Pointer to hook manager interface function + * + * A "hook manager" is a the only thing that knows the actual protoype of the function at compile time. + * + * @param ha What the hook manager should do + * @param hi A pointer to IHookManagerInfo + */ + typedef int (*HookManagerPubFunc)(HookManagerAction ha, IHookManagerInfo *hi); + + class ISHDelegate + { + public: + virtual void DeleteThis() = 0; // Ugly, I know + virtual bool IsEqual(ISHDelegate *other) = 0; + }; + + template class CSHDelegate : public ISHDelegate + { + T m_Deleg; + public: + CSHDelegate(T deleg) : m_Deleg(deleg) + { + } + + CSHDelegate(const CSHDelegate &other) : m_Deleg(other.m_Deleg) + { + } + + void DeleteThis() + { + delete this; + } + + bool IsEqual(ISHDelegate *other) + { + return static_cast* >(other)->GetDeleg() == GetDeleg(); + } + + T &GetDeleg() + { + return m_Deleg; + } + }; + + struct IHookList + { + struct IIter + { + virtual bool End() = 0; + virtual void Next() = 0; + virtual ISHDelegate *Handler() = 0; + virtual int ThisPtrOffs() = 0; + }; + virtual IIter *GetIter() = 0; + virtual void ReleaseIter(IIter *pIter) = 0; + }; + + struct IIface + { + virtual void *GetPtr() = 0; + virtual IHookList *GetPreHooks() = 0; + virtual IHookList *GetPostHooks() = 0; + }; + + struct IVfnPtr + { + virtual void *GetVfnPtr() = 0; + virtual void *GetOrigEntry() = 0; + + virtual IIface *FindIface(void *ptr) = 0; + }; + + struct IHookManagerInfo + { + virtual IVfnPtr *FindVfnPtr(void *vfnptr) = 0; + + virtual void SetInfo(int vtbloffs, int vtblidx, const char *proto) = 0; + virtual void SetHookfuncVfnptr(void *hookfunc_vfnptr) = 0; + + // Added 23.12.2005 (yup! I'm coding RIGHT BEFORE CHRISTMAS!) + // If the hookman doesn't set this, it defaults 0 + // SourceHook prefers hookmans with higher version numbers + virtual void SetVersion(int version) = 0; + }; + + class AutoHookIter + { + IHookList *m_pList; + IHookList::IIter *m_pIter; + public: + AutoHookIter(IHookList *pList) + : m_pList(pList), m_pIter(pList->GetIter()) + { + } + + ~AutoHookIter() + { + if (m_pList) + m_pList->ReleaseIter(m_pIter); + } + + bool End() + { + return m_pIter->End(); + } + + void Next() + { + m_pIter->Next(); + } + + ISHDelegate *Handler() + { + return m_pIter->Handler(); + } + + int ThisPtrOffs() + { + return m_pIter->ThisPtrOffs(); + } + + void SetToZero() + { + m_pList = 0; + } + }; + + template struct CallClass + { + virtual B *GetThisPtr() = 0; + virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; + }; + + typedef CallClass GenericCallClass; + typedef CallClass ManualCallClass; + + // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) + // - Today is an important day. + // I'm adding support for functions which return references. + + // How it works: + // SH_SETUPCALLS doesn't use plain rettype to store the temporary return values (plugin ret, orig ret, + // override ret) anymore; instead, it uses SourceHook::ReferenceCarrier::type + // this is typedefed to the original rettype normally, but if the rettype is a reference, it's a special class + // which stores the reference as a pointer, and implements constructors, operator= and a conversion operator. + // special cases were needed for getoverrideret / getorigret; these are implemented through the + // SourceHook::MacroRefHelpers structs. + // Furthermore, SetOverrideRet had to be changed a bit; see SourceHook::OverrideFunctor somewhere down in this file. + template struct ReferenceCarrier + { + typedef T type; + }; + + template struct ReferenceCarrier + { + class type + { + T *m_StoredRef; + public: + type() : m_StoredRef(NULL) + { + } + type(T& ref) : m_StoredRef(&ref) + { + } + + T& operator= (T& ref) + { + m_StoredRef = &ref; + return ref; + } + + operator T& () const + { + return *m_StoredRef; + } + }; + }; + + /** + * @brief The main SourceHook interface + */ + class ISourceHook + { + public: + /** + * @brief Return interface version + */ + virtual int GetIfaceVersion() = 0; + + /** + * @brief Return implementation version + */ + virtual int GetImplVersion() = 0; + + /** + * @brief Add a hook. + * + * @return True if the function succeeded, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param iface The interface pointer + * @param ifacesize The size of the class iface points to + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) = 0; + + /** + * @brief Removes a hook. + * + * @return True if the function succeeded, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param iface The interface pointer + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) = 0; + + /** + * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins + * + * @param plug The unique identifier of the plugin in question + */ + virtual bool IsPluginInUse(Plugin plug) = 0; + + /** + * @brief Return a pointer to a callclass. Generate a new one if required. + * + * @param iface The interface pointer + * @param size Size of the class instance + */ + virtual GenericCallClass *GetCallClass(void *iface, size_t size) = 0; + + /** + * @brief Release a callclass + * + * @param ptr Pointer to the callclass + */ + virtual void ReleaseCallClass(GenericCallClass *ptr) = 0; + + virtual void SetRes(META_RES res) = 0; //!< Sets the meta result + virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the + //!< previously calledhandler + virtual META_RES GetStatus() = 0; //!< Gets the highest meta result + virtual const void *GetOrigRet() = 0; //!< Gets the original result. + //!< If not in post function, undefined + virtual const void *GetOverrideRet() = 0; //!< Gets the override result. + //!< If none is specified, NULL + virtual void *GetIfacePtr() = 0; //!< Gets the interface pointer + ////////////////////////////////////////////////////////////////////////// + // For hook managers + virtual void HookLoopBegin(IIface *pIface) = 0; //!< Should be called when a hook loop begins + virtual void HookLoopEnd() = 0; //!< Should be called when a hook loop exits + virtual void SetCurResPtr(META_RES *mres) = 0; //!< Sets pointer to the current meta result + virtual void SetPrevResPtr(META_RES *mres) = 0; //!< Sets pointer to previous meta result + virtual void SetStatusPtr(META_RES *mres) = 0; //!< Sets pointer to the status variable + virtual void SetIfacePtrPtr(void **pp) = 0; //!< Sets pointer to the interface this pointer + virtual void SetOrigRetPtr(const void *ptr) = 0; //!< Sets the original return pointer + virtual void SetOverrideRetPtr(void *ptr) = 0; //!< Sets the override result pointer + virtual bool ShouldContinue() = 0; //!< Returns false if the hook loop should exit + + /** + * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. + * + * @param plug The owner of the hook manager + * @param pubFunc The hook manager's info function + */ + virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) = 0; + + virtual void DoRecall() = 0; //!< Initiates a recall sequence + /* + HOW RECALLS WORK: + + The problem: + Users want the ability to change parameters of the called function + from inside their handler. + The solution: + 1) Mark as "recall" + 2) Recall the function + 3) => SH's hook func gets called: + 4) The first iterator points at the first hook the last hookfunc didn't execute yet + 5) does all iteration and returns normally + 6) The user's handler returns immediately + 7) The hook func returns immediately as well + + Also note that the recalled hookfunc starts with the status the recalling hookfunc + ended with. The last handler (doing the recall) is also able to specify its own + META_RES. + */ + + virtual void *GetOverrideRetPtr() = 0; //!< Returns the pointer set by SetOverrideRetPtr + + /** + * @brief Set up the hook loop. Equivalent to calling: + * SetStatusPtr, SetPrevResPtr, SetCurResPtr, SetIfacePtrPtr, SetOrigRetPtr, Get/SetOverrideRetPtr + * + * @param statusPtr pointer to status variable + * @param prevResPtr pointer to previous result variable + * @param curResPtr pointer to current result variable + * @param ifacePtrPtr pointer to interface this pointer variable + * @param origRetPr pointer to original return value variable. NULL for void funcs + * @param overrideRetPtr pointer to override return value variable. NULL for void funcs + * + * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr + * when the hook func is being called as part of a recall + */ + virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, + void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; + + //!< + }; + + // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: + // These have to be able to return references. If T is a reference, the pointers returned + // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. + template struct MacroRefHelpers + { + inline static const T* GetOrigRet(ISourceHook *shptr) + { + return reinterpret_cast(shptr->GetOrigRet()); + } + inline static const T* GetOverrideRet(ISourceHook *shptr) + { + return reinterpret_cast(shptr->GetOverrideRet()); + } + }; + + template struct MacroRefHelpers + { + inline static T* GetOrigRet(ISourceHook *shptr) + { + T &ref = *reinterpret_cast::type *>(shptr->GetOrigRet()); + return &ref; + } + inline static T* GetOverrideRet(ISourceHook *shptr) + { + T &ref = *reinterpret_cast::type *>(shptr->GetOverrideRet()); + return &ref; + } + }; +} + +/************************************************************************/ +/* High level interface */ +/************************************************************************/ +#define META_RESULT_STATUS SH_GLOB_SHPTR->GetStatus() +#define META_RESULT_PREVIOUS SH_GLOB_SHPTR->GetPrevRes() +#define META_RESULT_ORIG_RET(type) *SourceHook::MacroRefHelpers::GetOrigRet(SH_GLOB_SHPTR) +#define META_RESULT_OVERRIDE_RET(type) *SourceHook::MacroRefHelpers::GetOverrideRet(SH_GLOB_SHPTR) +#define META_IFACEPTR(type) reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()) + +#define SET_META_RESULT(result) SH_GLOB_SHPTR->SetRes(result) +#define RETURN_META(result) do { SET_META_RESULT(result); return; } while(0) +#define RETURN_META_VALUE(result, value) do { SET_META_RESULT(result); return (value); } while(0) + +// If a hook on a function which returns a reference does not want to specify a return value, +// it can use this macro. +// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! +#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) + +// only call these from the hook handlers directly! +// :TODO: enforce it ? + +// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? +// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE + +// SourceHook::SetOverrideRet is defined later. +#define RETURN_META_NEWPARAMS(result, memfuncptr, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams; \ + RETURN_META(MRES_SUPERCEDE); \ + } while (0) + +#define RETURN_META_VALUE_NEWPARAMS(result, value, memfuncptr, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + if ((result) >= MRES_OVERRIDE) \ + { \ + /* meh, set the override result here because we don't get a chance to return */ \ + /* before continuing the hook loop through the recall */ \ + SourceHook::SetOverrideResult(memfuncptr)(SH_GLOB_SHPTR, value); \ + } \ + RETURN_META_VALUE(MRES_SUPERCEDE, \ + (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams); \ + } while (0) + +// :TODO: thisptroffs in MNEWPARAMS ?? + +#if SH_COMP == SH_COMP_MSVC + +#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ + union \ + { \ + SH_MFHCls(hookname)::ECMFP mfp; \ + void *addr; \ + } u; \ + SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ + u.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ + SH_MFHCls(hookname)::ms_MFI.vtblindex]; + +#elif SH_COMP == SH_COMP_GCC + +#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ + union \ + { \ + SH_MFHCls(hookname)::ECMFP mfp; \ + struct \ + { \ + void *addr; \ + intptr_t adjustor; \ + } s; \ + } u; \ + SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ + u.s.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ + SH_MFHCls(hookname)::ms_MFI.vtblindex]; \ + u.s.adjustor = 0; + +#endif + +#define RETURN_META_MNEWPARAMS(result, hookname, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ + (thisptr->*(u.mfp)) newparams; \ + RETURN_META(MRES_SUPERCEDE); \ + } while (0) + +#define RETURN_META_VALUE_MNEWPARAMS(result, value, hookname, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + if ((result) >= MRES_OVERRIDE) \ + { \ + /* see RETURN_META_VALUE_NEWPARAMS */ \ + SourceHook::SetOverrideResult(SH_GLOB_SHPTR, value); \ + } \ + SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ + RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ + } while (0) + +/** +* @brief Get/generate callclass for an interface pointer +* +* @param ifaceptr The interface pointer +*/ +template +inline SourceHook::CallClass *SH_GET_CALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr) +{ + return reinterpret_cast*>( + shptr->GetCallClass(reinterpret_cast(ptr), sizeof(ifacetype))); +} + +template +inline SourceHook::CallClass *SH_GET_MCALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr, int ifacesize) +{ + return reinterpret_cast*>( + shptr->GetCallClass(reinterpret_cast(ptr), ifacesize)); +} + +template +inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::CallClass *ptr) +{ + shptr->ReleaseCallClass(reinterpret_cast(ptr)); +} + +#define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ + do { \ + SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ + SH_MFHCls(hookname)::ms_MFI.thisptroffs = pthisptroffs; \ + SH_MFHCls(hookname)::ms_MFI.vtblindex = pvtblindex; \ + SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ + } while (0) + +#define SH_GET_CALLCLASS(ptr) SH_GET_CALLCLASS_R(SH_GLOB_SHPTR, ptr) +#define SH_GET_MCALLCLASS(ptr, size) SH_GET_MCALLCLASS_R(SH_GLOB_SHPTR, reinterpret_cast(ptr), size) +#define SH_RELEASE_CALLCLASS(ptr) SH_RELEASE_CALLCLASS_R(SH_GLOB_SHPTR, ptr) + +#define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ + __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ + post, handler) +#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + +#define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ + __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ + post, handler) +#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + + +#define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ + __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) +#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + +#define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ + __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) +#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + + +#define SH_NOATTRIB + + + + +#if SH_COMP == SH_COMP_MSVC +# define SH_SETUP_MFP(mfp) \ + reinterpret_cast(&mfp)[0] = vfnptr_origentry; +#elif SH_COMP == SH_COMP_GCC +# define SH_SETUP_MFP(mfp) \ + reinterpret_cast(&mfp)[0] = vfnptr_origentry; \ + reinterpret_cast(&mfp)[1] = 0; +#else +# error Not supported yet. +#endif + +////////////////////////////////////////////////////////////////////////// +#define SH_FHCls(ift, iff, ov) __SourceHook_FHCls_##ift##iff##ov +#define SH_MFHCls(hookname) __SourceHook_MFHCls_##hookname + +#define SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) \ + SH_FHCls(ifacetype,ifacefunc,overload)() \ + { \ + GetFuncInfo(funcptr, ms_MFI); \ + } \ + \ + static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ + { \ + using namespace ::SourceHook; \ + GetFuncInfo(funcptr, ms_MFI); \ + /* Verify interface version */ \ + if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ + return 1; \ + \ + if (action == HA_GetInfo) \ + { \ + param->SetVersion(SH_HOOKMAN_VERSION); \ + param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ + reinterpret_cast(&ms_Proto)); \ + \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(&SH_FHCls(ifacetype,ifacefunc,overload)::Func, mfi); \ + param->SetHookfuncVfnptr( \ + reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ + return 0; \ + } \ + else if (action == HA_Register) \ + { \ + ms_HI = param; \ + return 0; \ + } \ + else if (action == HA_Unregister) \ + { \ + ms_HI = NULL; \ + return 0; \ + } \ + else \ + return 1; \ + } + +// It has to be possible to use the macros in namespaces +// -> So we need to access and extend the global SourceHook namespace +// We use a namespace alias for this +#define SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, funcptr) \ + struct SH_FHCls(ifacetype,ifacefunc,overload) \ + { \ + static SH_FHCls(ifacetype,ifacefunc,overload) ms_Inst; \ + static ::SourceHook::MemFuncInfo ms_MFI; \ + static ::SourceHook::IHookManagerInfo *ms_HI; \ + static ::SourceHook::ProtoInfo ms_Proto; \ + SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) + +#define SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, funcptr) \ + }; \ + SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ + ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ + ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ + bool __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ + SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ + { \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(funcptr, mfi); \ + if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ + return false; /* No non-virtual functions / virtual inheritance supported */ \ + \ + return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ + SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ + new CSHDelegate(handler), post); \ + } \ + bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ + SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ + { \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(funcptr, mfi); \ + if (mfi.thisptroffs < 0) \ + return false; /* No virtual inheritance supported */ \ + \ + CSHDelegate tmp(handler); \ + return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ + SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, &tmp, post); \ + } \ + +#define SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ + struct SH_MFHCls(hookname) \ + { \ + static SH_MFHCls(hookname) ms_Inst; \ + static ::SourceHook::MemFuncInfo ms_MFI; \ + static ::SourceHook::IHookManagerInfo *ms_HI; \ + static ::SourceHook::ProtoInfo ms_Proto; \ + \ + SH_MFHCls(hookname)() \ + { \ + ms_MFI.isVirtual = true; \ + ms_MFI.thisptroffs = pthisptroffs; \ + ms_MFI.vtblindex = pvtblidx; \ + ms_MFI.vtbloffs = pvtbloffs; \ + } \ + static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ + { \ + using namespace ::SourceHook; \ + /* we don't set ms_MFI here because manual hookmans can be reconfigured */ \ + /* :FIXME: possible problem: someone adding a hook from a constructor of a global entity */ \ + /* which is construced before SH_MFHCls(hookname)() gets called? */ \ + /* Verify interface version */ \ + if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ + return 1; \ + \ + if (action == HA_GetInfo) \ + { \ + param->SetVersion(SH_HOOKMAN_VERSION); \ + param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ + reinterpret_cast(&ms_Proto)); \ + \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(&SH_MFHCls(hookname)::Func, mfi); \ + param->SetHookfuncVfnptr( \ + reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ + return 0; \ + } \ + else if (action == HA_Register) \ + { \ + ms_HI = param; \ + return 0; \ + } \ + else if (action == HA_Unregister) \ + { \ + ms_HI = NULL; \ + return 0; \ + } \ + else \ + return 1; \ + } + +#define SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ + }; \ + SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ + ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ + ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ + bool __SourceHook_FHMAdd##hookname(void *iface, bool post, \ + SH_MFHCls(hookname)::FD handler) \ + { \ + return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ + SH_MFHCls(hookname)::HookManPubFunc, \ + new ::SourceHook::CSHDelegate(handler), post); \ + } \ + bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ + SH_MFHCls(hookname)::FD handler) \ + { \ + ::SourceHook::CSHDelegate tmp(handler); \ + return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ + SH_MFHCls(hookname)::HookManPubFunc, &tmp, post); \ + } \ + + +#define SH_SETUPCALLS(rettype, paramtypes, params) \ + /* 1) Find the vfnptr */ \ + using namespace ::SourceHook; \ + void *ourvfnptr = reinterpret_cast( \ + *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ + IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ + SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ + \ + void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ + /* ... and the iface */ \ + IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ + if (!ifinfo) \ + { \ + /* The iface info was not found. Redirect the call to the original function. */ \ + rettype (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + return (reinterpret_cast(this)->*mfp)params; \ + } \ + /* 2) Declare some vars and set it up */ \ + SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ + IHookList *prelist = ifinfo->GetPreHooks(); \ + IHookList *postlist = ifinfo->GetPostHooks(); \ + META_RES status = MRES_IGNORED; \ + META_RES prev_res; \ + META_RES cur_res; \ + typedef ReferenceCarrier::type my_rettype; \ + my_rettype orig_ret; \ + my_rettype override_ret; \ + my_rettype plugin_ret; \ + void* ifptr; \ + my_rettype *pOverrideRet = reinterpret_cast(SH_GLOB_SHPTR->SetupHookLoop( \ + &status, &prev_res, &cur_res, &ifptr, &orig_ret, &override_ret)); + +#define SH_CALL_HOOKS(post, params) \ + if (SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + prev_res = MRES_IGNORED; \ + for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ + { \ + cur_res = MRES_IGNORED; \ + ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ + plugin_ret = reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ + prev_res = cur_res; \ + if (cur_res > status) \ + status = cur_res; \ + if (cur_res >= MRES_OVERRIDE) \ + *pOverrideRet = plugin_ret; \ + if (!SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + iter.SetToZero(); \ + break; \ + } \ + } \ + } + +#define SH_CALL_ORIG(rettype, paramtypes, params) \ + if (status != MRES_SUPERCEDE) \ + { \ + rettype (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + orig_ret = (reinterpret_cast(this)->*mfp)params; \ + } \ + else \ + orig_ret = override_ret; \ + +#define SH_RETURN() \ + SH_GLOB_SHPTR->HookLoopEnd(); \ + return status >= MRES_OVERRIDE ? *pOverrideRet : orig_ret; + +#define SH_HANDLEFUNC(paramtypes, params, rettype) \ + SH_SETUPCALLS(rettype, paramtypes, params) \ + SH_CALL_HOOKS(pre, params) \ + SH_CALL_ORIG(rettype, paramtypes, params) \ + SH_CALL_HOOKS(post, params) \ + SH_RETURN() + +////////////////////////////////////////////////////////////////////////// +#define SH_SETUPCALLS_void(paramtypes, params) \ + /* 1) Find the vfnptr */ \ + using namespace ::SourceHook; \ + void *ourvfnptr = reinterpret_cast( \ + *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ + IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ + SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ + \ + void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ + /* ... and the iface */ \ + IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ + if (!ifinfo) \ + { \ + /* The iface info was not found. Redirect the call to the original function. */ \ + void (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + (reinterpret_cast(this)->*mfp)params; \ + return; \ + } \ + /* 2) Declare some vars and set it up */ \ + SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ + IHookList *prelist = ifinfo->GetPreHooks(); \ + IHookList *postlist = ifinfo->GetPostHooks(); \ + META_RES status = MRES_IGNORED; \ + META_RES prev_res; \ + META_RES cur_res; \ + void* ifptr; \ + SH_GLOB_SHPTR->SetupHookLoop(&status, &prev_res, &cur_res, &ifptr, NULL, NULL); \ + +#define SH_CALL_HOOKS_void(post, params) \ + if (SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + prev_res = MRES_IGNORED; \ + for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ + { \ + cur_res = MRES_IGNORED; \ + ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ + reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ + prev_res = cur_res; \ + if (cur_res > status) \ + status = cur_res; \ + if (!SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + iter.SetToZero(); \ + break; \ + } \ + } \ + } + +#define SH_CALL_ORIG_void(paramtypes, params) \ + if (status != MRES_SUPERCEDE) \ + { \ + void (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + (reinterpret_cast(this)->*mfp)params; \ + } + +#define SH_RETURN_void() \ + SH_GLOB_SHPTR->HookLoopEnd(); + +#define SH_HANDLEFUNC_void(paramtypes, params) \ + SH_SETUPCALLS_void(paramtypes, params) \ + SH_CALL_HOOKS_void(pre, params) \ + SH_CALL_ORIG_void(paramtypes, params) \ + SH_CALL_HOOKS_void(post, params) \ + SH_RETURN_void() + + +// Special vafmt handlers +// :TODO: what +#define SH_HANDLEFUNC_vafmt(paramtypes, params_orig, params_plug, rettype) \ + SH_SETUPCALLS(rettype, paramtypes, params_orig) \ + SH_CALL_HOOKS(pre, params_plug) \ + SH_CALL_ORIG(rettype, paramtypes, params_orig) \ + SH_CALL_HOOKS(post, params_plug) \ + SH_RETURN() + +#define SH_HANDLEFUNC_void_vafmt(paramtypes, params_orig, params_plug) \ + SH_SETUPCALLS_void(paramtypes, params_orig) \ + SH_CALL_HOOKS_void(pre, params_plug) \ + SH_CALL_ORIG_void(paramtypes, params_orig) \ + SH_CALL_HOOKS_void(post, params_plug) \ + SH_RETURN_void() + +////////////////////////////////////////////////////////////////////////// + +// :FIXME: +// sizeof on references returns the size of the datatype, NOT the pointer size or something +// -> one should probably flag references in __SourceHook_ParamSizes_* ! +// or simply assume that their size is sizeof(void*)=SH_PTRSIZE... could be doable through a simple template + +@[$1,0,$a: +// ********* Support for $1 arguments ********* +#define SH_DECL_HOOK$1(ifacetype, ifacefunc, attr, overload, rettype@[$2,1,$1:, param$2@]) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]@[$1!=0:, @]rettype> FD; \ + virtual rettype Func(@[$2,1,$1|, :param$2 p$2@]) \ + { SH_HANDLEFUNC((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@]), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK$1_void(ifacetype, ifacefunc, attr, overload@[$2,1,$1:, param$2@]) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]> FD; \ + virtual void Func(@[$2,1,$1|, :param$2 p$2@]) \ + { SH_HANDLEFUNC_void((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@])); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK$1_vafmt(ifacetype, ifacefunc, attr, overload, rettype@[$2,1,$1:, param$2@]) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate@($1+1)<@[$2,1,$1|, :param$2@]@[$1!=0:, @]const char *, rettype> FD; \ + virtual rettype Func(@[$2,1,$1|, :param$2 p$2@]@[$1!=0:, @]const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((@[$2,1,$1|, :param$2@]@[$1!=0:, @]...), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]"%s", buf), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1@[$2,1,$1:, sizeof(param$2)@] }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK$1_void_vafmt(ifacetype, ifacefunc, attr, overload@[$2,1,$1:, param$2@]) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate@($1+1)<@[$2,1,$1|, :param$2@]@[$1!=0:, @]const char *> FD; \ + virtual void Func(@[$2,1,$1|, :param$2 p$2@]@[$1!=0:, @]const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((@[$2,1,$1|, :param$2@]@[$1!=0:, @]...), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]"%s", buf), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1@[$2,1,$1:, sizeof(param$2)@] }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK$1(hookname, vtblidx, vtbloffs, thisptroffs, rettype@[$2,1,$1:, param$2@]) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]@[$1!=0:, @]rettype> FD; \ + virtual rettype Func(@[$2,1,$1|, :param$2 p$2@]) \ + { SH_HANDLEFUNC((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@]), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(@[$2,1,$1|, :param$2@]); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + $1, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK$1_void(hookname, vtblidx, vtbloffs, thisptroffs@[$2,1,$1:, param$2@]) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]> FD; \ + virtual void Func(@[$2,1,$1|, :param$2 p$2@]) \ + { SH_HANDLEFUNC_void((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@])); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(@[$2,1,$1|, :param$2@]); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + $1, __SourceHook_ParamSizesM_##hookname); \ + +@] + + +////////////////////////////////////////////////////////////////////////// +// SH_CALL + +#if SH_COMP == SH_COMP_MSVC + +# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ + void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ + if (!origfunc) \ + return (m_CC->GetThisPtr()->*m_MFP)call; \ + \ + /* It's hooked. Call the original function. */ \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + void *addr; \ + } u; \ + u.addr = origfunc; \ + \ + void *adjustedthisptr = reinterpret_cast(reinterpret_cast(m_CC->GetThisPtr()) + mfi.thisptroffs); \ + return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ +} + +# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + char *adjustedthisptr = reinterpret_cast(m_CC->GetThisPtr()) + m_ThisPtrOffs; \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + void *addr; \ + } u; \ + u.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ + if (!u.addr) \ + u.addr = (*reinterpret_cast(adjustedthisptr + m_VtblOffs))[m_VtblIdx]; \ + \ + return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ +} + +#elif SH_COMP == SH_COMP_GCC + +# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ + void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ + if (!origfunc) \ + return (m_CC->GetThisPtr()->*m_MFP)call; \ + \ + /* It's hooked. Call the original function. */ \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + struct \ + { \ + void *addr; \ + intptr_t adjustor; \ + } s; \ + } u; \ + u.s.addr = origfunc; \ + u.s.adjustor = mfi.thisptroffs; \ + \ + return (reinterpret_cast(m_CC->GetThisPtr())->*u.mfpnew)call; \ +} + +# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + char *thisptr = reinterpret_cast(m_CC->GetThisPtr()); \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + struct { \ + void *addr; \ + intptr_t adjustor; \ + } s; \ + } u; \ + u.s.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ + if (!u.s.addr) \ + u.s.addr = (*reinterpret_cast(thisptr + m_ThisPtrOffs + m_VtblOffs))[m_VtblIdx]; \ + \ + u.s.adjustor = m_ThisPtrOffs; \ + return (reinterpret_cast(thisptr)->*u.mfpnew)call; \ +} + +#endif + +namespace SourceHook +{ +@[$1,0,$a: + // Support for $1 arguments + template class ExecutableClass$1 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass$1(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(@[$2,1,$1|, :Param$2 p$2@]) const + SH_MAKE_EXECUTABLECLASS_OB((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) + + @[$2,$1+1,$a: + template <@[$3,$1+1,$2|, :class Param$3@]> RetType operator()(@[$3,1,$2|, :Param$3 p$3@]) const + SH_MAKE_EXECUTABLECLASS_OB((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) + @] + }; + + template class MExecutableClass$1 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass$1(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(@[$2,1,$1|, :Param$2 p$2@]) const + SH_MAKE_MEXECUTABLECLASS_OB((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) + + @[$2,$1+1,$a: + template <@[$3,$1+1,$2|, :class Param$3@]> RetType operator()(@[$3,1,$2|, :Param$3 p$3@]) const + SH_MAKE_MEXECUTABLECLASS_OB((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) + @] + }; +@] + +} + +// SH_CALL needs to deduce the return type -> it uses templates and function overloading +// That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP +// The only purpose of the mfp2 parameter is to extract the return type + +@[$1,0,$a: +// Support for $1 arguments +template +SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@])) +{ + return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); +} + +template +SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@])const) +{ + return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); +} + +template +SourceHook::MExecutableClass$1 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass$1(ptr, vtbloffs, vtblidx, thisptroffs); +} +@] + +#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 +// GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it + +@[$1,0,$a: +// Support for $1 arguments +template +SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...)) +{ + return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); +} + +template +SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...)const) +{ + return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); +} + +@] + +#endif + +#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp)) +#define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ + SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) + +#undef SH_MAKE_EXECUTABLECLASS_OB + +////////////////////////////////////////////////////////////////////////// +// SetOverrideRet and RecallGetIface for recalls +// These take a ISourceHook pointer instead of using SH_GLOB_SHPTR directly +// The reason is that the user may want to redefine SH_GLOB_SHPTR - then the macros +// (META_RETURN_VALUE_NEWPARAMS) should obey the new pointer. + +namespace SourceHook +{ + template + void SetOverrideResult(ISourceHook *shptr, const RetType res) + { + *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; + } + + // SetOverrideResult used to be implemented like this: + // SetOverrideResult(shptr, memfuncptr, return); + // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference + // (it thought it was ambigous - the ref and non-ref type) + // so now SetOverrideResult(memfuncptr) deduces the ret type, and returns a functor which does the work + // new syntax: SetOverrideResult(memfuncptr)(shptr, return) + // This also allows us to create a special version for references which respects ReferenceCarrier. + + template struct OverrideFunctor + { + void operator()(ISourceHook *shptr, T res) + { + *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; + } + }; + template struct OverrideFunctor + { + void operator()(ISourceHook *shptr, T &res) + { + // overrideretptr points to ReferenceCarrier + *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; + } + }; +@[$1,0,$a: + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(@[$2,1,$1|, :Param$2@])) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(@[$2,1,$1|, :Param$2@])) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } +@] +} + +#endif + // The pope is dead. -> :( diff --git a/sourcehook/sh_list.h b/sourcehook/sh_list.h new file mode 100644 index 0000000..12a56f2 --- /dev/null +++ b/sourcehook/sh_list.h @@ -0,0 +1,291 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): David "BAILOPAN" Anderson +* ============================ +*/ + +#ifndef _INCLUDE_SMM_LIST_H +#define _INCLUDE_SMM_LIST_H + +#include +#include + +namespace SourceHook +{ + + //This class is from CSDM for AMX Mod X + /* + A circular, doubly-linked list with one sentinel node + + Empty: + m_Head = sentinel + m_Head->next = m_Head; + m_Head->prev = m_Head; + One element: + m_Head = sentinel + m_Head->next = node1 + m_Head->prev = node1 + node1->next = m_Head + node1->prev = m_Head + Two elements: + m_Head = sentinel + m_Head->next = node1 + m_Head->prev = node2 + node1->next = node2 + node1->prev = m_Head + node2->next = m_Head + node2->prev = node1 + */ + template + class List + { + public: + class iterator; + friend class iterator; + class ListNode + { + public: + ListNode(const T & o) : obj(o) { }; + ListNode() { }; + T obj; + ListNode *next; + ListNode *prev; + }; + private: + // Initializes the sentinel node. + // BAIL used malloc instead of new in order to bypass the need for a constructor. + ListNode *_Initialize() + { + ListNode *n = (ListNode *)malloc(sizeof(ListNode)); + n->next = n; + n->prev = n; + return n; + } + public: + List() : m_Head(_Initialize()), m_Size(0) + { + } + List(const List &src) : m_Head(_Initialize()), m_Size(0) + { + iterator iter; + for (iter=src.begin(); iter!=src.end(); iter++) + push_back( (*iter) ); + } + ~List() + { + clear(); + + // Don't forget to free the sentinel + if (m_Head) + { + free(m_Head); + m_Head = NULL; + } + } + void push_back(const T &obj) + { + ListNode *node = new ListNode(obj); + + node->prev = m_Head->prev; + node->next = m_Head; + m_Head->prev->next = node; + m_Head->prev = node; + + m_Size++; + } + size_t size() const + { + return m_Size; + } + + void clear() + { + ListNode *node = m_Head->next; + ListNode *temp; + m_Head->next = m_Head; + m_Head->prev = m_Head; + + // Iterate through the nodes until we find g_Head (the sentinel) again + while (node != m_Head) + { + temp = node->next; + delete node; + node = temp; + } + m_Size = 0; + } + bool empty() const + { + return (m_Size == 0); + } + T & back() + { + return m_Head->prev->obj; + } + private: + ListNode *m_Head; + size_t m_Size; + public: + class iterator + { + friend class List; + public: + iterator() + { + m_This = NULL; + } + iterator(const List &src) + { + m_This = src.m_Head; + } + iterator(ListNode *n) : m_This(n) + { + } + iterator(const iterator &where) + { + m_This = where.m_This; + } + //pre decrement + iterator & operator--() + { + if (m_This) + m_This = m_This->prev; + return *this; + } + //post decrement + iterator operator--(int) + { + iterator old(*this); + if (m_This) + m_This = m_This->prev; + return old; + } + + //pre increment + iterator & operator++() + { + if (m_This) + m_This = m_This->next; + return *this; + } + //post increment + iterator operator++(int) + { + iterator old(*this); + if (m_This) + m_This = m_This->next; + return old; + } + + const T & operator * () const + { + return m_This->obj; + } + T & operator * () + { + return m_This->obj; + } + + T * operator -> () + { + return &(m_This->obj); + } + const T * operator -> () const + { + return &(m_This->obj); + } + + bool operator != (const iterator &where) const + { + return (m_This != where.m_This); + } + bool operator ==(const iterator &where) const + { + return (m_This == where.m_This); + } + private: + ListNode *m_This; + }; + public: + iterator begin() const + { + return iterator(m_Head->next); + } + iterator end() const + { + return iterator(m_Head); + } + iterator erase(iterator &where) + { + ListNode *pNode = where.m_This; + iterator iter(where); + iter++; + + + // Works for all cases: empty list, erasing first element, erasing tail, erasing in the middle... + pNode->prev->next = pNode->next; + pNode->next->prev = pNode->prev; + + delete pNode; + m_Size--; + + return iter; + } + + iterator insert(iterator where, const T &obj) + { + // Insert obj right before where + + ListNode *node = new ListNode(obj); + ListNode *pWhereNode = where.m_This; + + pWhereNode->prev->next = node; + node->prev = pWhereNode->prev; + pWhereNode->prev = node; + node->next = pWhereNode; + + m_Size++; + + return iterator(node); + } + + public: + void remove(const T & obj) + { + iterator b; + for (b=begin(); b!=end(); b++) + { + if ( (*b) == obj ) + { + erase( b ); + break; + } + } + } + template + iterator find(const U & equ) const + { + iterator iter; + for (iter=begin(); iter!=end(); iter++) + { + if ( (*iter) == equ ) + return iter; + } + return end(); + } + List & operator =(const List &src) + { + clear(); + iterator iter; + for (iter=src.begin(); iter!=src.end(); iter++) + push_back( (*iter) ); + return *this; + } + }; +}; //NAMESPACE + +#endif //_INCLUDE_CSDM_LIST_H diff --git a/sourcehook/sh_memfuncinfo.h b/sourcehook/sh_memfuncinfo.h new file mode 100644 index 0000000..fbfddab --- /dev/null +++ b/sourcehook/sh_memfuncinfo.h @@ -0,0 +1,912 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +/** + * @brief This file provides a way for getting information about a member function. + * @file sh_memfuncinfo.h + */ + +#ifndef __SHINT_MEMFUNC_INFO_H__ +#define __SHINT_MEMFUNC_INFO_H__ + +namespace SourceHook +{ + + // Don Clugston: + // implicit_cast< > + // I believe this was originally going to be in the C++ standard but + // was left out by accident. It's even milder than static_cast. + // I use it instead of static_cast<> to emphasize that I'm not doing + // anything nasty. + // Usage is identical to static_cast<> + template + inline OutputClass implicit_cast(InputClass input){ + return input; + } + + + struct MemFuncInfo + { + bool isVirtual; // Is the function virtual? + int thisptroffs; // The this pointer the function expects to be called with + // If -1, you need to call the GetFuncInfo_GetThisPtr function + int vtblindex; // The function's index in the vtable (0-based, 1=second entry, 2=third entry, ...) + int vtbloffs; // The vtable pointer + }; + + // Ideas by Don Clugston. + // Check out his excellent paper: http://www.codeproject.com/cpp/FastDelegate.asp + + template struct MFI_Impl + { + template static inline void GetFuncInfo(MFP *mfp, MemFuncInfo &out) + { + static char weird_memfunc_pointer_exclamation_mark_arrow_error[N-1000]; + } + }; + +# if SH_COMP == SH_COMP_GCC + + template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16 + { + struct GCC_MemFunPtr + { + union + { + void *funcadr; // always even + intptr_t vtable_index_plus1; // = vindex+1, always odd + }; + intptr_t delta; + }; + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + GCC_MemFunPtr *mfp_detail = (GCC_MemFunPtr*)&mfp; + out.thisptroffs = mfp_detail->delta; + if (mfp_detail->vtable_index_plus1 & 1) + { + out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE; + out.vtbloffs = 0; + out.isVirtual = true; + } + else + out.isVirtual = false; + } + }; + +# elif SH_COMP == SH_COMP_MSVC + + namespace + { + int MFI_GetVtblOffset(void *mfp) + { + unsigned char *addr = (unsigned char*)mfp; + if (*addr == 0xE9) // Jmp + { + // May or may not be! + // Check where it'd jump + addr += 5 /*size of the instruction*/ + *(unsigned long*)(addr + 1); + } + + // Check whether it's a virtual function call + // They look like this: + // 004125A0 8B 01 mov eax,dword ptr [ecx] + // 004125A2 FF 60 04 jmp dword ptr [eax+4] + // ==OR== + // 00411B80 8B 01 mov eax,dword ptr [ecx] + // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] + + // However, for vararg functions, they look like this: + // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] + // 0048F0B4 8B 00 mov eax,dword ptr [eax] + // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] + // ==OR== + // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] + // 0048F0B4 8B 00 mov eax,dword ptr [eax] + // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] + + // With varargs, the this pointer is passed as if it was the first argument + + bool ok = false; + if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && + addr[4] == 0x8B && addr[5] == 0x00) + { + addr += 6; + ok = true; + } + else if (addr[0] == 0x8B && addr[1] == 0x01) + { + addr += 2; + ok = true; + } + if (!ok) + return -1; + + if (*addr++ == 0xFF) + { + if (*addr == 0x60) + { + return *++addr / 4; + } + else if (*addr == 0xA0) + { + return *((unsigned int*)++addr) / 4; + } + else if (*addr == 0x20) + return 0; + else + return -1; + } + return -1; + } + } + + template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones + { + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + out.thisptroffs = 0; + out.vtbloffs = 0; + } + }; + + template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones! + { + struct MSVC_MemFunPtr2 + { + void *funcadr; + int delta; + }; + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + out.thisptroffs = reinterpret_cast(&mfp)->delta; + out.vtbloffs = 0; + } + }; + + // By Don Clugston, adapted + template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG + { + class __single_inheritance GenericClass; + class GenericClass {}; + + struct MicrosoftVirtualMFP { + void (GenericClass::*codeptr)(); // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtable_index; // or 0 if no virtual inheritance + }; + + struct GenericVirtualClass : virtual public GenericClass + { + typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); + GenericVirtualClass * GetThis() { return this; } + }; + + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + // This pointer + /* + union { + MFP func; + GenericClass* (T::*ProbeFunc)(); + MicrosoftVirtualMFP s; + } u; + u.func = mfp; + union { + GenericVirtualClass::ProbePtrType virtfunc; + MicrosoftVirtualMFP s; + } u2; + + // Check that the horrible_cast<>s will work + typedef int ERROR_CantUsehorrible_cast[sizeof(mfp)==sizeof(u.s) + && sizeof(mfp)==sizeof(u.ProbeFunc) + && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; + // Unfortunately, taking the address of a MF prevents it from being inlined, so + // this next line can't be completely optimised away by the compiler. + u2.virtfunc = &GenericVirtualClass::GetThis; + u.s.codeptr = u2.s.codeptr; + out.thisptroffs = (reinterpret_cast(NULL)->*u.ProbeFunc)(); + */ + out.thisptroffs = -1; + out.vtbloffs = 0; + } + }; + + // Don: Nasty hack for Microsoft and Intel (IA32 and Itanium) + // unknown_inheritance classes go here + // This is probably the ugliest bit of code I've ever written. Look at the casts! + // There is a compiler bug in MSVC6 which prevents it from using this code. + template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN + { + template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) + { + out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); + out.isVirtual = out.vtblindex >= 0 ? true : false; + + // The member function pointer is 16 bytes long. We can't use a normal cast, but + // we can use a union to do the conversion. + union { + MFP func; + // In VC++ and ICL, an unknown_inheritance member pointer + // is internally defined as: + struct { + void *m_funcaddress; // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtordisp; // #bytes to add to 'this' to find the vtable + int vtable_index; // or 0 if no virtual inheritance + } s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(u.func)==sizeof(u.s)? 1 : -1]; + u.func = mfp; + int virtual_delta = 0; + if (u.s.vtable_index) { // Virtual inheritance is used + /* + // First, get to the vtable. + // It is 'vtordisp' bytes from the start of the class. + int * vtable = *reinterpret_cast( + reinterpret_cast(thisptr) + u.s.vtordisp ); + + // 'vtable_index' tells us where in the table we should be looking. + virtual_delta = u.s.vtordisp + *reinterpret_cast( + reinterpret_cast(vtable) + u.s.vtable_index); + // The int at 'virtual_delta' gives us the amount to add to 'this'. + // Finally we can add the three components together. Phew! + out.thisptr = reinterpret_cast( + reinterpret_cast(thisptr) + u.s.delta + virtual_delta); + */ + out.vtbloffs = u.s.vtordisp; + out.thisptroffs = -1; + } + else + { + out.vtbloffs = out.vtblindex < 0 ? 0 : u.s.delta; + out.thisptroffs = u.s.delta; + } + }; + }; +# else +# error Unsupported compiler +# endif + + // This version does not take a this pointer + // Useful for hookdecls, as they ensure that mfp is correct through a static_cast + template inline void GetFuncInfo(X mfp, MemFuncInfo &out) + { + MFI_Impl::GetFuncInfo(mfp, out); + } + + // Versions which do take a this + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(), MemFuncInfo &out) + { + RetType(Y::*mfp2)() = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)() const, MemFuncInfo &out) + { + RetType(Y::*mfp2)() const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + // GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it +#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + template + inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const, MemFuncInfo &out) + { + RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const = mfp; + MFI_Impl::GetFuncInfo(mfp2, out); + } + + + +#endif + +} + +#endif diff --git a/sourcehook/sh_memory.h b/sourcehook/sh_memory.h new file mode 100644 index 0000000..d626bb9 --- /dev/null +++ b/sourcehook/sh_memory.h @@ -0,0 +1,186 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko, Scott "Damaged Soul" Ehlert +* Contributors: lancevorgin, XAD, theqizmo +* ============================ +*/ + +#ifndef __SHINT_MEMORY_H__ +#define __SHINT_MEMORY_H__ + +// Feb 17 / 2005: +// Unprotect now sets to readwrite +// The vtable doesn't need to be executable anyway + +# if /********/ defined _WIN32 +# include +# define SH_MEM_READ 1 +# define SH_MEM_WRITE 2 +# define SH_MEM_EXEC 4 +# elif /******/ defined __linux__ +# include +# include +# include +# include +// http://www.die.net/doc/linux/man/man2/mprotect.2.html +# include +# ifndef PAGESIZE +# define PAGESIZE 4096 +# endif +# define SH_MEM_READ PROT_READ +# define SH_MEM_WRITE PROT_WRITE +# define SH_MEM_EXEC PROT_EXEC + +// We need to align addr down to pagesize on linux +// We assume PAGESIZE is a power of two +# define SH_LALIGN(x) (void*)((intptr_t)(x) & ~(PAGESIZE-1)) +# define SH_LALDIF(x) ((intptr_t)(x) & (PAGESIZE-1)) +# else +# error Unsupported OS/Compiler +# endif + + +namespace SourceHook +{ + inline bool SetMemAccess(void *addr, size_t len, int access) + { +# ifdef __linux__ + return mprotect(SH_LALIGN(addr), len + SH_LALDIF(addr), access)==0 ? true : false; +# else + DWORD tmp; + DWORD prot; + switch (access) + { + case SH_MEM_READ: + prot = PAGE_READONLY; break; + case SH_MEM_READ | SH_MEM_WRITE: + prot = PAGE_READWRITE; break; + case SH_MEM_READ | SH_MEM_EXEC: + prot = PAGE_EXECUTE_READ; break; + default: + case SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC: + prot = PAGE_EXECUTE_READWRITE; break; + } + return VirtualProtect(addr, len, prot, &tmp) ? true : false; +# endif + } + +#ifdef __linux__ + namespace + { + bool g_BadReadCalled; + jmp_buf g_BadReadJmpBuf; + + static void BadReadHandler(int sig) + { + if (g_BadReadCalled) + longjmp(g_BadReadJmpBuf, 1); + } + } +#endif + + /** + * @brief Checks whether the specified memory region is (still) accessible + * + * @param addr The lower boundary + * @param len Length of the region to be checked + */ + namespace + { + bool ModuleInMemory(char *addr, size_t len) + { +#ifdef __linux__ + // On linux, first check /proc/self/maps + long lower = reinterpret_cast(addr); + long upper = lower + len; + + FILE *pF = fopen("/proc/self/maps", "r"); + if (pF) + { + // Linux /proc/self/maps -> parse + // Format: + // lower upper prot stuff path + // 08048000-0804c000 r-xp 00000000 03:03 1010107 /bin/cat + long rlower, rupper; + while (fscanf(pF, "%lx-%lx", &rlower, &rupper) != EOF) + { + // Check whether we're IN THERE! + if (lower >= rlower && upper <= rupper) + { + fclose(pF); + return true; + } + // Read to end of line + int c; + while ((c = fgetc(pF)) != '\n') + { + if (c == EOF) + break; + } + if (c == EOF) + break; + } + fclose(pF); + return false; + } + pF = fopen("/proc/curproc/map", "r"); + if (pF) + { + // FreeBSD /proc/curproc/map -> parse + // 0x804800 0x805500 13 15 0xc6e18960 r-x 21 0x0 COW NC vnode + long rlower, rupper; + while (fscanf(pF, "0x%lx 0x%lx", &rlower, &rupper) != EOF) + { + // Check whether we're IN THERE! + if (lower >= rlower && upper <= rupper) + { + fclose(pF); + return true; + } + // Read to end of line + int c; + while ((c = fgetc(pF)) != '\n') + { + if (c == EOF) + break; + } + if (c == EOF) + break; + } + fclose(pF); + return false; + } + + // Both of the above failed, try to actually read and trap sigsegv (implemented by Damaged Soul) + void(*prevHandler)(int sig); + g_BadReadCalled = true; + + if (setjmp(g_BadReadJmpBuf)) + return true; + + prevHandler = signal(SIGSEGV, BadReadHandler); + + volatile const char *p = reinterpret_cast(addr); + char dummy; + + for (size_t i = 0; i < len; i++) + dummy = p[i]; + + g_BadReadCalled = false; + + signal(SIGSEGV, prevHandler); + + return false; +#else + // On Win32, simply use IsBadReadPtr + return !IsBadReadPtr(addr, len); +#endif + } + } +} + +#endif diff --git a/sourcehook/sh_stack.h b/sourcehook/sh_stack.h new file mode 100644 index 0000000..ffbeecf --- /dev/null +++ b/sourcehook/sh_stack.h @@ -0,0 +1,237 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +#ifndef __SH_STACK_H__ +#define __SH_STACK_H__ + +#include + +#define SH_STACK_DEFAULT_SIZE 4 + +namespace SourceHook +{ + // Vector + template class CStack + { + T *m_Elements; + size_t m_AllocatedSize; + size_t m_UsedSize; + public: + friend class iterator; + class iterator + { + CStack *m_pParent; + size_t m_Index; + public: + iterator(CStack *pParent, size_t id) : m_pParent(pParent), m_Index(id) + { + } + + iterator(CStack *pParent) : m_pParent(pParent), m_Index(0) + { + } + + iterator() : m_pParent(NULL), m_Index(0) + { + } + + T &operator *() + { + return m_pParent->m_Elements[m_Index]; + } + const T &operator *() const + { + return m_pParent->m_Elements[m_Index]; + } + + T * operator->() + { + return m_pParent->m_Elements + m_Index; + } + + const T * operator->() const + { + return m_pParent->m_Elements + m_Index; + } + + iterator & operator++() // preincrement + { + ++m_Index; + return (*this); + } + + iterator operator++(int) // postincrement + { + iterator tmp = *this; + ++m_Index; + return tmp; + } + + iterator & operator--() // predecrement + { + --m_Index; + return (*this); + } + + iterator operator--(int) // postdecrememnt + { + iterator tmp = *this; + --m_Index; + return tmp; + } + + bool operator==(const iterator & right) const + { + return (m_pParent == right.m_pParent && m_Index == right.m_Index); + } + + bool operator!=(const iterator & right) const + { + return !(*this == right); + } + }; + CStack() : m_Elements(new T[SH_STACK_DEFAULT_SIZE]), + m_AllocatedSize(SH_STACK_DEFAULT_SIZE), + m_UsedSize(0) + { + } + CStack(size_t size) : m_Elements(new T[size]), + m_AllocatedSize(size), + m_UsedSize(0) + { + } + + CStack(const CStack &other) : m_Elements(NULL), + m_AllocatedSize(0), + m_UsedSize(0) + { + reserve(other.m_AllocatedSize); + m_UsedSize = other.m_UsedSize; + for (size_t i = 0; i < m_UsedSize; ++i) + m_Elements[i] = other.m_Elements[i]; + } + + ~CStack() + { + if (m_Elements) + delete [] m_Elements; + } + + void operator=(const CStack &other) + { + if (m_AllocatedSize < other.m_AllocatedSize) + { + if (m_Elements) + delete [] m_Elements; + m_Elements = new T[other.m_AllocatedSize]; + m_AllocatedSize = other.m_AllocatedSize; + } + m_UsedSize = other.m_UsedSize; + for (size_t i = 0; i < m_UsedSize; ++i) + m_Elements[i] = other.m_Elements[i]; + } + + bool push(const T &val) + { + if (m_UsedSize + 1 == m_AllocatedSize) + { + // zOHNOES! REALLOCATE! + m_AllocatedSize *= 2; + T *newElements = new T[m_AllocatedSize]; + if (!newElements) + { + m_AllocatedSize /= 2; + return false; + } + if (m_Elements) + { + for (size_t i = 0; i < m_UsedSize; ++i) + newElements[i] = m_Elements[i]; + delete [] m_Elements; + } + m_Elements = newElements; + } + m_Elements[m_UsedSize++] = val; + return true; + } + + void pop() + { + --m_UsedSize; + } + + void popall() + { + m_UsedSize = 0; + } + + T &front() + { + return m_Elements[m_UsedSize - 1]; + } + + const T &front() const + { + return m_Elements[m_UsedSize - 1]; + } + + T &second() + { + return m_Elements[m_UsedSize - 2]; + } + + const T &second() const + { + return m_Elements[m_UsedSize - 2]; + } + + iterator begin() + { + return iterator(this, 0); + } + iterator end() + { + return iterator(this, m_UsedSize); + } + + size_t size() + { + return m_UsedSize; + } + size_t capacity() + { + return m_AllocatedSize; + } + bool empty() + { + return m_UsedSize == 0 ? true : false; + } + bool reserve(size_t size) + { + if (size > m_AllocatedSize) + { + T *newElements = new T[size]; + if (!newElements) + return false; + if (m_Elements) + { + for (size_t i = 0; i < m_UsedSize; ++i) + newElements[i] = m_Elements[i]; + delete [] m_Elements; + } + m_Elements = newElements; + m_AllocatedSize = size; + } + return true; + } + }; +}; //namespace SourceHook + +#endif diff --git a/sourcehook/sh_string.h b/sourcehook/sh_string.h new file mode 100755 index 0000000..220b4ee --- /dev/null +++ b/sourcehook/sh_string.h @@ -0,0 +1,401 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): David "BAILOPAN" Anderson +* ============================ +*/ + +/* AMX Mod X + * + * by the AMX Mod X Development Team + */ + +#ifndef _INCLUDE_CSTRING_H +#define _INCLUDE_CSTRING_H + +#include +#include + +namespace SourceHook +{ +class String +{ +public: + String() + { + v = NULL; + a_size = 0; + //assign(""); + } + + ~String() + { + if (v) + delete [] v; + } + + String(const char *src) + { + v = NULL; + a_size = 0; + assign(src); + } + + String(const String &src) + { + v = NULL; + a_size = 0; + assign(src.c_str()); + } + + bool operator ==(const String &other) + { + return (compare(other.c_str()) == 0); + } + + bool operator ==(const char *other) + { + return (compare(other) == 0); + } + + const char *c_str() { return v?v:""; } + + const char *c_str() const { return v?v:""; } + + void append(const char *t) + { + Grow(size() + strlen(t) + 1); + strcat(v, t); + } + + void append(const char c) + { + size_t len = size(); + Grow(len + 2); + v[len] = c; + v[len + 1] = '\0'; + } + + void append(String &d) + { + append(d.c_str()); + } + + void assign(const String &src) + { + assign(src.c_str()); + } + + void assign(const char *d) + { + if (!d) + { + clear(); + } else { + Grow(strlen(d) + 1, false); + strcpy(v, d); + } + } + + void clear() + { + if (v) + v[0] = '\0'; + } + + int compare (const char *d) const + { + if (!v) + return strcmp("", d); + else + return strcmp(v, d); + } + + //Added this for amxx inclusion + bool empty() const + { + if (!v) + return true; + + if (v[0] == '\0') + return true; + + return false; + } + + size_t size() const + { + if (v) + return strlen(v); + else + return 0; + } + + int find(const char c, int index = 0) const + { + int len = static_cast(size()); + if (len < 1) + return npos; + if (index >= len || index < 0) + return npos; + int i = 0; + for (i=index; i(size()); + if (len < 1) + return npos; + if (index >= len || index < npos) + return npos; + int i; + if (index == npos) + i = len - 1; + else + i = index; + + for (; i>=0; i--) + { + if (v[i] == c) + { + return i; + } + } + + return npos; + } + + bool is_space(int c) const + { + if (c == '\f' || c == '\n' || + c == '\t' || c == '\r' || + c == '\v' || c == ' ') + { + return true; + } + + return false; + } + + void trim() + { + if (!v) + return; + + unsigned int i = 0; + unsigned int j = 0; + size_t len = strlen(v); + + if (len == 1) + { + if (is_space(v[i])) + { + clear(); + return; + } + } + + unsigned char c0 = v[0]; + + if (is_space(c0)) + { + for (i=0; i=0; i--) + { + if (!is_space(v[i]) + || (is_space(v[i]) && i==0)) + { + erase(i+1, j); + break; + } + j++; + } + } + + if (len == 1) + { + if (is_space(v[0])) + { + clear(); + return; + } + } + } + + void erase(unsigned int start, int num = npos) + { + if (!v) + return; + unsigned int i = 0; + size_t len = size(); + //check for bounds + if (num == npos || start+num > len-start) + num = len - start; + //do the erasing + bool copyflag = false; + for (i=0; i=start && i= len || !v) + return ns; + + if (num == npos) + { + num = len - index; + } else if (index+num >= len) { + num = len - index; + } + + unsigned int i = 0; + unsigned int nslen = num + 2; + + ns.Grow(nslen); + + for (i=index; i= 65 && v[i] <= 90) + v[i] &= ~(1<<5); + } + } + + String & operator = (const String &src) + { + assign(src); + return *this; + } + + String & operator = (const char *src) + { + assign(src); + return *this; + + } + + char operator [] (unsigned int index) const + { + if (index > size() || !v) + { + return -1; + } else { + return v[index]; + } + } + + int at(int a) const + { + if (a < 0 || a >= (int)size() || !v) + return -1; + + return v[a]; + } + + bool at(int at, char c) + { + if (at < 0 || at >= (int)size() || !v) + return false; + + v[at] = c; + + return true; + } + +private: + void Grow(unsigned int d, bool copy=true) + { + if (d <= a_size) + return; + char *n = new char[d + 1]; + if (copy && v) + strcpy(n, v); + if (v) + delete [] v; + else + strcpy(n, ""); + v = n; + a_size = d + 1; + } + + char *v; + unsigned int a_size; +public: + static const int npos = -1; +}; + +}; //NAMESPACE + +#endif //_INCLUDE_CSTRING_H diff --git a/sourcehook/sh_tinyhash.h b/sourcehook/sh_tinyhash.h new file mode 100644 index 0000000..634b253 --- /dev/null +++ b/sourcehook/sh_tinyhash.h @@ -0,0 +1,534 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): David "BAILOPAN" Anderson +* ============================ +*/ + +#ifndef _INCLUDE_SH_TINYHASH_H_ +#define _INCLUDE_SH_TINYHASH_H_ + +#include "sh_list.h" + +#define _T_INIT_HASH_SIZE 32 + +namespace SourceHook +{ + template + int HashFunction(const K & k); + + template + int HashAlt(const U &u); + + template + int CompareAlt(const U &k1, const K &k2); + + template + int Compare(const K & k1, const K & k2); + + /** + * This is a tiny, growable hash class. + * Meant for quick and dirty dictionaries only! + */ + template + class THash + { + public: + struct THashNode + { + THashNode(const K & k, const V & v) : + key(k), val(v) + { + }; + THashNode & operator =(const THashNode &other) + { + key = other.key; + val = other.val; + } + K key; + V val; + }; + typedef List * NodePtr; + public: + class const_iterator; + THash() : m_Buckets(NULL), m_numBuckets(0), m_percentUsed(0.0f) + { + _Refactor(); + } + THash(const THash &other) : m_Buckets(new NodePtr[other.m_numBuckets]), + m_numBuckets(other.m_numBuckets), m_percentUsed(other.m_percentUsed) + { + for (size_t i=0; ikey)->val = iter->val; + } + void operator=(const THash &other) + { + clear(); + for (const_iterator iter = other.begin(); iter != other.end(); ++iter) + _FindOrInsert(iter->key)->val = iter->val; + } + + ~THash() + { + _Clear(); + } + void clear() + { + _Clear(); + _Refactor(); + } + size_t GetBuckets() + { + return m_numBuckets; + } + float PercentUsed() + { + return m_percentUsed; + } + V & operator [](const K & key) + { + THashNode *pNode = _FindOrInsert(key); + return pNode->val; + } + private: + void _Clear() + { + typename List::iterator iter, end; + for (size_t i=0; iend(); + iter = m_Buckets[i]->begin(); + while (iter != end) + { + delete (*iter); + iter++; + } + delete m_Buckets[i]; + m_Buckets[i] = NULL; + } + } + if (m_Buckets) + delete [] m_Buckets; + m_Buckets = NULL; + m_numBuckets = 0; + } + public: + template + V & AltFindOrInsert(const U & ukey) + { + size_t place = HashAlt(ukey) % m_numBuckets; + THashNode *pNode = NULL; + if (!m_Buckets[place]) + { + m_Buckets[place] = new List; + pNode = new THashNode(ukey, V()); + m_Buckets[place]->push_back(pNode); + m_percentUsed += (1.0f / (float)m_numBuckets); + } else { + typename List::iterator iter; + for (iter=m_Buckets[place]->begin(); iter!=m_Buckets[place]->end(); iter++) + { + if (CompareAlt(ukey, (*iter)->key) == 0) + { + return (*iter)->val; + } + } + //node does not exist + pNode = new THashNode(ukey, V()); + m_Buckets[place]->push_back(pNode); + } + if (PercentUsed() > 0.75f) + { + _Refactor(); + } + return pNode->val; + } + private: + THashNode *_FindOrInsert(const K & key) + { + size_t place = HashFunction(key) % m_numBuckets; + THashNode *pNode = NULL; + if (!m_Buckets[place]) + { + m_Buckets[place] = new List; + pNode = new THashNode(key, V()); + m_Buckets[place]->push_back(pNode); + m_percentUsed += (1.0f / (float)m_numBuckets); + } else { + typename List::iterator iter; + for (iter=m_Buckets[place]->begin(); iter!=m_Buckets[place]->end(); iter++) + { + if (Compare((*iter)->key, key) == 0) + return (*iter); + } + //node does not exist + pNode = new THashNode(key, V()); + m_Buckets[place]->push_back(pNode); + } + if (PercentUsed() > 0.75f) + { + _Refactor(); + } + return pNode; + } + void _Refactor() + { + m_percentUsed = 0.0f; + if (!m_numBuckets) + { + m_numBuckets = _T_INIT_HASH_SIZE; + m_Buckets = new NodePtr[m_numBuckets]; + for (size_t i=0; i::iterator iter; + size_t place; + THashNode *pHashNode; + NodePtr *temp = new NodePtr[m_numBuckets]; + for (size_t i=0; ibegin(); iter != m_Buckets[i]->end(); iter++) + { + pHashNode = (*iter); + //rehash it with the new bucket filter + place = HashFunction(pHashNode->key) % m_numBuckets; + //add it to the new hash table + if (!temp[place]) + { + temp[place] = new List; + m_percentUsed += (1.0f / (float)m_numBuckets); + } + temp[place]->push_back(pHashNode); + } + //delete that bucket! + delete m_Buckets[i]; + m_Buckets[i] = NULL; + } + } + //reassign bucket table + delete [] m_Buckets; + m_Buckets = temp; + } + } + public: + friend class iterator; + friend class const_iterator; + class iterator + { + friend class THash; + public: + iterator() : curbucket(-1), hash(NULL), end(true) + { + }; + iterator(THash *h) : curbucket(-1), hash(h), end(false) + { + if (!h->m_Buckets) + end = true; + else + _Inc(); + }; + //pre increment + iterator & operator++() + { + _Inc(); + return *this; + } + //post increment + iterator operator++(int) + { + iterator old(*this); + _Inc(); + return old; + } + const THashNode & operator * () const + { + return *(*iter); + } + THashNode & operator * () + { + return *(*iter); + } + const THashNode * operator ->() const + { + return (*iter); + } + THashNode * operator ->() + { + return (*iter); + } + bool operator ==(const iterator &where) const + { + if (where.hash == this->hash + && where.end == this->end + && + (this->end || + ((where.curbucket == this->curbucket) + && (where.iter == iter)) + )) + return true; + return false; + } + bool operator !=(const iterator &where) const + { + return !( (*this) == where ); + } + + void erase() + { + if (end || !hash || curbucket < 0 || curbucket >= static_cast(hash->m_numBuckets)) + return; + + // Remove this element and move to the next one + iterator tmp = *this; + ++tmp; + delete (*iter); + hash->m_Buckets[curbucket]->erase(iter); + *this = tmp; + + // :TODO: Maybe refactor to a lower size if required + } + private: + void _Inc() + { + if (end || !hash || curbucket >= static_cast(hash->m_numBuckets)) + return; + if (curbucket < 0) + { + for (int i=0; i<(int)hash->m_numBuckets; i++) + { + if (hash->m_Buckets[i]) + { + iter = hash->m_Buckets[i]->begin(); + if (iter == hash->m_Buckets[i]->end()) + continue; + curbucket = i; + break; + } + } + if (curbucket < 0) + end = true; + } else { + if (iter != hash->m_Buckets[curbucket]->end()) + iter++; + if (iter == hash->m_Buckets[curbucket]->end()) + { + int oldbucket = curbucket; + for (int i=curbucket+1; i<(int)hash->m_numBuckets; i++) + { + if (hash->m_Buckets[i]) + { + iter = hash->m_Buckets[i]->begin(); + if (iter == hash->m_Buckets[i]->end()) + continue; + curbucket = i; + break; + } + } + if (curbucket == oldbucket) + end = true; + } + } + } + private: + int curbucket; + typename SourceHook::List::iterator iter; + THash *hash; + bool end; + }; + class const_iterator + { + friend class THash; + public: + const_iterator() : curbucket(-1), hash(NULL), end(true) + { + }; + const_iterator(const THash *h) : curbucket(-1), hash(h), end(false) + { + if (!h->m_Buckets) + end = true; + else + _Inc(); + }; + //pre increment + const_iterator & operator++() + { + _Inc(); + return *this; + } + //post increment + const_iterator operator++(int) + { + iterator old(*this); + _Inc(); + return old; + } + const THashNode & operator * () const + { + return *(*iter); + } + const THashNode * operator ->() const + { + return (*iter); + } + bool operator ==(const const_iterator &where) const + { + if (where.hash == this->hash + && where.end == this->end + && + (this->end || + ((where.curbucket == this->curbucket) + && (where.iter == iter)) + )) + return true; + return false; + } + bool operator !=(const const_iterator &where) const + { + return !( (*this) == where ); + } + private: + void _Inc() + { + if (end || !hash || curbucket >= static_cast(hash->m_numBuckets)) + return; + if (curbucket < 0) + { + for (int i=0; i<(int)hash->m_numBuckets; i++) + { + if (hash->m_Buckets[i]) + { + iter = hash->m_Buckets[i]->begin(); + if (iter == hash->m_Buckets[i]->end()) + continue; + curbucket = i; + break; + } + } + if (curbucket < 0) + end = true; + } else { + if (iter != hash->m_Buckets[curbucket]->end()) + iter++; + if (iter == hash->m_Buckets[curbucket]->end()) + { + int oldbucket = curbucket; + for (int i=curbucket+1; i<(int)hash->m_numBuckets; i++) + { + if (hash->m_Buckets[i]) + { + iter = hash->m_Buckets[i]->begin(); + if (iter == hash->m_Buckets[i]->end()) + continue; + curbucket = i; + break; + } + } + if (curbucket == oldbucket) + end = true; + } + } + } + private: + int curbucket; + typename SourceHook::List::iterator iter; + const THash *hash; + bool end; + }; + public: + iterator begin() + { + return iterator(this); + } + iterator end() + { + iterator iter; + iter.hash = this; + return iter; + } + + const_iterator begin() const + { + return const_iterator(this); + } + const_iterator end() const + { + const_iterator iter; + iter.hash = this; + return iter; + } + + template + iterator find(const U & u) const + { + iterator b = begin(); + iterator e = end(); + for (iterator iter = b; iter != e; iter++) + { + if ( (*iter).key == u ) + return iter; + } + return end(); + } + template + iterator find(const U & u) + { + iterator b = begin(); + iterator e = end(); + for (iterator iter = b; iter != e; iter++) + { + if ( (*iter).key == u ) + return iter; + } + return end(); + } + template + iterator FindAlt(const U & u) + { + iterator b = begin(); + iterator e = end(); + for (iterator iter = b; iter != e; iter++) + { + if (CompareAlt(u, (*iter).key) == 0) + { + return iter; + } + } + return e; + } + iterator erase(iterator where) + { + where.erase(); + return where; + } + template + void erase(const U & u) + { + iterator iter = find(u); + if (iter == end()) + return; + iter.erase(); + } + private: + NodePtr *m_Buckets; + size_t m_numBuckets; + float m_percentUsed; + }; +}; + +#endif //_INCLUDE_SH_TINYHASH_H_ diff --git a/sourcehook/sh_vector.h b/sourcehook/sh_vector.h new file mode 100755 index 0000000..45f4ed6 --- /dev/null +++ b/sourcehook/sh_vector.h @@ -0,0 +1,490 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +#ifndef __CVECTOR_H__ +#define __CVECTOR_H__ + +#include + +//This file originally from AMX Mod X +namespace SourceHook +{ +// Vector +template class CVector +{ + bool Grow() + { + // automatic grow + size_t newSize = m_Size * 2; + if (newSize == 0) + newSize = 8; // a good init value + T *newData = new T[newSize]; + if (!newData) + return false; + if (m_Data) + { + for (size_t i=0; i= m_Size) + return Grow(); + else + return true; + } + + bool ChangeSize(size_t size) + { + // change size + if (size == m_Size) + return true; + + if (!size) + { + if (m_Data) + { + delete [] m_Data; + m_Data = NULL; + m_Size = 0; + } + return true; + } + + T *newData = new T[size]; + if (!newData) + return false; + if (m_Data) + { + size_t end = (m_CurrentUsedSize < size) ? (m_CurrentUsedSize) : size; + for (size_t i=0; i m_Size) + m_CurrentUsedSize = m_Size; + + return true; + } + + void FreeMemIfPossible() + { + if (!m_Data) + return; + + if (!m_CurrentUsedSize) + { + ChangeSize(0); + return; + } + + size_t newSize = m_Size; + while (m_CurrentUsedSize <= newSize / 2) + newSize /= 2; + + if (newSize != m_Size) + ChangeSize(newSize); + } +protected: + T *m_Data; + size_t m_Size; + size_t m_CurrentUsedSize; +public: + class iterator + { + protected: + T *m_Ptr; + public: + // constructors / destructors + iterator() + { + m_Ptr = NULL; + } + + iterator(T * ptr) + { + m_Ptr = ptr; + } + + // member functions + T * base() + { + return m_Ptr; + } + + const T * base() const + { + return m_Ptr; + } + + // operators + T & operator*() + { + return *m_Ptr; + } + + T * operator->() + { + return m_Ptr; + } + + iterator & operator++() // preincrement + { + ++m_Ptr; + return (*this); + } + + iterator operator++(int) // postincrement + { + iterator tmp = *this; + ++m_Ptr; + return tmp; + } + + iterator & operator--() // predecrement + { + --m_Ptr; + return (*this); + } + + iterator operator--(int) // postdecrememnt + { + iterator tmp = *this; + --m_Ptr; + return tmp; + } + + bool operator==(T * right) const + { + return (m_Ptr == right); + } + + bool operator==(const iterator & right) const + { + return (m_Ptr == right.m_Ptr); + } + + bool operator!=(T * right) const + { + return (m_Ptr != right); + } + + bool operator!=(const iterator & right) const + { + return (m_Ptr != right.m_Ptr); + } + + iterator & operator+=(size_t offset) + { + m_Ptr += offset; + return (*this); + } + + iterator & operator-=(size_t offset) + { + m_Ptr -= offset; + return (*this); + } + + iterator operator+(size_t offset) const + { + iterator tmp(*this); + tmp.m_Ptr += offset; + return tmp; + } + + iterator operator-(size_t offset) const + { + iterator tmp(*this); + tmp.m_Ptr -= offset; + return tmp; + } + + T & operator[](size_t offset) + { + return (*(*this + offset)); + } + + const T & operator[](size_t offset) const + { + return (*(*this + offset)); + } + + bool operator<(const iterator & right) const + { + return m_Ptr < right.m_Ptr; + } + + bool operator>(const iterator & right) const + { + return m_Ptr > right.m_Ptr; + } + + bool operator<=(const iterator & right) const + { + return m_Ptr <= right.m_Ptr; + } + + bool operator>=(const iterator & right) const + { + return m_Ptr >= right.m_Ptr; + } + + size_t operator-(const iterator & right) const + { + return m_Ptr - right.m_Ptr; + } + }; + + // constructors / destructors + CVector() + { + m_Size = 0; + m_CurrentUsedSize = 0; + m_Data = NULL; + } + + CVector(const CVector & other) + { + // copy data + m_Data = new T [other.m_CurrentUsedSize]; + m_Size = other.m_CurrentUsedSize; + m_CurrentUsedSize = other.m_CurrentUsedSize; + for (size_t i=0; i() + { + clear(); + } + + CVector & operator =(const CVector & other) + { + clear(); + ChangeSize(other.size()); + m_CurrentUsedSize = other.size(); + for (size_t i=0; i m_CurrentUsedSize) + assert(0); + return iterator(m_Data + pos); + } + + bool reserve(size_t newSize) + { + if (newSize > m_Size) + return ChangeSize(newSize); + return true; + } + + bool push_back(const T & elem) + { + ++m_CurrentUsedSize; + if (!GrowIfNeeded()) + { + --m_CurrentUsedSize; + return false; + } + + m_Data[m_CurrentUsedSize - 1] = elem; + return true; + } + + void pop_back() + { + --m_CurrentUsedSize; + if (m_CurrentUsedSize < 0) + m_CurrentUsedSize = 0; + + FreeMemIfPossible(); + } + + bool resize(size_t newSize) + { + return resize(newSize, T()); + } + + bool resize(size_t newSize, T defval) + { + if (!ChangeSize(newSize)) + return false; + for (size_t i = m_CurrentUsedSize; i < newSize; ++i) + m_Data[i] = defval; + m_CurrentUsedSize = newSize; + return true; + } + + bool empty() const + { + return (m_CurrentUsedSize == 0); + } + + T & at(size_t pos) + { + if (pos > m_CurrentUsedSize) + { + assert(0); + } + return m_Data[pos]; + } + + const T & at(size_t pos) const + { + if (pos > m_CurrentUsedSize) + { + assert(0); + } + return m_Data[pos]; + } + + T & operator[](size_t pos) + { + return at(pos); + } + + const T & operator[](size_t pos) const + { + return at(pos); + } + + T & front() + { + if (m_CurrentUsedSize < 1) + { + assert(0); + } + return m_Data[0]; + } + + const T & front() const + { + if (m_CurrentUsedSize < 1) + { + assert(0); + } + return m_Data[0]; + } + + T & back() + { + if (m_CurrentUsedSize < 1) + { + assert(0); + } + return m_Data[m_CurrentUsedSize - 1]; + } + + const T & back() const + { + if (m_CurrentUsedSize < 1) + { + assert(0); + } + return m_Data[m_CurrentUsedSize - 1]; + } + + iterator insert(iterator where, const T & value) + { + // validate iter + if (where < m_Data || where > (m_Data + m_CurrentUsedSize)) + return iterator(0); + + size_t ofs = where - begin(); + + ++m_CurrentUsedSize; + if (!GrowIfNeeded()) + { + --m_CurrentUsedSize; + return false; + } + + where = begin() + ofs; + + // Move subsequent entries + for (T *ptr = m_Data + m_CurrentUsedSize - 2; ptr >= where.base(); --ptr) + *(ptr + 1) = *ptr; + + *where.base() = value; + + return where; + } + + iterator erase(iterator where) + { + // validate iter + if (where < m_Data || where >= (m_Data + m_CurrentUsedSize)) + return iterator(0); + + size_t ofs = where - begin(); + + if (m_CurrentUsedSize > 1) + { + // move + T *theend = m_Data + m_CurrentUsedSize; + for (T *ptr = where.base() + 1; ptr < theend; ++ptr) + *(ptr - 1) = *ptr; + } + + --m_CurrentUsedSize; + + FreeMemIfPossible(); + + return begin() + ofs; + } + + void clear() + { + m_Size = 0; + m_CurrentUsedSize = 0; + if (m_Data) + { + delete [] m_Data; + m_Data = NULL; + } + } +}; +}; //namespace SourceHook + +#endif // __CVECTOR_H__ diff --git a/sourcehook/sourcehook.cpp b/sourcehook/sourcehook.cpp new file mode 100644 index 0000000..9f34447 --- /dev/null +++ b/sourcehook/sourcehook.cpp @@ -0,0 +1,1212 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* Contributors: Scott "Damaged Soul" Ehlert +* ============================ +*/ + +/** + * @file sourcehook.cpp + * @brief Contains the implementation of the SourceHook API +*/ + +#if defined __GNUC__ +#include +#endif + +#include "sourcehook_impl.h" +#include "sh_memory.h" + +namespace SourceHook +{ + template<> + int HashFunction(const int & k) + { + return k; + } + template<> + int Compare(const int & k1, const int & k2) + { + if (k1 == k2) + return 0; + if (k1 > k2) + return 1; + if (k1 < k2) + return -1; + return 0; + } + CSourceHookImpl::CSourceHookImpl() + { + } + CSourceHookImpl::~CSourceHookImpl() + { + } + + int CSourceHookImpl::GetIfaceVersion() + { + return SH_IFACE_VERSION; + } + + int CSourceHookImpl::GetImplVersion() + { + return SH_IMPL_VERSION; + } + + bool CSourceHookImpl::IsPluginInUse(Plugin plug) + { + // Iterate through all hook managers which are in this plugin + // Iterate through their vfnptrs, ifaces, hooks + // If a hook from an other plugin is found, return true + // Return false otherwise +#define TMP_CHECK_LIST(name) \ + for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ + if (hook_iter->plug == plug) \ + return true; + + for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); + hmcl_iter != m_HookMans.end(); ++hmcl_iter) + { + for (CHookManagerContainer::iterator hmil_iter = hmcl_iter->begin(); + hmil_iter != hmcl_iter->end(); ++hmil_iter) + { + if (hmil_iter->m_Plug != plug) + continue; + for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); + vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) + { + for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); + iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) + { + List::iterator hook_iter; + TMP_CHECK_LIST(m_PreHooks); + TMP_CHECK_LIST(m_PostHooks); + } + } + } + } + +#undef TMP_CHECK_LIST + return false; + } + + void CSourceHookImpl::UnloadPlugin(Plugin plug) + { + // 1) Manually remove all hooks by this plugin + // 2) Manually remove all hook mans by this plugin + + List hookstoremove; + List hookmanstoremove; + HookManInfoList::iterator hmil_iter; + +#define TMP_CHECK_LIST(name, ispost) \ + for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ + if (hook_iter->plug == plug) \ + hookstoremove.push_back(RemoveHookInfo(hook_iter->plug, iface_iter->m_Ptr, \ + hook_iter->thisptr_offs, hmil_iter->m_Func, hook_iter->handler, ispost)); \ + + for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); + hmcl_iter != m_HookMans.end(); ++hmcl_iter) + { + for (CHookManagerContainer::iterator hmil_iter = hmcl_iter->begin(); + hmil_iter != hmcl_iter->end(); ++hmil_iter) + { + if (hmil_iter->m_Plug == plug) + hookmanstoremove.push_back(RemoveHookManInfo(plug, hmil_iter->m_Func)); + + for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); + vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) + { + for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); + iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) + { + List::iterator hook_iter; + TMP_CHECK_LIST(m_PreHooks, false); + TMP_CHECK_LIST(m_PostHooks, true); + } + } + } + } +#undef TMP_CHECK_LIST + + for (List::iterator rmiter = hookstoremove.begin(); rmiter != hookstoremove.end(); ++rmiter) + RemoveHook(*rmiter); + + for (List::iterator rmiter = hookmanstoremove.begin(); rmiter != hookmanstoremove.end(); ++rmiter) + RemoveHookManager(*rmiter); + } + + void CSourceHookImpl::RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) + { + // Moo! + + CHookManagerInfo tmp; + if (pubFunc(HA_GetInfo, &tmp) != 0) + return; + + + HookManContList::iterator hmcl_iter = m_HookMans.find( + CHookManagerContainer::HMCI(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx)); + + if (hmcl_iter == m_HookMans.end()) + { + // Moo? + return; + } + + CHookManagerContainer::iterator hmil_iter = hmcl_iter->find( + CHookManagerInfo::Descriptor(plug, pubFunc)); + + if (hmil_iter == hmcl_iter->end()) + { + // Moo? + return; + } + + bool stillInUse = false; + List hookstoremove; + + // Iterate through all of the hook manager's hooks. Remove all hooks from the hookman's plugin. +#define TMP_CHECK_LIST(name, ispost) \ + for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ + if (hook_iter->plug == plug) \ + hookstoremove.push_back(RemoveHookInfo(hook_iter->plug, iface_iter->m_Ptr, \ + hook_iter->thisptr_offs, hmil_iter->m_Func, hook_iter->handler, ispost)); \ + else \ + stillInUse = true; \ + + for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); + vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) + { + for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); + iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) + { + List::iterator hook_iter; + TMP_CHECK_LIST(m_PreHooks, false); + TMP_CHECK_LIST(m_PostHooks, true); + } + } +#undef TMP_CHECK_LIST + + for (List::iterator rmiter = hookstoremove.begin(); rmiter != hookstoremove.end(); ++rmiter) + RemoveHook(*rmiter); + + CHookManagerInfo info = *hmil_iter; + + // Unlink the hook manager from the list + hmcl_iter->erase(hmil_iter); + + // If there were any hooks from other plugins, find a new suitable hook manager. + if (stillInUse) + { + // Find a suitable hook manager in an other plugin + hmil_iter = hmcl_iter->begin(); + + // This should _never_ happen. + // If there is a hook from an other plugin, the plugin must have provided a hook manager as well. + SH_ASSERT(hmil_iter != hmcl_iter->end(), + ("Could not find a suitable hook manager in an other plugin!")); + + // AddHook should make sure that every plugin only has _one_ hook manager for _one_ proto/vi/vo + SH_ASSERT(hmil_iter->m_Plug != plug, ("New hook manager from same plugin!")); + + // The first hook manager should be always used - so the new hook manager has to be empty + SH_ASSERT(hmil_iter->m_VfnPtrs.empty(), ("New hook manager not empty!")); + + // Move the vfnptrs from the old hook manager to the new one + hmil_iter->m_VfnPtrs = info.m_VfnPtrs; + + // Unregister the old one, register the new one + info.m_Func(HA_Unregister, NULL); + hmil_iter->m_Func(HA_Register, &(*hmil_iter)); + + // Go through all vfnptrs in this hookman and patch them to point to the new manager's handler! + // or whatever + for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); + vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) + { + // And DEREFERENCE newHookMan->m_HookfuncVfnptr! + // otherwise it will be executing the vtable... had to find out the hard way + *reinterpret_cast(vfnptr_iter->m_Ptr) = *reinterpret_cast(hmil_iter->m_HookfuncVfnptr); + } + } + } + + void CSourceHookImpl::RemoveHookManager(RemoveHookManInfo info) + { + RemoveHookManager(info.plug, info.hookman); + } + + void CSourceHookImpl::CompleteShutdown() + { + // Remove all hooks + + List hookstoremove; + +#define TMP_CHECK_LIST(name, ispost) \ + for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ + hookstoremove.push_back(RemoveHookInfo(hook_iter->plug, iface_iter->m_Ptr, \ + hook_iter->thisptr_offs, hmil_iter->m_Func, hook_iter->handler, ispost)) + for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); + hmcl_iter != m_HookMans.end(); ++hmcl_iter) + { + for (CHookManagerContainer::iterator hmil_iter = hmcl_iter->begin(); + hmil_iter != hmcl_iter->end(); ++hmil_iter) + { + for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); + vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) + { + for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); + iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) + { + List::iterator hook_iter; + TMP_CHECK_LIST(m_PreHooks, false); + TMP_CHECK_LIST(m_PostHooks, true); + } + } + } + } +#undef TMP_CHECK_LIST + + for (List::iterator rmiter = hookstoremove.begin(); rmiter != hookstoremove.end(); ++rmiter) + RemoveHook(*rmiter); + + m_HookMans.clear(); + } + + bool CSourceHookImpl::AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post) + { + void *adjustediface = reinterpret_cast(reinterpret_cast(iface) + thisptr_offs); + + // 1) Get info about the hook manager + CHookManagerInfo tmp; + if (myHookMan(HA_GetInfo, &tmp) != 0) + return false; + + tmp.m_Func = myHookMan; + tmp.m_Plug = plug; + + CHookManagerContainer::HMCI hmci(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx); + + void **cur_vtptr = *reinterpret_cast( + reinterpret_cast(adjustediface) + tmp.m_VtblOffs); + void *cur_vfnptr = reinterpret_cast(cur_vtptr + tmp.m_VtblIdx); + + // Add the container if not already added + HookManContList::iterator hmcl_iter = m_HookMans.find(hmci); + if (hmcl_iter == m_HookMans.end()) + { + m_HookMans.push_back(CHookManagerContainer(hmci)); + hmcl_iter = m_HookMans.end(); + --hmcl_iter; + } + + hmcl_iter->AddHookManager(plug, tmp); + + CHookManagerContainer::iterator hookman = hmcl_iter->begin(); + SH_ASSERT(hookman != hmcl_iter->end(), ("No hookman found - but we've just added one!")); + + // Check whether any other container holds a hook manager which holds this vfnptr + // If yes, it means that the two are incompatible, so return false. + for (HookManContList::iterator hmcl_iter2 = m_HookMans.begin(); + hmcl_iter2 != m_HookMans.end(); ++hmcl_iter2) + { + if (hmcl_iter2 != hmcl_iter) + { + for (CHookManagerContainer::iterator hmil_iter = hmcl_iter2->begin(); + hmil_iter != hmcl_iter2->end(); ++hmil_iter) + { + if (hmil_iter->m_VfnPtrs.find(cur_vfnptr) != hmil_iter->m_VfnPtrs.end()) + return false; + } + } + } + + // Tell it to store the pointer if it's not already active + if (hookman->m_VfnPtrs.empty()) + hookman->m_Func(HA_Register, &(*hookman)); + + CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.find(cur_vfnptr); + + if (vfnptr_iter == hookman->m_VfnPtrs.end()) + { + // Add a new one + CVfnPtr vfp(cur_vfnptr); + + // Alter vtable entry + if (!SetMemAccess(cur_vtptr, sizeof(void*) * (tmp.m_VtblIdx + 1), SH_MEM_READ | SH_MEM_WRITE)) + return false; + + *reinterpret_cast(cur_vfnptr) = *reinterpret_cast(hookman->m_HookfuncVfnptr); + + hookman->m_VfnPtrs.push_back(vfp); + + // Make vfnptr_iter point to the new element + vfnptr_iter = hookman->m_VfnPtrs.end(); + --vfnptr_iter; + + // Now that it is done, check whether we have to update any callclasses + ApplyCallClassPatches(adjustediface, tmp.m_VtblOffs, tmp.m_VtblIdx, vfp.m_OrigEntry); + } + + CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.find(adjustediface); + if (iface_iter == vfnptr_iter->m_Ifaces.end()) + { + // Add a new one + vfnptr_iter->m_Ifaces.push_back(CIface(adjustediface)); + + // Make iface_iter point to the new element + iface_iter = vfnptr_iter->m_Ifaces.end(); + --iface_iter; + } + + // Add the hook + HookInfo hookinfo; + hookinfo.handler = handler; + hookinfo.plug = plug; + hookinfo.paused = false; + hookinfo.thisptr_offs = thisptr_offs; + if (post) + iface_iter->m_PostHooks.m_List.push_back(hookinfo); + else + iface_iter->m_PreHooks.m_List.push_back(hookinfo); + + return true; + } + + bool CSourceHookImpl::RemoveHook(RemoveHookInfo info) + { + return RemoveHook(info.plug, info.iface, info.thisptr_offs, info.hookman, info.handler, info.post); + } + + bool CSourceHookImpl::RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post) + { + void *adjustediface = reinterpret_cast(reinterpret_cast(iface)+thisptr_offs); + CHookManagerInfo tmp; + if (myHookMan(HA_GetInfo, &tmp) != 0) + return false; + + // Find the hook manager and the hook + + HookManContList::iterator hmcl_iter = m_HookMans.find( + CHookManagerContainer::HMCI(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx)); + if (hmcl_iter == m_HookMans.end() || hmcl_iter->empty()) + return false; + + CHookManagerContainer::iterator hookman = hmcl_iter->begin(); + + if (!ModuleInMemory(reinterpret_cast(adjustediface) + tmp.m_VtblOffs, + sizeof(void*) * (tmp.m_VtblIdx + 1))) + { + // The module the vtable was in is already unloaded. + hookman->m_VfnPtrs.clear(); + hookman->m_Func(HA_Unregister, NULL); + return true; + } + + void **cur_vtptr = *reinterpret_cast( + reinterpret_cast(adjustediface) + tmp.m_VtblOffs); + void *cur_vfnptr = reinterpret_cast(cur_vtptr + tmp.m_VtblIdx); + + CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.find(cur_vfnptr); + + if (vfnptr_iter == hookman->m_VfnPtrs.end()) + return false; + + for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); + iface_iter != vfnptr_iter->m_Ifaces.end();) + { + if (iface_iter->m_Ptr != adjustediface) + { + iface_iter++; + continue; + } + List &hooks = + post ? iface_iter->m_PostHooks.m_List : iface_iter->m_PreHooks.m_List; + + bool erase; + for (List::iterator hookiter = hooks.begin(); + hookiter != hooks.end(); ) + { + erase = hookiter->plug == plug && hookiter->handler->IsEqual(handler) && + hookiter->thisptr_offs == thisptr_offs; + if (erase) + { + hookiter->handler->DeleteThis(); // Make the _plugin_ delete the handler object + + // Move all iterators pointing at this + List::iterator oldhookiter = hookiter; + hookiter = hooks.erase(hookiter); + List::iterator newhookiter = hookiter; + --newhookiter; // The hook loop will ++ it then + CHookList::CIter *pItIter; + for (pItIter = iface_iter->m_PreHooks.m_UsedIters; pItIter; pItIter = pItIter->m_pNext) + if (pItIter->m_Iter == oldhookiter) + pItIter->m_Iter = newhookiter; + } + else + ++hookiter; + } + if (iface_iter->m_PostHooks.m_List.empty() && iface_iter->m_PreHooks.m_List.empty()) + { + // There are no hooks on this iface anymore... + for (HookLoopInfoStack::iterator hli_iter = m_HLIStack.begin(); + hli_iter != m_HLIStack.end(); ++hli_iter) + { + if (hli_iter->pCurIface == static_cast(&(*iface_iter))) + hli_iter->shouldContinue = false; + } + + iface_iter = vfnptr_iter->m_Ifaces.erase(iface_iter); + if (vfnptr_iter->m_Ifaces.empty()) + { + // No ifaces at all -> Deactivate the hook + *reinterpret_cast(vfnptr_iter->m_Ptr) = vfnptr_iter->m_OrigEntry; + + hookman->m_VfnPtrs.erase(vfnptr_iter); + + // Remove callclass patch + for (Impl_CallClassList::iterator cciter = m_CallClasses.begin(); cciter != m_CallClasses.end(); ++cciter) + if (cciter->m_Ptr == adjustediface) + cciter->RemoveCallClassPatch(tmp.m_VtblOffs, tmp.m_VtblIdx); + + if (hookman->m_VfnPtrs.empty()) + { + // Unregister the hook manager + hookman->m_Func(HA_Unregister, NULL); + } + + // Don't try to continue looping through ifaces + // - the list is already invalid + return true; + } + } + else + ++iface_iter; + } + return true; + } + + GenericCallClass *CSourceHookImpl::GetCallClass(void *iface, size_t size) + { + for (Impl_CallClassList::iterator cciter = m_CallClasses.begin(); cciter != m_CallClasses.end(); ++cciter) + { + if (cciter->m_Ptr == iface && cciter->m_ObjSize == size) + { + ++cciter->m_RefCounter; + return &(*cciter); + } + } + + // Make a new one + + CCallClassImpl tmp(iface, size); + ApplyCallClassPatches(tmp); + m_CallClasses.push_back(tmp); + return &m_CallClasses.back(); + } + + void CSourceHookImpl::ReleaseCallClass(GenericCallClass *ptr) + { + Impl_CallClassList::iterator iter = m_CallClasses.find(ptr); + if (iter == m_CallClasses.end()) + return; + --iter->m_RefCounter; + if (iter->m_RefCounter < 1) + m_CallClasses.erase(iter); + } + + void CSourceHookImpl::ApplyCallClassPatches(CCallClassImpl &cc) + { + for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); + hmcl_iter != m_HookMans.end(); ++hmcl_iter) + { + for (CHookManagerContainer::iterator hookman = hmcl_iter->begin(); + hookman != hmcl_iter->end(); ++hookman) + { + for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.begin(); + vfnptr_iter != hookman->m_VfnPtrs.end(); ++vfnptr_iter) + { + for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); + iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) + { + if (iface_iter->m_Ptr >= cc.m_Ptr && + iface_iter->m_Ptr < (reinterpret_cast(cc.m_Ptr) + cc.m_ObjSize)) + { + cc.ApplyCallClassPatch(static_cast(reinterpret_cast(iface_iter->m_Ptr) - + reinterpret_cast(cc.m_Ptr)) + hookman->m_VtblOffs, + hookman->m_VtblIdx, vfnptr_iter->m_OrigEntry); + } + } + } + } + } + } + + void CSourceHookImpl::ApplyCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx, void *orig_entry) + { + for (Impl_CallClassList::iterator cc_iter = m_CallClasses.begin(); cc_iter != m_CallClasses.end(); + ++cc_iter) + { + if (ifaceptr >= cc_iter->m_Ptr && + ifaceptr < (reinterpret_cast(cc_iter->m_Ptr) + cc_iter->m_ObjSize)) + { + cc_iter->ApplyCallClassPatch(static_cast(reinterpret_cast(ifaceptr) - + reinterpret_cast(cc_iter->m_Ptr)) + vtbl_offs, vtbl_idx, orig_entry); + } + } + } + + void CSourceHookImpl::RemoveCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx) + { + for (Impl_CallClassList::iterator cc_iter = m_CallClasses.begin(); cc_iter != m_CallClasses.end(); + ++cc_iter) + { + if (ifaceptr >= cc_iter->m_Ptr && + ifaceptr < (reinterpret_cast(cc_iter->m_Ptr) + cc_iter->m_ObjSize)) + { + cc_iter->RemoveCallClassPatch(vtbl_offs, vtbl_idx); + } + } + } + + void CSourceHookImpl::SetPluginPaused(Plugin plug, bool paused) + { + // Go through all hook managers, all interfaces, and set the status of all hooks of this plugin to paused + for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); + hmcl_iter != m_HookMans.end(); ++hmcl_iter) + { + for (CHookManagerContainer::iterator hookmaniter = hmcl_iter->begin(); + hookmaniter != hmcl_iter->end(); ++hookmaniter) + { + for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookmaniter->m_VfnPtrs.begin(); + vfnptr_iter != hookmaniter->m_VfnPtrs.end(); ++vfnptr_iter) + { + for (CVfnPtr::IfaceListIter ifaceiter = vfnptr_iter->m_Ifaces.begin(); + ifaceiter != vfnptr_iter->m_Ifaces.end(); ++ifaceiter) + { + for (List::iterator hookiter = ifaceiter->m_PreHooks.m_List.begin(); + hookiter != ifaceiter->m_PreHooks.m_List.end(); ++hookiter) + if (plug == hookiter->plug) + hookiter->paused = paused; + + for (List::iterator hookiter = ifaceiter->m_PostHooks.m_List.begin(); + hookiter != ifaceiter->m_PostHooks.m_List.end(); ++hookiter) + if (plug == hookiter->plug) + hookiter->paused = paused; + } + } + } + } + } + void CSourceHookImpl::PausePlugin(Plugin plug) + { + SetPluginPaused(plug, true); + } + + void CSourceHookImpl::UnpausePlugin(Plugin plug) + { + SetPluginPaused(plug, false); + } + + void CSourceHookImpl::HookLoopBegin(IIface *pIface) + { + HookLoopInfo hli; + hli.pCurIface = pIface; + hli.shouldContinue = true; + hli.recall = HookLoopInfo::Recall_No; + + static_cast(pIface)->m_PreHooks.RQFlagReset(); + static_cast(pIface)->m_PostHooks.RQFlagReset(); + + m_HLIStack.push(hli); + } + + void CSourceHookImpl::HookLoopEnd() + { + // When in a post recall... make sure status is high enough so that it returns the orig ret. + if (m_HLIStack.size() > 1 && m_HLIStack.second().recall == HookLoopInfo::Recall_Post2) + *m_HLIStack.front().pStatus = MRES_SUPERCEDE; // THAT'LL TEACH THEM! + m_HLIStack.pop(); + } + + void CSourceHookImpl::SetRes(META_RES res) + { + *m_HLIStack.front().pCurRes = res; + } + + META_RES CSourceHookImpl::GetPrevRes() + { + return *m_HLIStack.front().pPrevRes; + } + + META_RES CSourceHookImpl::GetStatus() + { + return *m_HLIStack.front().pStatus; + } + + const void *CSourceHookImpl::GetOrigRet() + { + // When in a post recall... return the orig ret of the previous hookloop. + if (m_HLIStack.size() > 1 && m_HLIStack.second().recall == HookLoopInfo::Recall_Post2) + return m_HLIStack.second().pOrigRet; + + return m_HLIStack.front().pOrigRet; + } + + const void *CSourceHookImpl::GetOverrideRet() + { + // pOverrideRet is always set since recalls were introduced + // GetOverrideRetPtr was added; a function which always returns pOverrideRet + // so that RETURN_META_VALUE_NEWPARAMS can provide an override result + + // This means that we have to filter GetOverrideRet: + // If the status variable is < MRES_OVERRIDE, return NULL. + + return (*m_HLIStack.front().pStatus < MRES_OVERRIDE) ? + NULL : m_HLIStack.front().pOverrideRet; + } + + void *CSourceHookImpl::GetOverrideRetPtr() + { + // As described in the comment above: always return pOverrideRet + return m_HLIStack.front().pOverrideRet; + } + + void *CSourceHookImpl::GetIfacePtr() + { + return *m_HLIStack.front().pIfacePtrPtr; + } + + void CSourceHookImpl::SetCurResPtr(META_RES *mres) + { + m_HLIStack.front().pCurRes = mres; + } + + void CSourceHookImpl::SetPrevResPtr(META_RES *mres) + { + m_HLIStack.front().pPrevRes = mres; + + // If we're recalling, drag the previous mres value to the new hookfunc + if (m_HLIStack.size() > 1 && m_HLIStack.second().recall) + *mres = *m_HLIStack.second().pPrevRes; + } + + void CSourceHookImpl::SetStatusPtr(META_RES *mres) + { + m_HLIStack.front().pStatus = mres; + + // If we're recalling, drag the previous mres value to the new hookfunc + if (m_HLIStack.size() > 1 && m_HLIStack.second().recall) + *mres = *m_HLIStack.second().pStatus; + } + + void CSourceHookImpl::SetIfacePtrPtr(void **pp) + { + m_HLIStack.front().pIfacePtrPtr = pp; + } + + void CSourceHookImpl::SetOrigRetPtr(const void *ptr) + { + m_HLIStack.front().pOrigRet = ptr; + } + void CSourceHookImpl::SetOverrideRetPtr(void *ptr) + { + m_HLIStack.front().pOverrideRet = ptr; + } + + // New function which does all of the above + more :) + void *CSourceHookImpl::SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, + void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) + { + HookLoopInfo &hli = m_HLIStack.front(); + hli.pStatus = statusPtr; + hli.pPrevRes = prevResPtr; + hli.pCurRes = curResPtr; + hli.pIfacePtrPtr = ifacePtrPtr; + hli.pOrigRet = origRetPtr; + + // Handle some recall stuff + if (m_HLIStack.size() > 1 && m_HLIStack.second().recall) + { + HookLoopInfo &other = m_HLIStack.second(); + *statusPtr = *other.pStatus; + *prevResPtr = *other.pStatus; + + // When the status is low so there's no override return value and we're in a post recall, + // give it the orig return value as override return value. + if (*statusPtr < MRES_OVERRIDE && other.recall == HookLoopInfo::Recall_Post1) + hli.pOverrideRet = const_cast(other.pOrigRet); + else // Otherwise, transfer override ret normally + hli.pOverrideRet = other.pOverrideRet; + } + else + hli.pOverrideRet = overrideRetPtr; + + // Tell the hook func which override ret ptr to use + return hli.pOverrideRet; + } + + bool CSourceHookImpl::ShouldContinue() + { + // If recall is true, we shall not continue either. + // This is because, if it's true and ShouldContinue is called, it suggests that the + // actual recall is done and that we are back in the original handler which shall return + // immediately. + + // Post-recalls: + // The second element on the stack has recall set to Recall_Post1. + // This means that we want to skip this part and the original function calling thing, so + // we store the status mres value, set status to MRES_SUPERCEDE, and return false. + // We also set the recall flag to Recall_Post2, so the next time the thing calls us, we + // can return true (so that the thing goes into post hooks). + if (m_HLIStack.size() > 1) + { + if (m_HLIStack.second().recall == HookLoopInfo::Recall_Post1) + { + m_HLIStack.front().temporaryStatus = *m_HLIStack.front().pStatus; + *m_HLIStack.front().pStatus = MRES_SUPERCEDE; + m_HLIStack.second().recall = HookLoopInfo::Recall_Post2; + return false; + } + else if (m_HLIStack.second().recall == HookLoopInfo::Recall_Post2) + { + *m_HLIStack.front().pStatus = m_HLIStack.front().temporaryStatus; + return m_HLIStack.front().shouldContinue; + } + } + return m_HLIStack.front().shouldContinue && !m_HLIStack.front().recall; + } + + void CSourceHookImpl::DoRecall() + { + if (!m_HLIStack.empty()) + { + // Also watch out for post recalls! Described at the beginning of sourcehook_impl.h + m_HLIStack.front().recall = + static_cast(m_HLIStack.front().pCurIface)->m_PostHooks.RQFlagGet() ? + HookLoopInfo::Recall_Post1 : HookLoopInfo::Recall_Pre; + + CHookList *mlist = static_cast(m_HLIStack.front().recall == HookLoopInfo::Recall_Pre ? + m_HLIStack.front().pCurIface->GetPreHooks() : m_HLIStack.front().pCurIface->GetPostHooks()); + mlist->m_Recall = true; + + // The hookfunc usually does this, but it won't have a chance to see it, + // so for recalls, we update status here if it's required + if (*m_HLIStack.front().pCurRes > *m_HLIStack.front().pStatus) + *m_HLIStack.front().pStatus = *m_HLIStack.front().pCurRes; + + } + } + + //////////////////////////// + // CCallClassImpl + //////////////////////////// + CSourceHookImpl::CCallClassImpl::CCallClassImpl(void *ptr, size_t size) + : m_Ptr(ptr), m_ObjSize(size), m_RefCounter(1) + { + } + CSourceHookImpl::CCallClassImpl::~CCallClassImpl() + { + } + + void *CSourceHookImpl::CCallClassImpl::GetThisPtr() + { + return m_Ptr; + } + void *CSourceHookImpl::CCallClassImpl::GetOrigFunc(int vtbloffs, int vtblidx) + { + OrigVTables::iterator iter = m_VT.find(vtbloffs); + if (iter != m_VT.end() && iter->val.size() > (size_t)vtblidx) + { + return iter->val[vtblidx]; + } + return NULL; + } + + void CSourceHookImpl::CCallClassImpl::ApplyCallClassPatch(int vtbl_offs, int vtbl_idx, void *orig_entry) + { + OrigFuncs &tmpvec = m_VT[vtbl_offs]; + if (tmpvec.size() <= (size_t)vtbl_idx) + tmpvec.resize(vtbl_idx+1, NULL); + tmpvec[vtbl_idx] = orig_entry; + } + void CSourceHookImpl::CCallClassImpl::RemoveCallClassPatch(int vtbl_offs, int vtbl_idx) + { + OrigVTables::iterator iter = m_VT.find(vtbl_offs); + if (iter != m_VT.end()) + { + if (iter->val.size() > (size_t)vtbl_idx) + { + iter->val[vtbl_idx] = 0; + + OrigFuncs &of = iter->val; + OrigFuncs::iterator lastused = of.end(); + for (OrigFuncs::iterator viter = of.begin(); viter != of.end(); ++viter) + { + if (*viter) + lastused = viter; + } + if (lastused == of.end()) + { + // No used element => Remove the whole vector + m_VT.erase(iter); + return; + } + of.resize(lastused - of.begin() + 1); + } + } + } + + //////////////////////////// + // CHookManagerInfo + //////////////////////////// + CSourceHookImpl::CHookManagerInfo::CHookManagerInfo() : m_HookManVersion(0) + { + } + CSourceHookImpl::CHookManagerInfo::~CHookManagerInfo() + { + } + + IVfnPtr *CSourceHookImpl::CHookManagerInfo::FindVfnPtr(void *vfnptr) + { + VfnPtrListIter iter = m_VfnPtrs.find(vfnptr); + return iter == m_VfnPtrs.end() ? NULL : &(*iter); + } + void CSourceHookImpl::CHookManagerInfo::SetInfo(int vtbl_offs, int vtbl_idx, const char *proto) + { + m_VtblOffs = vtbl_offs; + m_VtblIdx = vtbl_idx; + m_Proto = proto; + } + void CSourceHookImpl::CHookManagerInfo::SetHookfuncVfnptr(void *hookfunc_vfnptr) + { + m_HookfuncVfnptr = hookfunc_vfnptr; + } + void CSourceHookImpl::CHookManagerInfo::SetVersion(int version) + { + m_HookManVersion = version; + } + //////////////////////////// + // CVfnPtr + //////////////////////////// + + + // If you get a crash here, the ptr passed is invalid + // This usually means a SH_DECL_MANUALHOOK* with wrong thisptroffs/vtbloffs/vtblidx + CSourceHookImpl::CVfnPtr::CVfnPtr(void *ptr) : m_Ptr(ptr), m_OrigEntry(*reinterpret_cast(ptr)) + { + } + CSourceHookImpl::CVfnPtr::~CVfnPtr() + { + } + + void *CSourceHookImpl::CVfnPtr::GetVfnPtr() + { + return m_Ptr; + } + + void *CSourceHookImpl::CVfnPtr::GetOrigEntry() + { + return m_OrigEntry; + } + + IIface *CSourceHookImpl::CVfnPtr::FindIface(void *ptr) + { + IfaceListIter iter = m_Ifaces.find(ptr); + return iter == m_Ifaces.end() ? NULL : &(*iter); + } + + //////////////////////////// + // CIface + //////////////////////////// + CSourceHookImpl::CIface::CIface(void *ptr) : m_Ptr(ptr) + { + } + CSourceHookImpl::CIface::~CIface() + { + } + + void *CSourceHookImpl::CIface::GetPtr() + { + return m_Ptr; + } + + IHookList *CSourceHookImpl::CIface::GetPreHooks() + { + return &m_PreHooks; + } + IHookList *CSourceHookImpl::CIface::GetPostHooks() + { + return &m_PostHooks; + } + + //////////////////////////// + // CHookList + //////////////////////////// + + CSourceHookImpl::CHookList::CHookList() : m_FreeIters(NULL), m_UsedIters(NULL), + m_Recall(false) + { + } + CSourceHookImpl::CHookList::CHookList(const CHookList &other) : m_List(other.m_List), + m_FreeIters(NULL), m_UsedIters(NULL), m_Recall(false) + { + } + + CSourceHookImpl::CHookList::~CHookList() + { + while (m_FreeIters) + { + CIter *iter = m_FreeIters->m_pNext; + delete m_FreeIters; + m_FreeIters = iter; + } + while (m_UsedIters) + { + CIter *iter = m_UsedIters->m_pNext; + delete m_UsedIters; + m_UsedIters = iter; + } + } + IHookList::IIter *CSourceHookImpl::CHookList::GetIter() + { + m_RQFlag = true; + + CIter *ret; + if (m_FreeIters) + { + ret = m_FreeIters; + m_FreeIters = ret->m_pNext; + ret->GoToBegin(); + } + else + { + ret = new CIter(this); + } + + // Muuuh, if we're recalling, it shall be a copy of the last iterator, incremented by one + if (m_Recall && m_UsedIters) + { + ret->Set(m_UsedIters); // m_UsedIters is the last returned and not released iterator + ret->Next(); // Use next instead of directly incrementing its m_Iter: + // skips paused plugins + } + + ret->m_pNext = m_UsedIters; + ret->m_pPrev = NULL; + if (m_UsedIters) + m_UsedIters->m_pPrev = ret; + m_UsedIters = ret; + + m_Recall = false; + + return ret; + } + void CSourceHookImpl::CHookList::ReleaseIter(IIter *pIter) + { + CIter *pIter2 = static_cast(pIter); + + // Unlink from m_UsedIters + + if (pIter2->m_pNext) + pIter2->m_pNext->m_pPrev = pIter2->m_pPrev; + if (pIter2->m_pPrev) + pIter2->m_pPrev->m_pNext = pIter2->m_pNext; + if (pIter2 == m_UsedIters) + m_UsedIters = NULL; + + // Link to m_FreeIters + + pIter2->m_pNext = m_FreeIters; + + m_FreeIters = pIter2; + + // Reset recall state. + m_Recall = false; + } + + CSourceHookImpl::CHookList::CIter::CIter(CHookList *pList) : m_pList(pList), m_pNext(NULL) + { + GoToBegin(); + } + CSourceHookImpl::CHookList::CIter::~CIter() + { + } + + void CSourceHookImpl::CHookList::CIter::Set(CIter *pOther) + { + m_Iter = pOther->m_Iter; + } + + void CSourceHookImpl::CHookList::CIter::GoToBegin() + { + m_Iter = m_pList->m_List.begin(); + SkipPaused(); + } + + bool CSourceHookImpl::CHookList::CIter::End() + { + if (!m_pList) + return false; + return m_Iter == m_pList->m_List.end(); + } + void CSourceHookImpl::CHookList::CIter::Next() + { + if (!m_pList) + return; + ++m_Iter; + SkipPaused(); + } + void CSourceHookImpl::CHookList::CIter::Clear() + { + m_pList = NULL; + } + void CSourceHookImpl::CHookList::CIter::SkipPaused() + { + while (m_Iter != m_pList->m_List.end() && m_Iter->paused) + ++m_Iter; + } + + ISHDelegate *CSourceHookImpl::CHookList::CIter::Handler() + { + return m_Iter->handler; + } + int CSourceHookImpl::CHookList::CIter::ThisPtrOffs() + { + return m_Iter->thisptr_offs; + } + + ////////////////////////////////////////////////////////////////////////// + // CProto + ////////////////////////////////////////////////////////////////////////// + char *CSourceHookImpl::CProto::DupProto(const char *p) + { + char *newproto; + if (*p) + { + size_t len = strlen(p); + newproto = new char[len+1]; + memcpy(newproto, p, len+1); + } else { + const ProtoInfo *pi1 = reinterpret_cast(p); + int *ar_copy = new int[pi1->numOfParams + 1]; + for (int i = 0; i <= pi1->numOfParams; i++) + ar_copy[i] = pi1->params[i]; + ProtoInfo *copy = new ProtoInfo(pi1->retTypeSize, pi1->numOfParams, ar_copy); + newproto = reinterpret_cast(copy); + } + + return newproto; + } + + void CSourceHookImpl::CProto::FreeProto(char *prot) + { + if (*prot) + { + delete [] prot; + } else { + ProtoInfo *pi = reinterpret_cast(prot); + delete [] pi->params; + delete pi; + } + } + + bool CSourceHookImpl::CProto::Equal(const char *p1, const char *p2) + { + if (*p1 && *p2) // Case1: Both old + { + // As in old versions + return strcmp(p1, p2) == 0; + } + else if (!*p1 && !*p2) // Case2: Both new + { + const ProtoInfo *pi1 = reinterpret_cast(p1); + const ProtoInfo *pi2 = reinterpret_cast(p2); + + if (pi1->retTypeSize == pi2->retTypeSize && + pi1->numOfParams == pi2->numOfParams) + { + // params[0] is 0 for "normal" functions and -1 for vararg functions + // params[1] is size of first parameter + // params[2] is size of second parameter ... + for (int i = 0; i <= pi1->numOfParams; ++i) + { + if (pi1->params[i] != pi2->params[i]) + return false; + } + return true; + } + else + { + return false; + } + } + else // Case3: Mixed old/new + { + // Trust the user + return true; + } + } + + + ////////////////////////////////////////////////////////////////////////// + // CHookManagerContainer + ////////////////////////////////////////////////////////////////////////// + void CSourceHookImpl::CHookManagerContainer::AddHookManager(Plugin plug, const CHookManagerInfo &hookman) + { + iterator iter; + // Check whether such a hook manager already exists; if yes, ignore. + for (iter = begin(); iter != end(); ++iter) + { + if (iter->m_Plug == plug && iter->m_Func == hookman.m_Func) + return; + } + + // It doesn't -> add it. Add it to the end of its version group. + for (iter = begin(); iter != end(); ++iter) + { + if (iter->m_HookManVersion < hookman.m_HookManVersion) + break; + } + + bool isBeginning = iter == begin(); + + insert(iter, hookman); + + // If we inserted it at the beginning and if the dam breaks open many years too soon + // and if there is more than one hookman and if the second one isn't empty, transfer + // hooks from second to first + + if (isBeginning && size() > 1) + { + iter = begin(); + iterator second = iter; + ++second; + + if (!second->m_VfnPtrs.empty()) + { + // Move the vfnptrs from the old hook manager to the new one + iter->m_VfnPtrs = second->m_VfnPtrs; + second->m_VfnPtrs.clear(); + + // Unregister the old one, register the new one + second->m_Func(HA_Unregister, NULL); + iter->m_Func(HA_Register, &(*iter)); + + // Go through all vfnptrs in this hookman and patch them to point to the new manager's handler! + // or whatever + for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = iter->m_VfnPtrs.begin(); + vfnptr_iter != iter->m_VfnPtrs.end(); ++vfnptr_iter) + { + // And DEREFERENCE newHookMan->m_HookfuncVfnptr! + // otherwise it will be executing the vtable... had to find out the hard way + *reinterpret_cast(vfnptr_iter->m_Ptr) = *reinterpret_cast(iter->m_HookfuncVfnptr); + } + } + } + } +} diff --git a/sourcehook/sourcehook.h b/sourcehook/sourcehook.h new file mode 100644 index 0000000..49e6813 --- /dev/null +++ b/sourcehook/sourcehook.h @@ -0,0 +1,6104 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +/** +* @file sourcehook.h +* @brief Contains the public SourceHook API +*/ + +#ifndef __SOURCEHOOK_H__ +#define __SOURCEHOOK_H__ + +// Interface revisions: +// 1 - Initial revision +// 2 - Changed to virtual functions for iterators and all queries +// 3 - Added "hook loop status variable" +// 4 - Reentrant +#define SH_IFACE_VERSION 4 +#define SH_IMPL_VERSION 3 + +// Hookman version: +// 1 - Support for recalls, performance optimisations +#define SH_HOOKMAN_VERSION 1 + +// The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook +// It's used in various macros +#ifndef SH_GLOB_SHPTR +#define SH_GLOB_SHPTR g_SHPtr +#endif + +// Used to identify the current plugin +#ifndef SH_GLOB_PLUGPTR +#define SH_GLOB_PLUGPTR g_PLID +#endif + +#ifdef SH_DEBUG +# include +# include + +# define SH_ASSERT(x, info) \ + do { \ + if (!(x)) \ + { \ + printf("SOURCEHOOK DEBUG ASSERTION FAILED: %s:%u(%s): %s: ", __FILE__, __LINE__, __FUNCTION__, #x); \ + printf info; \ + putchar('\n'); \ + abort(); \ + } \ + } while(0) + +#else +# define SH_ASSERT(x, info) +#endif + +// System +#define SH_SYS_WIN32 1 +#define SH_SYS_LINUX 2 + +#ifdef _WIN32 +# define SH_SYS SH_SYS_WIN32 +#elif defined __linux__ +# define SH_SYS SH_SYS_LINUX +#else +# error Unsupported system +#endif + +// Compiler +#define SH_COMP_GCC 1 +#define SH_COMP_MSVC 2 + +#ifdef _MSC_VER +# define SH_COMP SH_COMP_MSVC +#elif defined __GNUC__ +# define SH_COMP SH_COMP_GCC +#else +# error Unsupported compiler +#endif + +#if SH_COMP==SH_COMP_MSVC +# define vsnprintf _vsnprintf +#endif + +#if SH_SYS != SH_SYS_WIN32 +# include +#endif + +#define SH_PTRSIZE sizeof(void*) + +#include "FastDelegate.h" +#include "sh_memfuncinfo.h" + +// Good old metamod! + +// Flags returned by a plugin's api function. +// NOTE: order is crucial, as greater/less comparisons are made. +enum META_RES +{ + MRES_IGNORED=0, // plugin didn't take any action + MRES_HANDLED, // plugin did something, but real function should still be called + MRES_OVERRIDE, // call real function, but use my return value + MRES_SUPERCEDE // skip real function; use my return value +}; + + +namespace SourceHook +{ + /** + * @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers + */ + const int STRBUF_LEN=4096; + + /** + * @brief An empty class. No inheritance used. Used for original-function-call hacks + */ + class EmptyClass + { + }; + + /** + * @brief Implicit cast. + */ + template + inline Out implicit_cast(In input) + { + return input; + } + + /** + * @brief A plugin typedef + * + * SourceHook doesn't really care what this is. As long as the ==, != and = operators work on it and every + * plugin has a unique identifier, everything is ok. + * It should also be possible to set it to 0. + */ + typedef int Plugin; + + struct ProtoInfo + { + ProtoInfo(int rtsz, int nop, const int *p) : beginningNull(0), retTypeSize(rtsz), numOfParams(nop), params(p) + { + } + int beginningNull; //!< To distinguish from old protos (which never begin with 0) + int retTypeSize; //!< 0 if void + int numOfParams; //!< number of parameters + const int *params; //!< params[0]=0 (or -1 for vararg), params[1]=size of first param, ... + }; + + /** + * @brief Specifies the actions for hook managers + */ + enum HookManagerAction + { + HA_GetInfo = 0, //!< Store info about the hook manager + HA_Register, //!< Save the IHookManagerInfo pointer for future reference + HA_Unregister //!< Clear the saved pointer + }; + + struct IHookManagerInfo; + + /** + * @brief Pointer to hook manager interface function + * + * A "hook manager" is a the only thing that knows the actual protoype of the function at compile time. + * + * @param ha What the hook manager should do + * @param hi A pointer to IHookManagerInfo + */ + typedef int (*HookManagerPubFunc)(HookManagerAction ha, IHookManagerInfo *hi); + + class ISHDelegate + { + public: + virtual void DeleteThis() = 0; // Ugly, I know + virtual bool IsEqual(ISHDelegate *other) = 0; + }; + + template class CSHDelegate : public ISHDelegate + { + T m_Deleg; + public: + CSHDelegate(T deleg) : m_Deleg(deleg) + { + } + + CSHDelegate(const CSHDelegate &other) : m_Deleg(other.m_Deleg) + { + } + + void DeleteThis() + { + delete this; + } + + bool IsEqual(ISHDelegate *other) + { + return static_cast* >(other)->GetDeleg() == GetDeleg(); + } + + T &GetDeleg() + { + return m_Deleg; + } + }; + + struct IHookList + { + struct IIter + { + virtual bool End() = 0; + virtual void Next() = 0; + virtual ISHDelegate *Handler() = 0; + virtual int ThisPtrOffs() = 0; + }; + virtual IIter *GetIter() = 0; + virtual void ReleaseIter(IIter *pIter) = 0; + }; + + struct IIface + { + virtual void *GetPtr() = 0; + virtual IHookList *GetPreHooks() = 0; + virtual IHookList *GetPostHooks() = 0; + }; + + struct IVfnPtr + { + virtual void *GetVfnPtr() = 0; + virtual void *GetOrigEntry() = 0; + + virtual IIface *FindIface(void *ptr) = 0; + }; + + struct IHookManagerInfo + { + virtual IVfnPtr *FindVfnPtr(void *vfnptr) = 0; + + virtual void SetInfo(int vtbloffs, int vtblidx, const char *proto) = 0; + virtual void SetHookfuncVfnptr(void *hookfunc_vfnptr) = 0; + + // Added 23.12.2005 (yup! I'm coding RIGHT BEFORE CHRISTMAS!) + // If the hookman doesn't set this, it defaults 0 + // SourceHook prefers hookmans with higher version numbers + virtual void SetVersion(int version) = 0; + }; + + class AutoHookIter + { + IHookList *m_pList; + IHookList::IIter *m_pIter; + public: + AutoHookIter(IHookList *pList) + : m_pList(pList), m_pIter(pList->GetIter()) + { + } + + ~AutoHookIter() + { + if (m_pList) + m_pList->ReleaseIter(m_pIter); + } + + bool End() + { + return m_pIter->End(); + } + + void Next() + { + m_pIter->Next(); + } + + ISHDelegate *Handler() + { + return m_pIter->Handler(); + } + + int ThisPtrOffs() + { + return m_pIter->ThisPtrOffs(); + } + + void SetToZero() + { + m_pList = 0; + } + }; + + template struct CallClass + { + virtual B *GetThisPtr() = 0; + virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; + }; + + typedef CallClass GenericCallClass; + typedef CallClass ManualCallClass; + + // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) + // - Today is an important day. + // I'm adding support for functions which return references. + + // How it works: + // SH_SETUPCALLS doesn't use plain rettype to store the temporary return values (plugin ret, orig ret, + // override ret) anymore; instead, it uses SourceHook::ReferenceCarrier::type + // this is typedefed to the original rettype normally, but if the rettype is a reference, it's a special class + // which stores the reference as a pointer, and implements constructors, operator= and a conversion operator. + // special cases were needed for getoverrideret / getorigret; these are implemented through the + // SourceHook::MacroRefHelpers structs. + // Furthermore, SetOverrideRet had to be changed a bit; see SourceHook::OverrideFunctor somewhere down in this file. + template struct ReferenceCarrier + { + typedef T type; + }; + + template struct ReferenceCarrier + { + class type + { + T *m_StoredRef; + public: + type() : m_StoredRef(NULL) + { + } + type(T& ref) : m_StoredRef(&ref) + { + } + + T& operator= (T& ref) + { + m_StoredRef = &ref; + return ref; + } + + operator T& () const + { + return *m_StoredRef; + } + }; + }; + + /** + * @brief The main SourceHook interface + */ + class ISourceHook + { + public: + /** + * @brief Return interface version + */ + virtual int GetIfaceVersion() = 0; + + /** + * @brief Return implementation version + */ + virtual int GetImplVersion() = 0; + + /** + * @brief Add a hook. + * + * @return True if the function succeeded, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param iface The interface pointer + * @param ifacesize The size of the class iface points to + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) = 0; + + /** + * @brief Removes a hook. + * + * @return True if the function succeeded, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param iface The interface pointer + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) = 0; + + /** + * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins + * + * @param plug The unique identifier of the plugin in question + */ + virtual bool IsPluginInUse(Plugin plug) = 0; + + /** + * @brief Return a pointer to a callclass. Generate a new one if required. + * + * @param iface The interface pointer + * @param size Size of the class instance + */ + virtual GenericCallClass *GetCallClass(void *iface, size_t size) = 0; + + /** + * @brief Release a callclass + * + * @param ptr Pointer to the callclass + */ + virtual void ReleaseCallClass(GenericCallClass *ptr) = 0; + + virtual void SetRes(META_RES res) = 0; //!< Sets the meta result + virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the + //!< previously calledhandler + virtual META_RES GetStatus() = 0; //!< Gets the highest meta result + virtual const void *GetOrigRet() = 0; //!< Gets the original result. + //!< If not in post function, undefined + virtual const void *GetOverrideRet() = 0; //!< Gets the override result. + //!< If none is specified, NULL + virtual void *GetIfacePtr() = 0; //!< Gets the interface pointer + ////////////////////////////////////////////////////////////////////////// + // For hook managers + virtual void HookLoopBegin(IIface *pIface) = 0; //!< Should be called when a hook loop begins + virtual void HookLoopEnd() = 0; //!< Should be called when a hook loop exits + virtual void SetCurResPtr(META_RES *mres) = 0; //!< Sets pointer to the current meta result + virtual void SetPrevResPtr(META_RES *mres) = 0; //!< Sets pointer to previous meta result + virtual void SetStatusPtr(META_RES *mres) = 0; //!< Sets pointer to the status variable + virtual void SetIfacePtrPtr(void **pp) = 0; //!< Sets pointer to the interface this pointer + virtual void SetOrigRetPtr(const void *ptr) = 0; //!< Sets the original return pointer + virtual void SetOverrideRetPtr(void *ptr) = 0; //!< Sets the override result pointer + virtual bool ShouldContinue() = 0; //!< Returns false if the hook loop should exit + + /** + * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. + * + * @param plug The owner of the hook manager + * @param pubFunc The hook manager's info function + */ + virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) = 0; + + virtual void DoRecall() = 0; //!< Initiates a recall sequence + /* + HOW RECALLS WORK: + + The problem: + Users want the ability to change parameters of the called function + from inside their handler. + The solution: + 1) Mark as "recall" + 2) Recall the function + 3) => SH's hook func gets called: + 4) The first iterator points at the first hook the last hookfunc didn't execute yet + 5) does all iteration and returns normally + 6) The user's handler returns immediately + 7) The hook func returns immediately as well + + Also note that the recalled hookfunc starts with the status the recalling hookfunc + ended with. The last handler (doing the recall) is also able to specify its own + META_RES. + */ + + virtual void *GetOverrideRetPtr() = 0; //!< Returns the pointer set by SetOverrideRetPtr + + /** + * @brief Set up the hook loop. Equivalent to calling: + * SetStatusPtr, SetPrevResPtr, SetCurResPtr, SetIfacePtrPtr, SetOrigRetPtr, Get/SetOverrideRetPtr + * + * @param statusPtr pointer to status variable + * @param prevResPtr pointer to previous result variable + * @param curResPtr pointer to current result variable + * @param ifacePtrPtr pointer to interface this pointer variable + * @param origRetPr pointer to original return value variable. NULL for void funcs + * @param overrideRetPtr pointer to override return value variable. NULL for void funcs + * + * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr + * when the hook func is being called as part of a recall + */ + virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, + void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; + + //!< + }; + + // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: + // These have to be able to return references. If T is a reference, the pointers returned + // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. + template struct MacroRefHelpers + { + inline static const T* GetOrigRet(ISourceHook *shptr) + { + return reinterpret_cast(shptr->GetOrigRet()); + } + inline static const T* GetOverrideRet(ISourceHook *shptr) + { + return reinterpret_cast(shptr->GetOverrideRet()); + } + }; + + template struct MacroRefHelpers + { + inline static T* GetOrigRet(ISourceHook *shptr) + { + T &ref = *reinterpret_cast::type *>(shptr->GetOrigRet()); + return &ref; + } + inline static T* GetOverrideRet(ISourceHook *shptr) + { + T &ref = *reinterpret_cast::type *>(shptr->GetOverrideRet()); + return &ref; + } + }; +} + +/************************************************************************/ +/* High level interface */ +/************************************************************************/ +#define META_RESULT_STATUS SH_GLOB_SHPTR->GetStatus() +#define META_RESULT_PREVIOUS SH_GLOB_SHPTR->GetPrevRes() +#define META_RESULT_ORIG_RET(type) *SourceHook::MacroRefHelpers::GetOrigRet(SH_GLOB_SHPTR) +#define META_RESULT_OVERRIDE_RET(type) *SourceHook::MacroRefHelpers::GetOverrideRet(SH_GLOB_SHPTR) +#define META_IFACEPTR(type) reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()) + +#define SET_META_RESULT(result) SH_GLOB_SHPTR->SetRes(result) +#define RETURN_META(result) do { SET_META_RESULT(result); return; } while(0) +#define RETURN_META_VALUE(result, value) do { SET_META_RESULT(result); return (value); } while(0) + +// If a hook on a function which returns a reference does not want to specify a return value, +// it can use this macro. +// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! +#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) + +// only call these from the hook handlers directly! +// :TODO: enforce it ? + +// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? +// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE + +// SourceHook::SetOverrideRet is defined later. +#define RETURN_META_NEWPARAMS(result, memfuncptr, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams; \ + RETURN_META(MRES_SUPERCEDE); \ + } while (0) + +#define RETURN_META_VALUE_NEWPARAMS(result, value, memfuncptr, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + if ((result) >= MRES_OVERRIDE) \ + { \ + /* meh, set the override result here because we don't get a chance to return */ \ + /* before continuing the hook loop through the recall */ \ + SourceHook::SetOverrideResult(memfuncptr)(SH_GLOB_SHPTR, value); \ + } \ + RETURN_META_VALUE(MRES_SUPERCEDE, \ + (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams); \ + } while (0) + +// :TODO: thisptroffs in MNEWPARAMS ?? + +#if SH_COMP == SH_COMP_MSVC + +#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ + union \ + { \ + SH_MFHCls(hookname)::ECMFP mfp; \ + void *addr; \ + } u; \ + SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ + u.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ + SH_MFHCls(hookname)::ms_MFI.vtblindex]; + +#elif SH_COMP == SH_COMP_GCC + +#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ + union \ + { \ + SH_MFHCls(hookname)::ECMFP mfp; \ + struct \ + { \ + void *addr; \ + intptr_t adjustor; \ + } s; \ + } u; \ + SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ + u.s.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ + SH_MFHCls(hookname)::ms_MFI.vtblindex]; \ + u.s.adjustor = 0; + +#endif + +#define RETURN_META_MNEWPARAMS(result, hookname, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ + (thisptr->*(u.mfp)) newparams; \ + RETURN_META(MRES_SUPERCEDE); \ + } while (0) + +#define RETURN_META_VALUE_MNEWPARAMS(result, value, hookname, newparams) \ + do { \ + SET_META_RESULT(result); \ + SH_GLOB_SHPTR->DoRecall(); \ + if ((result) >= MRES_OVERRIDE) \ + { \ + /* see RETURN_META_VALUE_NEWPARAMS */ \ + SourceHook::SetOverrideResult(SH_GLOB_SHPTR, value); \ + } \ + SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ + RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ + } while (0) + +/** +* @brief Get/generate callclass for an interface pointer +* +* @param ifaceptr The interface pointer +*/ +template +inline SourceHook::CallClass *SH_GET_CALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr) +{ + return reinterpret_cast*>( + shptr->GetCallClass(reinterpret_cast(ptr), sizeof(ifacetype))); +} + +template +inline SourceHook::CallClass *SH_GET_MCALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr, int ifacesize) +{ + return reinterpret_cast*>( + shptr->GetCallClass(reinterpret_cast(ptr), ifacesize)); +} + +template +inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::CallClass *ptr) +{ + shptr->ReleaseCallClass(reinterpret_cast(ptr)); +} + +#define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ + do { \ + SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ + SH_MFHCls(hookname)::ms_MFI.thisptroffs = pthisptroffs; \ + SH_MFHCls(hookname)::ms_MFI.vtblindex = pvtblindex; \ + SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ + } while (0) + +#define SH_GET_CALLCLASS(ptr) SH_GET_CALLCLASS_R(SH_GLOB_SHPTR, ptr) +#define SH_GET_MCALLCLASS(ptr, size) SH_GET_MCALLCLASS_R(SH_GLOB_SHPTR, reinterpret_cast(ptr), size) +#define SH_RELEASE_CALLCLASS(ptr) SH_RELEASE_CALLCLASS_R(SH_GLOB_SHPTR, ptr) + +#define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ + __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ + post, handler) +#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + +#define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ + __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ + post, handler) +#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + + +#define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ + __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) +#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + +#define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ + __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) +#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) +#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + + +#define SH_NOATTRIB + + + + +#if SH_COMP == SH_COMP_MSVC +# define SH_SETUP_MFP(mfp) \ + reinterpret_cast(&mfp)[0] = vfnptr_origentry; +#elif SH_COMP == SH_COMP_GCC +# define SH_SETUP_MFP(mfp) \ + reinterpret_cast(&mfp)[0] = vfnptr_origentry; \ + reinterpret_cast(&mfp)[1] = 0; +#else +# error Not supported yet. +#endif + +////////////////////////////////////////////////////////////////////////// +#define SH_FHCls(ift, iff, ov) __SourceHook_FHCls_##ift##iff##ov +#define SH_MFHCls(hookname) __SourceHook_MFHCls_##hookname + +#define SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) \ + SH_FHCls(ifacetype,ifacefunc,overload)() \ + { \ + GetFuncInfo(funcptr, ms_MFI); \ + } \ + \ + static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ + { \ + using namespace ::SourceHook; \ + GetFuncInfo(funcptr, ms_MFI); \ + /* Verify interface version */ \ + if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ + return 1; \ + \ + if (action == HA_GetInfo) \ + { \ + param->SetVersion(SH_HOOKMAN_VERSION); \ + param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ + reinterpret_cast(&ms_Proto)); \ + \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(&SH_FHCls(ifacetype,ifacefunc,overload)::Func, mfi); \ + param->SetHookfuncVfnptr( \ + reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ + return 0; \ + } \ + else if (action == HA_Register) \ + { \ + ms_HI = param; \ + return 0; \ + } \ + else if (action == HA_Unregister) \ + { \ + ms_HI = NULL; \ + return 0; \ + } \ + else \ + return 1; \ + } + +// It has to be possible to use the macros in namespaces +// -> So we need to access and extend the global SourceHook namespace +// We use a namespace alias for this +#define SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, funcptr) \ + struct SH_FHCls(ifacetype,ifacefunc,overload) \ + { \ + static SH_FHCls(ifacetype,ifacefunc,overload) ms_Inst; \ + static ::SourceHook::MemFuncInfo ms_MFI; \ + static ::SourceHook::IHookManagerInfo *ms_HI; \ + static ::SourceHook::ProtoInfo ms_Proto; \ + SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) + +#define SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, funcptr) \ + }; \ + SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ + ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ + ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ + bool __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ + SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ + { \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(funcptr, mfi); \ + if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ + return false; /* No non-virtual functions / virtual inheritance supported */ \ + \ + return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ + SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ + new CSHDelegate(handler), post); \ + } \ + bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ + SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ + { \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(funcptr, mfi); \ + if (mfi.thisptroffs < 0) \ + return false; /* No virtual inheritance supported */ \ + \ + CSHDelegate tmp(handler); \ + return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ + SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, &tmp, post); \ + } \ + +#define SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ + struct SH_MFHCls(hookname) \ + { \ + static SH_MFHCls(hookname) ms_Inst; \ + static ::SourceHook::MemFuncInfo ms_MFI; \ + static ::SourceHook::IHookManagerInfo *ms_HI; \ + static ::SourceHook::ProtoInfo ms_Proto; \ + \ + SH_MFHCls(hookname)() \ + { \ + ms_MFI.isVirtual = true; \ + ms_MFI.thisptroffs = pthisptroffs; \ + ms_MFI.vtblindex = pvtblidx; \ + ms_MFI.vtbloffs = pvtbloffs; \ + } \ + static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ + { \ + using namespace ::SourceHook; \ + /* we don't set ms_MFI here because manual hookmans can be reconfigured */ \ + /* :FIXME: possible problem: someone adding a hook from a constructor of a global entity */ \ + /* which is construced before SH_MFHCls(hookname)() gets called? */ \ + /* Verify interface version */ \ + if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ + return 1; \ + \ + if (action == HA_GetInfo) \ + { \ + param->SetVersion(SH_HOOKMAN_VERSION); \ + param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ + reinterpret_cast(&ms_Proto)); \ + \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(&SH_MFHCls(hookname)::Func, mfi); \ + param->SetHookfuncVfnptr( \ + reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ + return 0; \ + } \ + else if (action == HA_Register) \ + { \ + ms_HI = param; \ + return 0; \ + } \ + else if (action == HA_Unregister) \ + { \ + ms_HI = NULL; \ + return 0; \ + } \ + else \ + return 1; \ + } + +#define SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ + }; \ + SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ + ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ + ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ + bool __SourceHook_FHMAdd##hookname(void *iface, bool post, \ + SH_MFHCls(hookname)::FD handler) \ + { \ + return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ + SH_MFHCls(hookname)::HookManPubFunc, \ + new ::SourceHook::CSHDelegate(handler), post); \ + } \ + bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ + SH_MFHCls(hookname)::FD handler) \ + { \ + ::SourceHook::CSHDelegate tmp(handler); \ + return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ + SH_MFHCls(hookname)::HookManPubFunc, &tmp, post); \ + } \ + + +#define SH_SETUPCALLS(rettype, paramtypes, params) \ + /* 1) Find the vfnptr */ \ + using namespace ::SourceHook; \ + void *ourvfnptr = reinterpret_cast( \ + *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ + IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ + SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ + \ + void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ + /* ... and the iface */ \ + IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ + if (!ifinfo) \ + { \ + /* The iface info was not found. Redirect the call to the original function. */ \ + rettype (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + return (reinterpret_cast(this)->*mfp)params; \ + } \ + /* 2) Declare some vars and set it up */ \ + SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ + IHookList *prelist = ifinfo->GetPreHooks(); \ + IHookList *postlist = ifinfo->GetPostHooks(); \ + META_RES status = MRES_IGNORED; \ + META_RES prev_res; \ + META_RES cur_res; \ + typedef ReferenceCarrier::type my_rettype; \ + my_rettype orig_ret; \ + my_rettype override_ret; \ + my_rettype plugin_ret; \ + void* ifptr; \ + my_rettype *pOverrideRet = reinterpret_cast(SH_GLOB_SHPTR->SetupHookLoop( \ + &status, &prev_res, &cur_res, &ifptr, &orig_ret, &override_ret)); + +#define SH_CALL_HOOKS(post, params) \ + if (SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + prev_res = MRES_IGNORED; \ + for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ + { \ + cur_res = MRES_IGNORED; \ + ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ + plugin_ret = reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ + prev_res = cur_res; \ + if (cur_res > status) \ + status = cur_res; \ + if (cur_res >= MRES_OVERRIDE) \ + *pOverrideRet = plugin_ret; \ + if (!SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + iter.SetToZero(); \ + break; \ + } \ + } \ + } + +#define SH_CALL_ORIG(rettype, paramtypes, params) \ + if (status != MRES_SUPERCEDE) \ + { \ + rettype (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + orig_ret = (reinterpret_cast(this)->*mfp)params; \ + } \ + else \ + orig_ret = override_ret; \ + +#define SH_RETURN() \ + SH_GLOB_SHPTR->HookLoopEnd(); \ + return status >= MRES_OVERRIDE ? *pOverrideRet : orig_ret; + +#define SH_HANDLEFUNC(paramtypes, params, rettype) \ + SH_SETUPCALLS(rettype, paramtypes, params) \ + SH_CALL_HOOKS(pre, params) \ + SH_CALL_ORIG(rettype, paramtypes, params) \ + SH_CALL_HOOKS(post, params) \ + SH_RETURN() + +////////////////////////////////////////////////////////////////////////// +#define SH_SETUPCALLS_void(paramtypes, params) \ + /* 1) Find the vfnptr */ \ + using namespace ::SourceHook; \ + void *ourvfnptr = reinterpret_cast( \ + *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ + IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ + SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ + \ + void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ + /* ... and the iface */ \ + IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ + if (!ifinfo) \ + { \ + /* The iface info was not found. Redirect the call to the original function. */ \ + void (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + (reinterpret_cast(this)->*mfp)params; \ + return; \ + } \ + /* 2) Declare some vars and set it up */ \ + SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ + IHookList *prelist = ifinfo->GetPreHooks(); \ + IHookList *postlist = ifinfo->GetPostHooks(); \ + META_RES status = MRES_IGNORED; \ + META_RES prev_res; \ + META_RES cur_res; \ + void* ifptr; \ + SH_GLOB_SHPTR->SetupHookLoop(&status, &prev_res, &cur_res, &ifptr, NULL, NULL); \ + +#define SH_CALL_HOOKS_void(post, params) \ + if (SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + prev_res = MRES_IGNORED; \ + for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ + { \ + cur_res = MRES_IGNORED; \ + ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ + reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ + prev_res = cur_res; \ + if (cur_res > status) \ + status = cur_res; \ + if (!SH_GLOB_SHPTR->ShouldContinue()) \ + { \ + iter.SetToZero(); \ + break; \ + } \ + } \ + } + +#define SH_CALL_ORIG_void(paramtypes, params) \ + if (status != MRES_SUPERCEDE) \ + { \ + void (EmptyClass::*mfp)paramtypes; \ + SH_SETUP_MFP(mfp); \ + (reinterpret_cast(this)->*mfp)params; \ + } + +#define SH_RETURN_void() \ + SH_GLOB_SHPTR->HookLoopEnd(); + +#define SH_HANDLEFUNC_void(paramtypes, params) \ + SH_SETUPCALLS_void(paramtypes, params) \ + SH_CALL_HOOKS_void(pre, params) \ + SH_CALL_ORIG_void(paramtypes, params) \ + SH_CALL_HOOKS_void(post, params) \ + SH_RETURN_void() + + +// Special vafmt handlers +// :TODO: what +#define SH_HANDLEFUNC_vafmt(paramtypes, params_orig, params_plug, rettype) \ + SH_SETUPCALLS(rettype, paramtypes, params_orig) \ + SH_CALL_HOOKS(pre, params_plug) \ + SH_CALL_ORIG(rettype, paramtypes, params_orig) \ + SH_CALL_HOOKS(post, params_plug) \ + SH_RETURN() + +#define SH_HANDLEFUNC_void_vafmt(paramtypes, params_orig, params_plug) \ + SH_SETUPCALLS_void(paramtypes, params_orig) \ + SH_CALL_HOOKS_void(pre, params_plug) \ + SH_CALL_ORIG_void(paramtypes, params_orig) \ + SH_CALL_HOOKS_void(post, params_plug) \ + SH_RETURN_void() + +////////////////////////////////////////////////////////////////////////// + +// :FIXME: +// sizeof on references returns the size of the datatype, NOT the pointer size or something +// -> one should probably flag references in __SourceHook_ParamSizes_* ! +// or simply assume that their size is sizeof(void*)=SH_PTRSIZE... could be doable through a simple template + + +// ********* Support for 0 arguments ********* +#define SH_DECL_HOOK0(ifacetype, ifacefunc, attr, overload, rettype) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate0 FD; \ + virtual rettype Func() \ + { SH_HANDLEFUNC((), (), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK0_void(ifacetype, ifacefunc, attr, overload) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate0<> FD; \ + virtual void Func() \ + { SH_HANDLEFUNC_void((), ()); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK0_vafmt(ifacetype, ifacefunc, attr, overload, rettype) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual rettype Func(const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((...), ("%s", buf), (buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK0_void_vafmt(ifacetype, ifacefunc, attr, overload) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual void Func(const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((...), ("%s", buf), (buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK0(hookname, vtblidx, vtbloffs, thisptroffs, rettype) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate0 FD; \ + virtual rettype Func() \ + { SH_HANDLEFUNC((), (), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 0, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK0_void(hookname, vtblidx, vtbloffs, thisptroffs) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate0<> FD; \ + virtual void Func() \ + { SH_HANDLEFUNC_void((), ()); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 0, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 1 arguments ********* +#define SH_DECL_HOOK1(ifacetype, ifacefunc, attr, overload, rettype, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual rettype Func(param1 p1) \ + { SH_HANDLEFUNC((param1), (p1), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK1_void(ifacetype, ifacefunc, attr, overload, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual void Func(param1 p1) \ + { SH_HANDLEFUNC_void((param1), (p1)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK1_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual rettype Func(param1 p1, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, ...), (p1, "%s", buf), (p1, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK1_void_vafmt(ifacetype, ifacefunc, attr, overload, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual void Func(param1 p1, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, ...), (p1, "%s", buf), (p1, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK1(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual rettype Func(param1 p1) \ + { SH_HANDLEFUNC((param1), (p1), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 1, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK1_void(hookname, vtblidx, vtbloffs, thisptroffs, param1) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate1 FD; \ + virtual void Func(param1 p1) \ + { SH_HANDLEFUNC_void((param1), (p1)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 1, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 2 arguments ********* +#define SH_DECL_HOOK2(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual rettype Func(param1 p1, param2 p2) \ + { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK2_void(ifacetype, ifacefunc, attr, overload, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual void Func(param1 p1, param2 p2) \ + { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK2_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual rettype Func(param1 p1, param2 p2, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK2_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual void Func(param1 p1, param2 p2, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK2(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual rettype Func(param1 p1, param2 p2) \ + { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 2, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK2_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate2 FD; \ + virtual void Func(param1 p1, param2 p2) \ + { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 2, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 3 arguments ********* +#define SH_DECL_HOOK3(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3) \ + { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK3_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3) \ + { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK3_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK3_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK3(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3) \ + { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 3, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK3_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate3 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3) \ + { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 3, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 4 arguments ********* +#define SH_DECL_HOOK4(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ + { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK4_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK4_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK4_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK4(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ + { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 4, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK4_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate4 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 4, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 5 arguments ********* +#define SH_DECL_HOOK5(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK5_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK5_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK5_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK5(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 5, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK5_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate5 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 5, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 6 arguments ********* +#define SH_DECL_HOOK6(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK6_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK6_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK6_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK6(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 6, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK6_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate6 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 6, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 7 arguments ********* +#define SH_DECL_HOOK7(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK7_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK7_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK7_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK7(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 7, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK7_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate7 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 7, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 8 arguments ********* +#define SH_DECL_HOOK8(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK8_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK8_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK8_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK8(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 8, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK8_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate8 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 8, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 9 arguments ********* +#define SH_DECL_HOOK9(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK9_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK9_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK9_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK9(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 9, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK9_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate9 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 9, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 10 arguments ********* +#define SH_DECL_HOOK10(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK10_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK10_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK10_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK10(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 10, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK10_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate10 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 10, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 11 arguments ********* +#define SH_DECL_HOOK11(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK11_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK11_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK11_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK11(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 11, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK11_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate11 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 11, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 12 arguments ********* +#define SH_DECL_HOOK12(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK12_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK12_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK12_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK12(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 12, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK12_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate12 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 12, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 13 arguments ********* +#define SH_DECL_HOOK13(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK13_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK13_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK13_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK13(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 13, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK13_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate13 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 13, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 14 arguments ********* +#define SH_DECL_HOOK14(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK14_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK14_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK14_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK14(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 14, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK14_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate14 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 14, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 15 arguments ********* +#define SH_DECL_HOOK15(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK15_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK15_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK15_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK15(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 15, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK15_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate15 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 15, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 16 arguments ********* +#define SH_DECL_HOOK16(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK16_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK16_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK16_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK16(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 16, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK16_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate16 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 16, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 17 arguments ********* +#define SH_DECL_HOOK17(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK17_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK17_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK17_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK17(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 17, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK17_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate17 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 17, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 18 arguments ********* +#define SH_DECL_HOOK18(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK18_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK18_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK18_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK18(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 18, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK18_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate18 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 18, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 19 arguments ********* +#define SH_DECL_HOOK19(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK19_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK19_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK19_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK19(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 19, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK19_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate19 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 19, __SourceHook_ParamSizesM_##hookname); \ + + +// ********* Support for 20 arguments ********* +#define SH_DECL_HOOK20(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK20_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK20_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate21 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf), rettype); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ + 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_HOOK20_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ + (&ifacetype::ifacefunc))) \ + typedef fastdelegate::FastDelegate21 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ + { \ + char buf[::SourceHook::STRBUF_LEN]; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(buf, sizeof(buf), fmt, ap); \ + va_end(ap); \ + SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf)); \ + } \ + SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ + (static_cast(&ifacetype::ifacefunc))) \ + \ + const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ + 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); + +#define SH_DECL_MANUALHOOK20(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ + { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ + typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ + typedef rettype RetType; \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ + 20, __SourceHook_ParamSizesM_##hookname); \ + +#define SH_DECL_MANUALHOOK20_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ + SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + typedef fastdelegate::FastDelegate20 FD; \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ + { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ + typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ + SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ + \ + const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ + ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ + 20, __SourceHook_ParamSizesM_##hookname); \ + + + + +////////////////////////////////////////////////////////////////////////// +// SH_CALL + +#if SH_COMP == SH_COMP_MSVC + +# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ + void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ + if (!origfunc) \ + return (m_CC->GetThisPtr()->*m_MFP)call; \ + \ + /* It's hooked. Call the original function. */ \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + void *addr; \ + } u; \ + u.addr = origfunc; \ + \ + void *adjustedthisptr = reinterpret_cast(reinterpret_cast(m_CC->GetThisPtr()) + mfi.thisptroffs); \ + return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ +} + +# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + char *adjustedthisptr = reinterpret_cast(m_CC->GetThisPtr()) + m_ThisPtrOffs; \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + void *addr; \ + } u; \ + u.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ + if (!u.addr) \ + u.addr = (*reinterpret_cast(adjustedthisptr + m_VtblOffs))[m_VtblIdx]; \ + \ + return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ +} + +#elif SH_COMP == SH_COMP_GCC + +# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ + void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ + if (!origfunc) \ + return (m_CC->GetThisPtr()->*m_MFP)call; \ + \ + /* It's hooked. Call the original function. */ \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + struct \ + { \ + void *addr; \ + intptr_t adjustor; \ + } s; \ + } u; \ + u.s.addr = origfunc; \ + u.s.adjustor = mfi.thisptroffs; \ + \ + return (reinterpret_cast(m_CC->GetThisPtr())->*u.mfpnew)call; \ +} + +# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ +{ \ + using namespace ::SourceHook; \ + char *thisptr = reinterpret_cast(m_CC->GetThisPtr()); \ + union \ + { \ + RetType(EmptyClass::*mfpnew)prms; \ + struct { \ + void *addr; \ + intptr_t adjustor; \ + } s; \ + } u; \ + u.s.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ + if (!u.s.addr) \ + u.s.addr = (*reinterpret_cast(thisptr + m_ThisPtrOffs + m_VtblOffs))[m_VtblIdx]; \ + \ + u.s.adjustor = m_ThisPtrOffs; \ + return (reinterpret_cast(thisptr)->*u.mfpnew)call; \ +} + +#endif + +namespace SourceHook +{ + + // Support for 0 arguments + template class ExecutableClass0 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass0(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()() const + SH_MAKE_EXECUTABLECLASS_OB((), ()) + + + template RetType operator()(Param1 p1) const + SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) + + template RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass0 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass0(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()() const + SH_MAKE_MEXECUTABLECLASS_OB((), ()) + + + template RetType operator()(Param1 p1) const + SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) + + template RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 1 arguments + template class ExecutableClass1 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass1(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1) const + SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) + + + template RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass1 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass1(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1) const + SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) + + + template RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 2 arguments + template class ExecutableClass2 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass2(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass2 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass2(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 3 arguments + template class ExecutableClass3 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass3(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass3 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass3(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 4 arguments + template class ExecutableClass4 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass4(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass4 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass4(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 5 arguments + template class ExecutableClass5 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass5(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass5 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass5(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 6 arguments + template class ExecutableClass6 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass6(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass6 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass6(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 7 arguments + template class ExecutableClass7 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass7(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass7 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass7(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 8 arguments + template class ExecutableClass8 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass8(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass8 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass8(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 9 arguments + template class ExecutableClass9 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass9(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass9 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass9(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 10 arguments + template class ExecutableClass10 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass10(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass10 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass10(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 11 arguments + template class ExecutableClass11 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass11(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass11 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass11(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 12 arguments + template class ExecutableClass12 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass12(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass12 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass12(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 13 arguments + template class ExecutableClass13 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass13(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass13 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass13(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 14 arguments + template class ExecutableClass14 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass14(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass14 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass14(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 15 arguments + template class ExecutableClass15 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass15(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass15 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass15(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 16 arguments + template class ExecutableClass16 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass16(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass16 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass16(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 17 arguments + template class ExecutableClass17 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass17(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass17 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass17(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 18 arguments + template class ExecutableClass18 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass18(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass18 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass18(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 19 arguments + template class ExecutableClass19 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass19(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + template class MExecutableClass19 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass19(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + + // Support for 20 arguments + template class ExecutableClass20 + { + CCType *m_CC; + MFPType m_MFP; + public: + ExecutableClass20(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + + }; + + template class MExecutableClass20 + { + ManualCallClass *m_CC; + int m_ThisPtrOffs; + int m_VtblIdx; + int m_VtblOffs; + public: + MExecutableClass20(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), + m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } + + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + + }; + + +} + +// SH_CALL needs to deduce the return type -> it uses templates and function overloading +// That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP +// The only purpose of the mfp2 parameter is to extract the return type + + +// Support for 0 arguments +template +SourceHook::ExecutableClass0, MFP, RetType> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()) +{ + return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); +} + +template +SourceHook::ExecutableClass0, MFP, RetType> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()const) +{ + return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); +} + +template +SourceHook::MExecutableClass0 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass0(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 1 arguments +template +SourceHook::ExecutableClass1, MFP, RetType, Param1> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)) +{ + return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); +} + +template +SourceHook::ExecutableClass1, MFP, RetType, Param1> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const) +{ + return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); +} + +template +SourceHook::MExecutableClass1 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass1(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 2 arguments +template +SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)) +{ + return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); +} + +template +SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const) +{ + return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); +} + +template +SourceHook::MExecutableClass2 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass2(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 3 arguments +template +SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)) +{ + return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); +} + +template +SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const) +{ + return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); +} + +template +SourceHook::MExecutableClass3 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass3(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 4 arguments +template +SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)) +{ + return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); +} + +template +SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const) +{ + return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); +} + +template +SourceHook::MExecutableClass4 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass4(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 5 arguments +template +SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)) +{ + return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); +} + +template +SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const) +{ + return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); +} + +template +SourceHook::MExecutableClass5 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass5(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 6 arguments +template +SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)) +{ + return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); +} + +template +SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const) +{ + return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); +} + +template +SourceHook::MExecutableClass6 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass6(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 7 arguments +template +SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) +{ + return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); +} + +template +SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const) +{ + return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); +} + +template +SourceHook::MExecutableClass7 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass7(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 8 arguments +template +SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) +{ + return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); +} + +template +SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const) +{ + return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); +} + +template +SourceHook::MExecutableClass8 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass8(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 9 arguments +template +SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) +{ + return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); +} + +template +SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const) +{ + return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); +} + +template +SourceHook::MExecutableClass9 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass9(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 10 arguments +template +SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) +{ + return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); +} + +template +SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const) +{ + return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); +} + +template +SourceHook::MExecutableClass10 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass10(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 11 arguments +template +SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) +{ + return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); +} + +template +SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const) +{ + return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); +} + +template +SourceHook::MExecutableClass11 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass11(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 12 arguments +template +SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) +{ + return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); +} + +template +SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const) +{ + return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); +} + +template +SourceHook::MExecutableClass12 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass12(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 13 arguments +template +SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) +{ + return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); +} + +template +SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const) +{ + return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); +} + +template +SourceHook::MExecutableClass13 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass13(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 14 arguments +template +SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) +{ + return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); +} + +template +SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const) +{ + return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); +} + +template +SourceHook::MExecutableClass14 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass14(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 15 arguments +template +SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) +{ + return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); +} + +template +SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const) +{ + return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); +} + +template +SourceHook::MExecutableClass15 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass15(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 16 arguments +template +SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) +{ + return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); +} + +template +SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const) +{ + return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); +} + +template +SourceHook::MExecutableClass16 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass16(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 17 arguments +template +SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) +{ + return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); +} + +template +SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const) +{ + return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); +} + +template +SourceHook::MExecutableClass17 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass17(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 18 arguments +template +SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) +{ + return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); +} + +template +SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const) +{ + return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); +} + +template +SourceHook::MExecutableClass18 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass18(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 19 arguments +template +SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) +{ + return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); +} + +template +SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const) +{ + return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); +} + +template +SourceHook::MExecutableClass19 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass19(ptr, vtbloffs, vtblidx, thisptroffs); +} + +// Support for 20 arguments +template +SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) +{ + return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); +} + +template +SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const) +{ + return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); +} + +template +SourceHook::MExecutableClass20 +SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs) +{ + return SourceHook::MExecutableClass20(ptr, vtbloffs, vtblidx, thisptroffs); +} + + +#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 +// GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it + + +// Support for 0 arguments +template +SourceHook::ExecutableClass0, MFP, RetType> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)) +{ + return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); +} + +template +SourceHook::ExecutableClass0, MFP, RetType> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)const) +{ + return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); +} + + +// Support for 1 arguments +template +SourceHook::ExecutableClass1, MFP, RetType, Param1> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)) +{ + return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); +} + +template +SourceHook::ExecutableClass1, MFP, RetType, Param1> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const) +{ + return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); +} + + +// Support for 2 arguments +template +SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)) +{ + return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); +} + +template +SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const) +{ + return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); +} + + +// Support for 3 arguments +template +SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)) +{ + return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); +} + +template +SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const) +{ + return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); +} + + +// Support for 4 arguments +template +SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)) +{ + return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); +} + +template +SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const) +{ + return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); +} + + +// Support for 5 arguments +template +SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)) +{ + return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); +} + +template +SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const) +{ + return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); +} + + +// Support for 6 arguments +template +SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)) +{ + return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); +} + +template +SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const) +{ + return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); +} + + +// Support for 7 arguments +template +SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)) +{ + return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); +} + +template +SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const) +{ + return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); +} + + +// Support for 8 arguments +template +SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)) +{ + return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); +} + +template +SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const) +{ + return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); +} + + +// Support for 9 arguments +template +SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)) +{ + return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); +} + +template +SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const) +{ + return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); +} + + +// Support for 10 arguments +template +SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)) +{ + return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); +} + +template +SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const) +{ + return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); +} + + +// Support for 11 arguments +template +SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)) +{ + return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); +} + +template +SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const) +{ + return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); +} + + +// Support for 12 arguments +template +SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)) +{ + return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); +} + +template +SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const) +{ + return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); +} + + +// Support for 13 arguments +template +SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)) +{ + return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); +} + +template +SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const) +{ + return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); +} + + +// Support for 14 arguments +template +SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)) +{ + return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); +} + +template +SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const) +{ + return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); +} + + +// Support for 15 arguments +template +SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)) +{ + return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); +} + +template +SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const) +{ + return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); +} + + +// Support for 16 arguments +template +SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)) +{ + return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); +} + +template +SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const) +{ + return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); +} + + +// Support for 17 arguments +template +SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)) +{ + return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); +} + +template +SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const) +{ + return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); +} + + +// Support for 18 arguments +template +SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)) +{ + return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); +} + +template +SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const) +{ + return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); +} + + +// Support for 19 arguments +template +SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)) +{ + return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); +} + +template +SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const) +{ + return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); +} + + +// Support for 20 arguments +template +SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)) +{ + return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); +} + +template +SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const) +{ + return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); +} + + + +#endif + +#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp)) +#define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ + SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) + +#undef SH_MAKE_EXECUTABLECLASS_OB + +////////////////////////////////////////////////////////////////////////// +// SetOverrideRet and RecallGetIface for recalls +// These take a ISourceHook pointer instead of using SH_GLOB_SHPTR directly +// The reason is that the user may want to redefine SH_GLOB_SHPTR - then the macros +// (META_RETURN_VALUE_NEWPARAMS) should obey the new pointer. + +namespace SourceHook +{ + template + void SetOverrideResult(ISourceHook *shptr, const RetType res) + { + *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; + } + + // SetOverrideResult used to be implemented like this: + // SetOverrideResult(shptr, memfuncptr, return); + // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference + // (it thought it was ambigous - the ref and non-ref type) + // so now SetOverrideResult(memfuncptr) deduces the ret type, and returns a functor which does the work + // new syntax: SetOverrideResult(memfuncptr)(shptr, return) + // This also allows us to create a special version for references which respects ReferenceCarrier. + + template struct OverrideFunctor + { + void operator()(ISourceHook *shptr, T res) + { + *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; + } + }; + template struct OverrideFunctor + { + void operator()(ISourceHook *shptr, T &res) + { + // overrideretptr points to ReferenceCarrier + *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; + } + }; + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)()) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)()) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + + template + OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + { + return OverrideFunctor(); + } + + template + Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + { + return reinterpret_cast(shptr->GetIfacePtr()); + } + +} + +#endif + // The pope is dead. -> :( diff --git a/sourcehook/sourcehook_impl.h b/sourcehook/sourcehook_impl.h new file mode 100644 index 0000000..eee3ad6 --- /dev/null +++ b/sourcehook/sourcehook_impl.h @@ -0,0 +1,656 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +#ifndef __SOURCEHOOK_IMPL_H__ +#define __SOURCEHOOK_IMPL_H__ + +#include "sourcehook.h" +#include "sh_list.h" +#include "sh_vector.h" +#include "sh_tinyhash.h" +#include "sh_stack.h" + +/* + +IMPLEMENTATION INFO + +--------------------------------------- +Protos ("Prototypes") + The purpose of protos is to provide the amount of type information about a function + which is required to be able to execute a function call without corrupting the stack. + Our protos do not fully do this, but they provide the size of the return value, the number of + parameters, and the size of each parameter, which is enough for most situations. + + There are two version of protos: + OLD: + C-Style strings. + + 0_void: + "attrib" + 1_void: + "attrib|param1_type" + 2_void: + "attrib|param1_type|param2_type + 0: + "attrib|ret_type" + 1: + "attrib|ret_type|param1_type" + 2: + "attrib|ret_type|param2_type" + + Old protos are deprecated. + + NEW: + New protos are in fact pointers to the ProtoInfo structure (see sourcehook.h) + + Old protos begin with a non-zero byte, new protos begin with a zero byte. + + Protos are usually stored in a CProto instance. + +--------------------------------------- +Hook managers and hook manager containers + Each hookman container is tied to _one_ proto/vtable index/vtable offset info. + Hookman containers then contain a list of hook managers provided by plugins, sorted by version. + (higher versions come first) + + Duplicate hook managers are ignored (ie. hook managers where proto, vtable index, vtable offset, + plugin, version are the same as in an already exisiting hook manager) + + A new hook manager is always added to the end of the version group in the corresponding + hook container. + + If the new hook manager was added to the beginning of the container (which only happens if + it is the first one or if it has a higher version than the previously first hook manager), + the now second hook manager is shut down and the new hook manager takes its job. + + A "hook manager container id" (HMCI) consits of three values: proto, vtbl index, vtbl offset. +--------------------------------------- +Hooks + When adding a hook, first the proposed hook manager is added to the corresponding + hook manager container as described above. + + Then the first hook manager in the the manhook container is chosen to handle the function. + + Removing a hook does not neccessarily unreigster the plugin's hook manager. In order to do this, + use RemoveHookManager or UnloadPlugin/ + + Hooks can be paused - they remain in memory but they are not called. In SH, the hook iterator + classes handle pausing transparently. + + The hook loop is supposed to call ShouldContinue before each iteration. This makes hook handlers + able to remove themselves. + +--------------------------------------- +Call classes + Call classes are identified by a this pointer and an instance size + + We use the instance size because a derived class instance and a base class instance could + have the same this pointers, and we want to avoid that the derived class + (which could be bigger) gets the same callclass as the base class (mainly if the + base class' callclass was requested first). + + Call classes are reference counted. + + The original function pointers are stored in a vector (in order to allow fast random access). + These vectors are stored as the value type of a hash. The key type is int and represents the + vtable offset. + + If the hash key doesn't exist or the vtblidx is out of range or the corresponding element in the + vector is NULL, there is no hook on that function. + +--------------------------------------- +Recalls + Recalls are used for the META_RETURN_(VALUE_)NEWPARAMS macros, ie. to change the parameters + in the hook loop on the fly. + + First, the macro calls DoRecall(), then it calls the function the hook is attached to -> it + calls the hookfunc. SourceHook makes sure that the newly invoked hook loop starts where the last + one left off and that status variables like status, previous result, override return are kept. + When this recurisvely called hookfunc returns, the macro returns what it returned + (using MRES_SUPERCEDE). CSourceHookImpl returns false from ShouldContinue so the original hook loop + is abandonned. + +Post Recalls + People wanted to be able to use META_RETURN_(VALUE_)NEWPARAMS from post hooks as well. Crazy people! + Anyway, for this, we have to know where a hook handler is. Is it executing pre or post hooks at the moment? + The only way we can know this is watching when it calls CHookList::GetIter(). So CHookList gets a new variable: + m_RequestedFlag. It also gets two new functions: RQFlagReset() and RQFlagGet(). + HookLoopBegin() calls RQFlagReset on both hooklists of the iface; then DoRecall() checks whether the postlist's + RQ flag is set. if yes, the hook loop is in post mode. + + So, what a about a recall in post mode? The first ShouldContinue returns false and sets Status to supercede. + This way the pre hooks and the function call will be skipped. Then, then next ShouldContinue returns true, so we get + into the post hooks. HA! + +Return Values in Post Recalls + The easy case is when we already have an override return value. In this case, the status register gets transferred, + and so does the override return pointer. So, basically, everything is ok. + + However, what happens if we don't? ie. the status register is on MRES_IGNORED? In this case we'd have to transfer the + orig ret value. But we can't: There's no way to tell the hookfunc: "Use this as orig ret pointer". It uses its own. + So, we emulate it. GetOrigRet will return the orig ret pointer from the old hook loop. If still no one overrides it, + we'd have to return it. BUT! HOW TO DO THIS? Check out SH_RETURN(). First calls HookLoopEnd(), then decides whether + to return the override retval or the orig retval. But it doesn't ask for a new override return. So we give the function + the last orig return value as its new override return value; but leave status where it is so everything works, and in + HookLoopEnd we make sure that status is high enough so that the override return will be returned. crazy. + + All this stuff could be much less complicated if I didn't try to preserve binary compatibility :) +*/ + +namespace SourceHook +{ + /** + * @brief The SourceHook implementation class + */ + class CSourceHookImpl : public ISourceHook + { + private: + class CProto + { + char *m_Proto; + + static bool Equal(const char *p1, const char *p2); + char *DupProto(const char *src); + void FreeProto(char *prot); + public: + CProto(const char *szProto) : m_Proto(DupProto(szProto)) + { + } + + CProto(const CProto &other) : m_Proto(DupProto(other.m_Proto)) + { + } + + ~CProto() + { + FreeProto(m_Proto); + m_Proto = NULL; + } + + void operator = (const char *szProto) + { + m_Proto = DupProto(szProto); + } + + void operator = (const CProto &other) + { + m_Proto = DupProto(other.m_Proto); + } + + bool operator == (const char *szProto) const + { + return Equal(szProto, m_Proto); + } + bool operator == (const CProto &other) const + { + return Equal(other.m_Proto, m_Proto); + } + }; + + + /** + * @brief A hook can be removed if you have this information + */ + struct RemoveHookInfo + { + RemoveHookInfo(Plugin pplug, void *piface, int tpo, HookManagerPubFunc phookman, + ISHDelegate *phandler, bool ppost) + : plug(pplug), iface(piface), thisptr_offs(tpo), + hookman(phookman), handler(phandler), post(ppost) + { + } + + Plugin plug; + void *iface; + int thisptr_offs; + HookManagerPubFunc hookman; + ISHDelegate *handler; + bool post; + }; + + struct RemoveHookManInfo + { + RemoveHookManInfo(Plugin pplug, HookManagerPubFunc phookman) + : plug(pplug), hookman(phookman) + { + } + + Plugin plug; + HookManagerPubFunc hookman; + }; + + struct HookInfo + { + ISHDelegate *handler; //!< Pointer to the handler + bool paused; //!< If true, the hook should not be executed + Plugin plug; //!< The owner plugin + int thisptr_offs; //!< This pointer offset + }; + + class CHookList : public IHookList + { + public: + List m_List; + + friend class CIter; + + class CIter : public IHookList::IIter + { + friend class CHookList; + + CHookList *m_pList; + + void SkipPaused(); + public: + + List::iterator m_Iter; + + CIter(CHookList *pList); + + virtual ~CIter(); + + void GoToBegin(); + void Set(CIter *pOther); + + bool End(); + void Next(); + ISHDelegate *Handler(); + int ThisPtrOffs(); + + void Clear(); + + CIter *m_pNext; // When stored in m_FreeIters and m_UsedIters + CIter *m_pPrev; // Only used when stored in m_UsedIters + }; + + CIter *m_FreeIters; + CIter *m_UsedIters; // The last returned and not-yet-released iter is always m_UsedIters + + // For recalls + bool m_Recall; + bool m_RQFlag; + + void SetRecallState(); // Sets the list into a state where the next returned + // iterator (from GetIter) will be a copy of the last + // returned iterator, incremented by one. This is used in Recalls. + // The hook resets this state automatically on: + // GetIter, ReleaseIter + + void RQFlagReset() { m_RQFlag = false; } + bool RQFlagGet() { return m_RQFlag; } + CHookList(); + CHookList(const CHookList &other); + virtual ~CHookList(); + + void operator=(const CHookList &other); + + IIter *GetIter(); + void ReleaseIter(IIter *pIter); + }; + + // I know, data hiding... But I'm a lazy bastard! + + class CIface : public IIface + { + public: + void *m_Ptr; + CHookList m_PreHooks; + CHookList m_PostHooks; + public: + CIface(void *ptr); + virtual ~CIface(); + + void *GetPtr(); + IHookList *GetPreHooks(); + IHookList *GetPostHooks(); + + bool operator==(void *ptr) + { + return m_Ptr == ptr; + } + }; + + class CVfnPtr : public IVfnPtr + { + public: + typedef List IfaceList; + typedef IfaceList::iterator IfaceListIter; + + void *m_Ptr; + void *m_OrigEntry; + + IfaceList m_Ifaces; + + public: + CVfnPtr(void *ptr); + virtual ~CVfnPtr(); + + void *GetVfnPtr(); + void *GetOrigEntry(); + + virtual IIface *FindIface(void *ptr); + + bool operator==(void *ptr) + { + return m_Ptr == ptr; + } + }; + + class CHookManagerInfo : public IHookManagerInfo + { + public: + typedef List VfnPtrList; + typedef VfnPtrList::iterator VfnPtrListIter; + + Plugin m_Plug; + HookManagerPubFunc m_Func; + + int m_VtblOffs; + int m_VtblIdx; + const char *m_Proto; + void *m_HookfuncVfnptr; + + VfnPtrList m_VfnPtrs; + + int m_HookManVersion; + public: + CHookManagerInfo(); + virtual ~CHookManagerInfo(); + + IVfnPtr *FindVfnPtr(void *vfnptr); + + void SetInfo(int vtbl_offs, int vtbl_idx, const char *proto); + void SetHookfuncVfnptr(void *hookfunc_vfnptr); + + void SetVersion(int version); + + bool operator < (const CHookManagerInfo &other) + { + return m_HookManVersion < other.m_HookManVersion; + } + + struct Descriptor + { + Descriptor(Plugin pplug, HookManagerPubFunc ppubFunc) : plug(pplug), pubFunc(ppubFunc) + { + } + + Plugin plug; + HookManagerPubFunc pubFunc; + }; + + bool operator == (const Descriptor desc) + { + return m_Func == desc.pubFunc && m_Plug == desc.plug; + } + }; + + typedef List HookManInfoList; + + class CHookManagerContainer : public HookManInfoList + { + public: + // HMCI (Hook Manager Container Identification) + class HMCI + { + CProto m_Proto; + int m_VtableOffset; + int m_VtableIndex; + public: + HMCI(const char *proto, int vtbloffs, int vtblidx) : + m_Proto(proto), m_VtableOffset(vtbloffs), m_VtableIndex(vtblidx) + { + } + ~HMCI() + { + } + + bool operator==(const HMCI &other) const + { + return + other.m_VtableIndex == m_VtableIndex && + other.m_Proto == m_Proto && + other.m_VtableOffset == m_VtableOffset; + } + + const CProto &GetProto() const + { + return m_Proto; + } + int GetVtableOffset() const + { + return m_VtableOffset; + } + int GetVtableIndex() const + { + return m_VtableIndex; + } + }; + HMCI m_HCMI; + + public: + CHookManagerContainer(const HMCI &hmci) : m_HCMI(hmci) + { + } + bool operator == (const HMCI &other) const + { + return m_HCMI == other; + } + void AddHookManager(Plugin plug, const CHookManagerInfo &hookman); + }; + + class CCallClassImpl : public GenericCallClass + { + public: + + typedef SourceHook::CVector OrigFuncs; + typedef SourceHook::THash OrigVTables; + + void *m_Ptr; //!< Pointer to the actual object + size_t m_ObjSize; //!< Size of the instance + OrigVTables m_VT; //!< Info about vtables & functions + + int m_RefCounter; + + CCallClassImpl(void *ptr, size_t size); + virtual ~CCallClassImpl(); + + bool operator==(void *other) + { + return m_Ptr == other; + } + + void *GetThisPtr(); + void *GetOrigFunc(int vtbloffs, int vtblidx); + + void ApplyCallClassPatch(int vtbl_offs, int vtbl_idx, void *orig_entry); + void RemoveCallClassPatch(int vtbl_offs, int vtbl_idx); + }; + + /** + * @brief A list of CallClass structures + */ + typedef List Impl_CallClassList; + + Impl_CallClassList m_CallClasses; //!< A list of already generated callclasses + + /** + * @brief A list of CHookManagerContainers + */ + typedef List HookManContList; + + HookManContList m_HookMans; //!< A list of hook managers + + struct HookLoopInfo + { + enum RecallType + { + Recall_No=0, + Recall_Pre, + Recall_Post1, + Recall_Post2 + }; + + META_RES *pStatus; + META_RES *pPrevRes; + META_RES *pCurRes; + + META_RES temporaryStatus; //!< Stored during Post1 recall phase + bool shouldContinue; + RecallType recall; //!< Specifies which kind of recall we're in. + + IIface *pCurIface; + const void *pOrigRet; + void *pOverrideRet; + void **pIfacePtrPtr; + }; + typedef CStack HookLoopInfoStack; + + void ApplyCallClassPatches(CCallClassImpl &cc); + void ApplyCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx, void *orig_entry); + void RemoveCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx); + + void SetPluginPaused(Plugin plug, bool paused); + + HookLoopInfoStack m_HLIStack; + public: + CSourceHookImpl(); + virtual ~CSourceHookImpl(); + + /** + * @brief Returns the interface version + */ + int GetIfaceVersion(); + + /** + * @brief Returns the implemnetation version + */ + int GetImplVersion(); + + /** + * @brief Make sure that a plugin is not used by any other plugins anymore, and unregister all its hook managers + */ + void UnloadPlugin(Plugin plug); + + /** + * @brief Shut down the whole system, unregister all hook managers + */ + void CompleteShutdown(); + + /** + * @brief Add a hook. + * + * @return True if the function succeeded, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param iface The interface pointer + * @param ifacesize The size of the class iface points to + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post); + + /** + * @brief Removes a hook. + * + * @return True if the function succeeded, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param iface The interface pointer + * @param thisptr_offs This pointer adjuster + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post); + + /** + * @brief Removes a hook. + * + * @ return True if the function succeeded, false otherwise + * + * @param info A RemoveHookInfo structure, describing the hook + */ + bool RemoveHook(RemoveHookInfo info); + + /** + * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins + * + * @param plug The unique identifier of the plugin in question + */ + bool IsPluginInUse(Plugin plug); + + /** + * @brief Pauses all hooks of a plugin + * + * @param plug The unique identifier of the plugin + */ + void PausePlugin(Plugin plug); + + /** + * @brief Unpauses all hooks of a plugin + * + * @param plug The unique identifier of the plugin + */ + void UnpausePlugin(Plugin plug); + + /** + * @brief Return a pointer to a callclass. Generate a new one if required. + * + * @param iface The interface pointer + * @param size Size of the class instance + */ + GenericCallClass *GetCallClass(void *iface, size_t size); + + /** + * @brief Release a callclass + * + * @param ptr Pointer to the callclass + */ + virtual void ReleaseCallClass(GenericCallClass *ptr); + + virtual void SetRes(META_RES res); //!< Sets the meta result + virtual META_RES GetPrevRes(); //!< Gets the meta result of the previously called handler + virtual META_RES GetStatus(); //!< Gets the highest meta result + virtual const void *GetOrigRet(); //!< Gets the original result. If not in post function, undefined + virtual const void *GetOverrideRet(); //!< Gets the override result. If none is specified, NULL + virtual void *GetIfacePtr(); //!< Gets the interface pointer + + ////////////////////////////////////////////////////////////////////////// + // For hook managers + void HookLoopBegin(IIface *pIface); //!< Should be called when a hook loop begins + void HookLoopEnd(); //!< Should be called when a hook loop exits + void SetCurResPtr(META_RES *mres); //!< Sets pointer to the current meta result + void SetPrevResPtr(META_RES *mres); //!< Sets pointer to previous meta result + void SetStatusPtr(META_RES *mres); //!< Sets pointer to the status variable + void SetIfacePtrPtr(void **pp); //!< Sets pointer to the interface this pointer + void SetOrigRetPtr(const void *ptr); //!< Sets the original return pointer + void SetOverrideRetPtr(void *ptr); //!< Sets the override result pointer + bool ShouldContinue(); //!< Returns false if the hook loop should exit + + /** + * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. + * + * @param plug The owner of the hook manager + * @param pubFunc The hook manager's info function + */ + virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc); + virtual void RemoveHookManager(RemoveHookManInfo info); + + virtual void DoRecall(); //!< Initiates a recall sequence + virtual void *GetOverrideRetPtr(); //!< Returns the pointer set by SetOverrideRetPtr + + virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, + void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr); + }; +} + +#endif diff --git a/sourcehook/test/Makefile b/sourcehook/test/Makefile new file mode 100644 index 0000000..6c859b0 --- /dev/null +++ b/sourcehook/test/Makefile @@ -0,0 +1,63 @@ +#(C)2004-2007 SourceMM Development Team +# Makefile written by David "BAILOPAN" Anderson and Pavol Marko + +OPT_FLAGS = -O3 -funroll-loops -s -pipe +DEBUG_FLAGS = -g -ggdb3 +CPP = gcc +LINK = -lstdc++ +INCLUDE = -I. -I.. +MAX_PARAMS=20 + +BINARY = sourcehook_test +OBJECTS = main.cpp sourcehook.cpp $(shell ls -t test*.cpp) +HEADERS = ../sh_list.h ../sh_tinyhash.h ../sh_memory.h ../sh_string.h ../sh_vector.h ../sourcehook_impl.h ../FastDelegate.h ../sourcehook.h ../sh_memfuncinfo.h + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug + CFLAGS = $(DEBUG_FLAGS) +else + BIN_DIR = Release + CFLAGS = $(OPT_FLAGS) +endif + +CFLAGS += -Wall +# Also, enable SH_ASSERT +CFLAGS += -DSH_DEBUG + +OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + + +default: all + +$(BIN_DIR)/%.o: %.cpp $(HEADERS) + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +../sourcehook.h: ../generate/sourcehook.hxx + (cd ../generate; ./shworker.bin iter sourcehook.hxx sourcehook.h $(MAX_PARAMS); cp sourcehook.h ..) + +../sourcehook.hxx: ../generate/sh_memfuncinfo.hxx + (cd ../generate; ./shworker.bin iter sh_memfuncinfo.hxx sh_memfuncinfo.h $(MAX_PARAMS); cp sh_memfuncino.h ..) + +../FastDelegate.hxx: ../generate/FastDelegate.hxx + (cd ../generate; ./shworker.bin iter FastDelegate.hxx FastDelegate.h $(MAX_PARAMS); cp FastDelegate.h ..) + +debug: + $(MAKE) all DEBUG=true + +all: + mkdir -p $(BIN_DIR) + ln -sf ../sourcehook.cpp sourcehook.cpp + $(MAKE) $(BINARY) + rm -f $(BINARY) + rm -f sourcehook.cpp + ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) + + +$(BINARY): $(OBJ_LINUX) + $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -o$(BIN_DIR)/$(BINARY) + +clean: + rm -rf Release/*.o + rm -rf Release/$(BINARY) + rm -rf Debug/*.o + rm -rf Debug/$(BINARY) diff --git a/sourcehook/test/main.cpp b/sourcehook/test/main.cpp new file mode 100644 index 0000000..12a4706 --- /dev/null +++ b/sourcehook/test/main.cpp @@ -0,0 +1,131 @@ +// Hello BAIL! +// hello pm how are you +// I'm fine, what about you? +// not bad, just looking for mem leaks +// mem leaks in my code!? never! I have to preserve binary compatibility :( +// This is a test file + +#include +#include +#include +#include +#include +#include "sh_tinyhash.h" +#include "sh_list.h" +#include "sourcehook_impl.h" +#include "sourcehook.h" + +using namespace std; + +bool g_Verbose; + +class Test +{ + typedef bool (*TestProto)(std::string&); + TestProto m_Func; + std::string m_Name; + + static SourceHook::List ms_Tests; +public: + Test(TestProto func, const char *name) : m_Func(func), m_Name(name) + { + ms_Tests.push_back(this); + } + + bool operator()() + { + std::string error; + if (!m_Func(error)) + { + cout << "Test" << m_Name << " FAILED: " << error << endl; + return false; + } + else + { + cout << "Test" << m_Name << " passed" << endl; + return true; + } + } + + static void DoTests() + { + int passed=0, failed=0; + for (SourceHook::List::iterator iter = ms_Tests.begin(); iter != ms_Tests.end(); ++iter) + { + if ((**iter)()) + ++passed; + else + ++failed; + } + cout << endl << "----" << endl << "Passed: " << passed << endl << "Failed: " << failed << endl; + cout << "Total: " << passed + failed << endl; + } +}; + +SourceHook::List Test::ms_Tests; + +#define DO_TEST(x) \ + bool Test##x(std::string &error); \ + Test g_Test##x(Test##x, #x); + +DO_TEST(List); +DO_TEST(Basic); +DO_TEST(VafmtAndOverload); +DO_TEST(ThisPtrOffs); +DO_TEST(PlugSys); +DO_TEST(Bail); +DO_TEST(Reentr); +DO_TEST(Manual); +DO_TEST(Recall); +DO_TEST(Multi); +DO_TEST(Ref); +DO_TEST(RefRet); + +int main(int argc, char *argv[]) +{ + std::string error; + + g_Verbose = argc > 1 && strcmp(argv[1], "-v") == 0; + + Test::DoTests(); + + cout << "Press enter to continue" << endl; + + char x; + cin.read(&x, 1); +} + +SourceHook::ISourceHook *Test_Factory() +{ + return new SourceHook::CSourceHookImpl(); +} + +void Test_Delete(SourceHook::ISourceHook *shptr) +{ + delete static_cast(shptr); +} + +void Test_CompleteShutdown(SourceHook::ISourceHook *shptr) +{ + static_cast(shptr)->CompleteShutdown(); +} + +bool Test_IsPluginInUse(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) +{ + return static_cast(shptr)->IsPluginInUse(plug); +} + +void Test_UnloadPlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) +{ + static_cast(shptr)->UnloadPlugin(plug); +} + +void Test_PausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) +{ + static_cast(shptr)->PausePlugin(plug); +} + +void Test_UnpausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) +{ + static_cast(shptr)->UnpausePlugin(plug); +} diff --git a/sourcehook/test/msvc7/test.vcproj b/sourcehook/test/msvc7/test.vcproj new file mode 100644 index 0000000..1f9496a --- /dev/null +++ b/sourcehook/test/msvc7/test.vcproj @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcehook/test/msvc8/test.vcproj b/sourcehook/test/msvc8/test.vcproj new file mode 100644 index 0000000..ae768e5 --- /dev/null +++ b/sourcehook/test/msvc8/test.vcproj @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcehook/test/sourcehook_test.h b/sourcehook/test/sourcehook_test.h new file mode 100644 index 0000000..9d914b4 --- /dev/null +++ b/sourcehook/test/sourcehook_test.h @@ -0,0 +1,27 @@ +// This file is used for backwards compatibility testing +// It allows us to test binary backwards compatibility by using an older include file HERE: +#include "sourcehook.h" // <-- here +// There. main.cpp which implements all of the following function is always usign sourcehook.h +// and the up-to-date sourcehook_impl.h/sourcehook.cpp. The tests use this file however. +// If the test needs an up-to-date version (like the recall test), it can simply +// #include "sourcehook.h" before including this, thus overriding our decision. + + +SourceHook::ISourceHook *Test_Factory(); +void Test_Delete(SourceHook::ISourceHook *shptr); + +struct CSHPtrAutoDestruction +{ + SourceHook::ISourceHook *m_SHPtr; + CSHPtrAutoDestruction(SourceHook::ISourceHook *shptr) : m_SHPtr(shptr) {} + ~CSHPtrAutoDestruction() { Test_Delete(m_SHPtr); } +}; + +#define GET_SHPTR(var) var = Test_Factory(); CSHPtrAutoDestruction ___autodestruction(var); + +// Access to CSourceHookImpl functions +void Test_CompleteShutdown(SourceHook::ISourceHook *shptr); +bool Test_IsPluginInUse(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); +void Test_UnloadPlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); +void Test_PausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); +void Test_UnpausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); diff --git a/sourcehook/test/test1.cpp b/sourcehook/test/test1.cpp new file mode 100644 index 0000000..6b99ea4 --- /dev/null +++ b/sourcehook/test/test1.cpp @@ -0,0 +1,700 @@ +#include +#include "sourcehook_test.h" +#include "testevents.h" + +#include "sh_memory.h" + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + // TEST1 + // Basic tests + // Hooking and callclass + + MAKE_STATE_1(State_ModuleInMemory, bool); + MAKE_STATE(State_F1_Called); + MAKE_STATE_1(State_F1_PreHandler_Called, void*); + MAKE_STATE_1(State_F1_PostHandler_Called, void*); + MAKE_STATE_1(State_F1_HookAdded, bool); + MAKE_STATE(State_F1_HookRemoved); + MAKE_STATE(State_F1_CallClassGenerated); + MAKE_STATE(State_F1_CallClassReleased); + MAKE_STATE_1(State_F299_Called, std::string); + MAKE_STATE_1(State_F299_PreHandlerCalled, std::string); + MAKE_STATE_1(State_F299_PostHandlerCalled, std::string); + MAKE_STATE_1(State_F299Ret, bool); + + class Test + { + public: + virtual void F1() + { + ADD_STATE(State_F1_Called); + } + virtual void F2(){} + virtual void F3(){} + virtual void F4(){} + virtual void F5(){} + virtual void F6(){} + virtual void F7(){} + virtual void F8(){} + virtual void F9(){} + virtual void F10(){} + virtual void F11(){} + virtual void F12(){} + virtual void F13(){} + virtual void F14(){} + virtual void F15(){} + virtual void F16(){} + virtual void F17(){} + virtual void F18(){} + virtual void F19(){} + virtual float F20() const { return 1.0f; } // Look! F20 is const-ed and returns a float + virtual void F21(){} + virtual void F22(){} + virtual void F23(){} + virtual void F24(){} + virtual void F25(){} + virtual void F26(){} + virtual void F27(){} + virtual void F28(){} + virtual void F29(){} + virtual void F30(){} + virtual void F31(){} + virtual void F32(){} + virtual void F33(){} + virtual void F34(){} + virtual void F35(){} + virtual void F36(){} + virtual void F37(){} + virtual void F38(){} + virtual void F39(){} + virtual void F40(){} + virtual void F41(){} + virtual void F42(){} + virtual void F43(){} + virtual void F44(){} + virtual void F45(){} + virtual void F46(){} + virtual void F47(){} + virtual void F48(){} + virtual void F49(){} + virtual void F50(){} + virtual void F51(){} + virtual void F52(){} + virtual void F53(){} + virtual void F54(){} + virtual void F55(){} + virtual void F56(){} + virtual void F57(){} + virtual void F58(){} + virtual void F59(){} + virtual void F60(int &hello){} + virtual void F61(){} + virtual void F62(){} + virtual void F63(){} + virtual void F64(){} + virtual void F65(){} + virtual void F66(){} + virtual void F67(){} + virtual void F68(){} + virtual void F69(){} + virtual void F70(){} + virtual void F71(){} + virtual void F72(){} + virtual void F73(){} + virtual void F74(){} + virtual void F75(){} + virtual void F76(){} + virtual void F77(){} + virtual void F78(){} + virtual void F79(){} + virtual void F80(){} + virtual void F81(){} + virtual void F82(){} + virtual void F83(){} + virtual void F84(){} + virtual void F85(){} + virtual void F86(){} + virtual void F87(){} + virtual void F88(){} + virtual void F89(){} + virtual void F90(){} + virtual void F91(){} + virtual void F92(){} + virtual void F93(){} + virtual void F94(){} + virtual void F95(){} + virtual void F96(){} + virtual void F97(){} + virtual void F98(){} + virtual void F99(){} + virtual void F100(){} + virtual void F101(){} + virtual void F102(){} + virtual void F103(){} + virtual void F104(){} + virtual void F105(){} + virtual void F106(){} + virtual void F107(){} + virtual void F108(){} + virtual void F109(){} + virtual void F110(){} + virtual void F111(){} + virtual void F112(){} + virtual void F113(){} + virtual void F114(){} + virtual void F115(){} + virtual void F116(){} + virtual void F117(){} + virtual void F118(){} + virtual void F119(){} + virtual void F120(){} + virtual void F121(){} + virtual void F122(){} + virtual void F123(){} + virtual void F124(){} + virtual void F125(){} + virtual void F126(){} + virtual void F127(){} + virtual void F128(){} + virtual void F129(){} + virtual void F130(){} + virtual void F131(){} + virtual void F132(){} + virtual void F133(){} + virtual void F134(){} + virtual void F135(){} + virtual void F136(){} + virtual void F137(){} + virtual void F138(){} + virtual void F139(){} + virtual void F140(){} + virtual void F141(){} + virtual void F142(){} + virtual void F143(){} + virtual void F144(){} + virtual void F145(){} + virtual void F146(){} + virtual void F147(){} + virtual void F148(){} + virtual void F149(){} + virtual void F150(){} + virtual void F151(){} + virtual void F152(){} + virtual void F153(){} + virtual void F154(){} + virtual void F155(){} + virtual void F156(){} + virtual void F157(){} + virtual void F158(){} + virtual void F159(){} + virtual void F160(){} + virtual void F161(){} + virtual void F162(){} + virtual void F163(){} + virtual void F164(){} + virtual void F165(){} + virtual void F166(){} + virtual void F167(){} + virtual void F168(){} + virtual void F169(){} + virtual void F170(){} + virtual void F171(){} + virtual void F172(){} + virtual void F173(){} + virtual void F174(){} + virtual void F175(){} + virtual void F176(){} + virtual void F177(){} + virtual void F178(){} + virtual void F179(){} + virtual void F180(){} + virtual void F181(){} + virtual void F182(){} + virtual void F183(){} + virtual void F184(){} + virtual void F185(){} + virtual void F186(){} + virtual void F187(){} + virtual void F188(){} + virtual void F189(){} + virtual void F190(){} + virtual void F191(){} + virtual void F192(){} + virtual void F193(){} + virtual void F194(){} + virtual void F195(){} + virtual void F196(){} + virtual void F197(){} + virtual void F198(){} + virtual void F199(){} + virtual void F200(){} + virtual void F201(){} + virtual void F202(){} + virtual void F203(){} + virtual void F204(){} + virtual void F205(){} + virtual void F206(){} + virtual void F207(){} + virtual void F208(){} + virtual void F209(){} + virtual void F210(){} + virtual void F211(){} + virtual void F212(){} + virtual void F213(){} + virtual void F214(){} + virtual void F215(){} + virtual void F216(){} + virtual void F217(){} + virtual void F218(){} + virtual void F219(){} + virtual void F220(){} + virtual void F221(){} + virtual void F222(){} + virtual void F223(){} + virtual void F224(){} + virtual void F225(){} + virtual void F226(){} + virtual void F227(){} + virtual void F228(){} + virtual void F229(){} + virtual void F230(){} + virtual void F231(){} + virtual void F232(){} + virtual void F233(){} + virtual void F234(){} + virtual void F235(){} + virtual void F236(){} + virtual void F237(){} + virtual void F238(){} + virtual void F239(){} + virtual void F240(){} + virtual void F241(){} + virtual void F242(){} + virtual void F243(){} + virtual void F244(){} + virtual void F245(){} + virtual void F246(){} + virtual void F247(){} + virtual void F248(){} + virtual void F249(){} + virtual void F250(){} + virtual void F251(){} + virtual void F252(){} + virtual void F253(){} + virtual void F254(){} + virtual void F255(){} + virtual void F256(){} + virtual void F257(){} + virtual void F258(){} + virtual void F259(){} + virtual void F260(){} + virtual void F261(){} + virtual void F262(){} + virtual void F263(){} + virtual void F264(){} + virtual void F265(){} + virtual void F266(){} + virtual void F267(){} + virtual void F268(){} + virtual void F269(){} + virtual void F270(){} + virtual void F271(){} + virtual void F272(){} + virtual void F273(){} + virtual void F274(){} + virtual void F275(){} + virtual void F276(){} + virtual void F277(){} + virtual void F278(){} + virtual void F279(){} + virtual void F280(){} + virtual void F281(){} + virtual void F282(){} + virtual void F283(){} + virtual void F284(){} + virtual void F285(){} + virtual void F286(){} + virtual void F287(){} + virtual void F288(){} + virtual void F289(){} + virtual void F290(){} + virtual void F291(){} + virtual void F292(){} + virtual void F293(){} + virtual void F294(){} + virtual void F295(){} + virtual void F296(){} + virtual void F297(){} + virtual void F298(){} + virtual bool F299(const char *mwah) + { + ADD_STATE(State_F299_Called(mwah)); + return true; + } + }; + + SH_DECL_HOOK1(Test, F299, SH_NOATTRIB, 0, bool, const char *); + SH_DECL_HOOK0_void(Test, F1, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, F2, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, F3, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, F4, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, F5, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, F6, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, F7, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, F8, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, F9, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, F10, SH_NOATTRIB, 0); + + SH_DECL_HOOK0(Test, F20, const, 0, float); + SH_DECL_HOOK1_void(Test, F60, SH_NOATTRIB, 0, int&); + + META_RES g_F1Pre_WhatToDo; + META_RES g_F1Post_WhatToDo; + + struct HandlersF1 + { + void Pre() + { + ADD_STATE(State_F1_PreHandler_Called(reinterpret_cast(this))); + RETURN_META(g_F1Pre_WhatToDo); + } + + void Post() + { + ADD_STATE(State_F1_PostHandler_Called(reinterpret_cast(this))); + RETURN_META(g_F1Post_WhatToDo); + } + }; + + META_RES g_F299Pre_WhatToDo; + bool g_F299Pre_WhatToRet; + + bool F299_Pre(const char *mwah) + { + ADD_STATE(State_F299_PreHandlerCalled(mwah)); + RETURN_META_VALUE(g_F299Pre_WhatToDo, g_F299Pre_WhatToRet); + } + + bool F299_Post(const char *mwah) + { + ADD_STATE(State_F299_PostHandlerCalled(mwah)); + RETURN_META_VALUE(MRES_OVERRIDE, META_RESULT_STATUS >= MRES_OVERRIDE ? !META_RESULT_OVERRIDE_RET(bool) : + !META_RESULT_ORIG_RET(bool)); + } + + void F60_Pre(int &hello) + { + hello = 10; + } +} + +template T func(T a) +{ + return a; +} + + +bool TestBasic(std::string &error) +{ + // Simple test for ModuleInMemory + // 1) &error should on the stack + // 2) 0 should not be mapped + ADD_STATE(State_ModuleInMemory(SourceHook::ModuleInMemory(reinterpret_cast(&error), sizeof(error)))); + ADD_STATE(State_ModuleInMemory(SourceHook::ModuleInMemory(0, 1))); + + CHECK_STATES((&g_States, + new State_ModuleInMemory(true), + new State_ModuleInMemory(false), + NULL), "ModuleInMemory"); + + GET_SHPTR(g_SHPtr); + g_PLID = 1337; + + HandlersF1 f1_handlers; + Test test; + Test *pTest = &test; + + // 1) Get a call class and call the member through it and normally + SourceHook::CallClass *cc = SH_GET_CALLCLASS(pTest); + + ADD_STATE(State_F1_CallClassGenerated); + + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + CHECK_STATES((&g_States, + new State_F1_CallClassGenerated, + new State_F1_Called, + new State_F1_Called, + NULL), "Part 1"); + + // 2) Request a call class again + SourceHook::CallClass *cc2 = SH_GET_CALLCLASS(pTest); + ADD_STATE(State_F1_CallClassGenerated); + + SH_CALL(cc, &Test::F1)(); + SH_CALL(cc2, &Test::F1)(); + pTest->F1(); + + SH_RELEASE_CALLCLASS(cc2); + ADD_STATE(State_F1_CallClassReleased); + + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + CHECK_STATES((&g_States, + new State_F1_CallClassGenerated, + new State_F1_Called, + new State_F1_Called, + new State_F1_Called, + new State_F1_CallClassReleased, + new State_F1_Called, + new State_F1_Called, + NULL), "Part 2"); + + // 3) Add a pre hook + g_F1Pre_WhatToDo = MRES_SUPERCEDE; + ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false))); + + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + CHECK_STATES((&g_States, + new State_F1_HookAdded(true), + new State_F1_Called, + new State_F1_PreHandler_Called(&f1_handlers), + NULL), "Part 3"); + + // 4) Rerequest the callclass + SH_RELEASE_CALLCLASS(cc); + + ADD_STATE(State_F1_CallClassReleased); + cc2 = SH_GET_CALLCLASS(pTest); + ADD_STATE(State_F1_CallClassGenerated); + + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + CHECK_STATES((&g_States, + new State_F1_CallClassReleased, + new State_F1_CallClassGenerated, + new State_F1_Called, + new State_F1_PreHandler_Called(&f1_handlers), + NULL), "Part 4"); + + // 5) Check ignore / supercede + g_F1Pre_WhatToDo = MRES_SUPERCEDE; + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + g_F1Pre_WhatToDo = MRES_IGNORED; + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + CHECK_STATES((&g_States, + new State_F1_Called, + new State_F1_PreHandler_Called(&f1_handlers), + new State_F1_Called, + new State_F1_PreHandler_Called(&f1_handlers), + new State_F1_Called, + NULL), "Part 5"); + + // 6) remove the hook again + SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false); + ADD_STATE(State_F1_HookRemoved); + + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + CHECK_STATES((&g_States, + new State_F1_HookRemoved, + new State_F1_Called, + new State_F1_Called, + NULL), "Part 6"); + + // 7) add a post hook now + g_F1Post_WhatToDo = MRES_IGNORED; + ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Post, true))); + + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + CHECK_STATES((&g_States, + new State_F1_HookAdded(true), + new State_F1_Called, + new State_F1_Called, + new State_F1_PostHandler_Called(&f1_handlers), + NULL), "Part 7"); + + // 8) And a pre hook again + g_F1Pre_WhatToDo = MRES_IGNORED; + ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false))); + + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + g_F1Pre_WhatToDo = MRES_SUPERCEDE; + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + CHECK_STATES((&g_States, + new State_F1_HookAdded(true), + new State_F1_Called, + new State_F1_PreHandler_Called(&f1_handlers), + new State_F1_Called, + new State_F1_PostHandler_Called(&f1_handlers), + new State_F1_Called, + new State_F1_PreHandler_Called(&f1_handlers), + new State_F1_PostHandler_Called(&f1_handlers), + NULL), "Part 8"); + + // 9) Remove all hooks + SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false); + ADD_STATE(State_F1_HookRemoved); + SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Post, true); + ADD_STATE(State_F1_HookRemoved); + + SH_CALL(cc, &Test::F1)(); + pTest->F1(); + + CHECK_STATES((&g_States, + new State_F1_HookRemoved, + new State_F1_HookRemoved, + new State_F1_Called, + new State_F1_Called, + NULL), "Part 9"); + + // 10) Some checks on F299 + g_F299Pre_WhatToDo = MRES_IGNORED; + g_F299Pre_WhatToRet = false; + + ADD_STATE(State_F299Ret(pTest->F299("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + + CHECK_STATES((&g_States, + new State_F299_Called("hi"), + new State_F299Ret(true), + new State_F299_Called("hi"), + new State_F299Ret(true), + NULL), "Part 10.1"); + + SH_ADD_HOOK_STATICFUNC(Test, F299, pTest, F299_Pre, false); + ADD_STATE(State_F299Ret(pTest->F299("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + + CHECK_STATES((&g_States, + new State_F299_PreHandlerCalled("hi"), + new State_F299_Called("hi"), + new State_F299Ret(true), + new State_F299_Called("hi"), + new State_F299Ret(true), + NULL), "Part 10.2"); + + SH_ADD_HOOK_STATICFUNC(Test, F299, pTest, F299_Post, true); + ADD_STATE(State_F299Ret(pTest->F299("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + + CHECK_STATES((&g_States, + new State_F299_PreHandlerCalled("hi"), + new State_F299_Called("hi"), + new State_F299_PostHandlerCalled("hi"), + new State_F299Ret(false), + new State_F299_Called("hi"), + new State_F299Ret(true), + NULL), "Part 10.3"); + + g_F299Pre_WhatToDo = MRES_OVERRIDE; + ADD_STATE(State_F299Ret(pTest->F299("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + + CHECK_STATES((&g_States, + new State_F299_PreHandlerCalled("hi"), + new State_F299_Called("hi"), + new State_F299_PostHandlerCalled("hi"), + new State_F299Ret(true), + new State_F299_Called("hi"), + new State_F299Ret(true), + NULL), "Part 10.4"); + + g_F299Pre_WhatToDo = MRES_SUPERCEDE; + ADD_STATE(State_F299Ret(pTest->F299("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + + CHECK_STATES((&g_States, + new State_F299_PreHandlerCalled("hi"), + new State_F299_PostHandlerCalled("hi"), + new State_F299Ret(true), + new State_F299_Called("hi"), + new State_F299Ret(true), + NULL), "Part 10.5"); + + SH_REMOVE_HOOK_STATICFUNC(Test, F299, pTest, F299_Pre, false); + ADD_STATE(State_F299Ret(pTest->F299("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + + CHECK_STATES((&g_States, + new State_F299_Called("hi"), + new State_F299_PostHandlerCalled("hi"), + new State_F299Ret(false), + new State_F299_Called("hi"), + new State_F299Ret(true), + NULL), "Part 10.6"); + + SH_REMOVE_HOOK_STATICFUNC(Test, F299, pTest, F299_Post, true); + ADD_STATE(State_F299Ret(pTest->F299("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + + CHECK_STATES((&g_States, + new State_F299_Called("hi"), + new State_F299Ret(true), + new State_F299_Called("hi"), + new State_F299Ret(true), + NULL), "Part 10.7"); + + // 11) Release callclass + SH_RELEASE_CALLCLASS(cc); + ADD_STATE(State_F1_CallClassReleased); + + + CHECK_STATES((&g_States, + new State_F1_CallClassReleased, + NULL), "Part 11"); + + // 12) Test? Test. + SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, true); + SH_ADD_HOOK_MEMFUNC(Test, F2, pTest, &f1_handlers, &HandlersF1::Pre, true); + SH_ADD_HOOK_MEMFUNC(Test, F3, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_ADD_HOOK_MEMFUNC(Test, F4, pTest, &f1_handlers, &HandlersF1::Pre, true); + SH_ADD_HOOK_MEMFUNC(Test, F5, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_ADD_HOOK_MEMFUNC(Test, F6, pTest, &f1_handlers, &HandlersF1::Pre, true); + SH_ADD_HOOK_MEMFUNC(Test, F7, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_ADD_HOOK_MEMFUNC(Test, F8, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_ADD_HOOK_MEMFUNC(Test, F9, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_ADD_HOOK_MEMFUNC(Test, F10, pTest, &f1_handlers, &HandlersF1::Pre, false); + + SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, true); + SH_REMOVE_HOOK_MEMFUNC(Test, F2, pTest, &f1_handlers, &HandlersF1::Pre, true); + SH_REMOVE_HOOK_MEMFUNC(Test, F3, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_REMOVE_HOOK_MEMFUNC(Test, F4, pTest, &f1_handlers, &HandlersF1::Pre, true); + SH_REMOVE_HOOK_MEMFUNC(Test, F5, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_REMOVE_HOOK_MEMFUNC(Test, F6, pTest, &f1_handlers, &HandlersF1::Pre, true); + SH_REMOVE_HOOK_MEMFUNC(Test, F7, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_REMOVE_HOOK_MEMFUNC(Test, F8, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_REMOVE_HOOK_MEMFUNC(Test, F9, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_REMOVE_HOOK_MEMFUNC(Test, F10, pTest, &f1_handlers, &HandlersF1::Pre, false); + + SH_ADD_HOOK_STATICFUNC(Test, F60, pTest, F60_Pre, false); + + int a = 0; + pTest->F60(a); + Test_CompleteShutdown(g_SHPtr); + + CHECK_COND(a == 10, "Part12.a"); + + return true; +} diff --git a/sourcehook/test/test2.cpp b/sourcehook/test/test2.cpp new file mode 100644 index 0000000..1164e0f --- /dev/null +++ b/sourcehook/test/test2.cpp @@ -0,0 +1,171 @@ +#include +#include "sourcehook_test.h" +#include "testevents.h" +#include + +// TEST2 +// Vafmt and Overloaded functions +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + MAKE_STATE_1(State_EatYams_Called, int); + MAKE_STATE_1(State_EatYams_Handler_Called, int); + MAKE_STATE_2(State_Vafmt_Called, int, std::string); + MAKE_STATE_2(State_Vafmt_PreHandler_Called, int, std::string); + MAKE_STATE_2(State_Vafmt_PostHandler_Called, int, std::string); + + class IGaben + { + public: + virtual void EatYams() + { + ADD_STATE(State_EatYams_Called(0)); + } + virtual bool EatYams(const char *location) const + { + ADD_STATE(State_EatYams_Called(1)); + return true; + } + virtual void Vafmt1(bool param1, int x, const char *fmt, ...) + { + va_list ap; + va_start(ap, fmt); + char buffer[512]; + vsprintf(buffer, fmt, ap); + va_end(ap); + ADD_STATE(State_Vafmt_Called(1, std::string(buffer))); + } + virtual float Vafmt2(const char *fmt, ...) + { + va_list ap; + va_start(ap, fmt); + char buffer[512]; + vsprintf(buffer, fmt, ap); + va_end(ap); + ADD_STATE(State_Vafmt_Called(2, std::string(buffer))); + return 0.0f; + } + }; + + SH_DECL_HOOK0_void(IGaben, EatYams, SH_NOATTRIB, 0); + SH_DECL_HOOK1(IGaben, EatYams, const, 1, bool, const char *); + SH_DECL_HOOK2_void_vafmt(IGaben, Vafmt1, SH_NOATTRIB, 0, bool, int); + SH_DECL_HOOK0_vafmt(IGaben, Vafmt2, SH_NOATTRIB, 0, float); + + void EatYams0_Handler() + { + ADD_STATE(State_EatYams_Handler_Called(0)); + } + + bool EatYams1_Handler(const char *loc) + { + ADD_STATE(State_EatYams_Handler_Called(1)); + return true; + } + + void Vafmt1_PreHandler(bool param1, int x, const char *in) + { + ADD_STATE(State_Vafmt_PreHandler_Called(1, std::string(in))); + } + void Vafmt1_PostHandler(bool param1, int x, const char *in) + { + ADD_STATE(State_Vafmt_PostHandler_Called(1, std::string(in))); + } + float Vafmt2_PreHandler(const char *in) + { + ADD_STATE(State_Vafmt_PreHandler_Called(2, std::string(in))); + return 0.0f; + } + float Vafmt2_PostHandler(const char *in) + { + ADD_STATE(State_Vafmt_PostHandler_Called(2, std::string(in))); + return 0.0f; + } +} + + +bool TestVafmtAndOverload(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1337; + + IGaben gabgab; + IGaben *pGab = &gabgab; + + SourceHook::CallClass *cc = SH_GET_CALLCLASS(pGab); + + // Part 1 + SH_CALL(cc, static_cast(&IGaben::EatYams))(); + SH_CALL(cc, static_cast(&IGaben::EatYams))("Here!"); + + SH_ADD_HOOK(IGaben, EatYams, pGab, EatYams0_Handler, false); + SH_ADD_HOOK(IGaben, EatYams, pGab, EatYams1_Handler, false); + + pGab->EatYams(); + pGab->EatYams("Here!"); + + SH_REMOVE_HOOK(IGaben, EatYams, pGab, EatYams0_Handler, false); + SH_REMOVE_HOOK(IGaben, EatYams, pGab, EatYams1_Handler, false); + + CHECK_STATES((&g_States, + new State_EatYams_Called(0), + new State_EatYams_Called(1), + new State_EatYams_Handler_Called(0), + new State_EatYams_Called(0), + new State_EatYams_Handler_Called(1), + new State_EatYams_Called(1), + NULL),"Part 1"); + + // Part 2 + pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); + SH_CALL(cc, &IGaben::Vafmt1)(true, 55, "Hello %s%d%s", "BA", 1, "L"); + pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); + SH_CALL(cc, &IGaben::Vafmt2)("Hello %s%d%s", "BA", 1, "LOPAN"); + + CHECK_STATES((&g_States, + new State_Vafmt_Called(1, "Hello BA1L"), + new State_Vafmt_Called(1, "Hello BA1L"), + new State_Vafmt_Called(2, "Hello BA1LOPAN"), + new State_Vafmt_Called(2, "Hello BA1LOPAN"), + NULL), "Part 2"); + + // Part 3 + SH_ADD_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PreHandler, false); + SH_ADD_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PostHandler, true); + SH_ADD_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PreHandler, false); + SH_ADD_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PostHandler, true); + + pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); + pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); + + CHECK_STATES((&g_States, + new State_Vafmt_PreHandler_Called(1, std::string("Hello BA1L")), + new State_Vafmt_Called(1, std::string("Hello BA1L")), + new State_Vafmt_PostHandler_Called(1, std::string("Hello BA1L")), + + new State_Vafmt_PreHandler_Called(2, std::string("Hello BA1LOPAN")), + new State_Vafmt_Called(2, std::string("Hello BA1LOPAN")), + new State_Vafmt_PostHandler_Called(2, std::string("Hello BA1LOPAN")), + NULL), "Part 3"); + + // Part 4 + SH_REMOVE_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PreHandler, false); + SH_REMOVE_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PostHandler, true); + SH_REMOVE_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PreHandler, false); + SH_REMOVE_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PostHandler, true); + + pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); + pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); + + CHECK_STATES((&g_States, + new State_Vafmt_Called(1, "Hello BA1L"), + new State_Vafmt_Called(2, "Hello BA1LOPAN"), + NULL), "Part 4"); + + SH_RELEASE_CALLCLASS(cc); + + return true; +} diff --git a/sourcehook/test/test3.cpp b/sourcehook/test/test3.cpp new file mode 100644 index 0000000..97d04c2 --- /dev/null +++ b/sourcehook/test/test3.cpp @@ -0,0 +1,238 @@ +#include +#include "sourcehook_test.h" +#include "testevents.h" + +// TEST3 +// Tests with inheritance / thisptroffsets + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + MAKE_STATE_1(State_Func1_Called, void*); // param1: This pointer + MAKE_STATE_1(State_Func2_Called, void*); // param1: This pointer + MAKE_STATE_1(State_Func3_Called, void*); // param1: This pointer + + MAKE_STATE_1(State_Func1H_Called, void*); + MAKE_STATE_1(State_Func2H_Called, void*); + MAKE_STATE_1(State_Func3H_Called, void*); + + class Base1 + { + int a; + public: + virtual void Func1() + { + ADD_STATE(State_Func1_Called(reinterpret_cast(this))); + } + }; + class Base2 + { + int b; + public: + virtual void Func2() + { + ADD_STATE(State_Func2_Called(reinterpret_cast(this))); + } + }; + class Derived : public Base1, public Base2 + { + int c; + public: + virtual void Func3() + { + ADD_STATE(State_Func3_Called(reinterpret_cast(this))); + } + }; + + SH_DECL_HOOK0_void(Derived, Func1, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Derived, Func2, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Derived, Func3, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Base1, Func1, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Base2, Func2, SH_NOATTRIB, 0); + + void Handler_Func1() + { + ADD_STATE(State_Func1H_Called(META_IFACEPTR(void))); + } + void Handler_Func2() + { + ADD_STATE(State_Func2H_Called(META_IFACEPTR(void))); + } + void Handler_Func3() + { + ADD_STATE(State_Func3H_Called(META_IFACEPTR(void))); + } +} + +bool TestThisPtrOffs(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1337; + + Derived inst; + Derived *pD = &inst; + Base1 *pB1 = pD; + Base2 *pB2 = pD; + + // It should be: + // pB1 = pD + // pB2 > pB1 + + // 1) + // Get a callclass for pD + // Verify whether the this pointers are correct + // Also call them normally to make sure that we aren't messing it up ;) + SourceHook::CallClass *pD_CC = SH_GET_CALLCLASS(pD); + + SH_CALL(pD_CC, &Derived::Func1)(); + SH_CALL(pD_CC, &Derived::Func2)(); + SH_CALL(pD_CC, &Derived::Func3)(); + pD->Func1(); + pD->Func2(); + pD->Func3(); + + CHECK_STATES((&g_States, + new State_Func1_Called(pB1), + new State_Func2_Called(pB2), + new State_Func3_Called(pD), + new State_Func1_Called(pB1), + new State_Func2_Called(pB2), + new State_Func3_Called(pD), + NULL), "Part 1"); + + SH_CALL(pD_CC, &Base1::Func1)(); + SH_CALL(pD_CC, &Base2::Func2)(); + + CHECK_STATES((&g_States, + new State_Func1_Called(pB1), + new State_Func2_Called(pB2), + NULL), "Part 1.1"); + + // 2) + // Get callclasses for the other ones and verify it as well + + SourceHook::CallClass *pB1_CC = SH_GET_CALLCLASS(pB1); + SourceHook::CallClass *pB2_CC = SH_GET_CALLCLASS(pB2); + + SH_CALL(pB1_CC, &Base1::Func1)(); + SH_CALL(pB2_CC, &Base2::Func2)(); + + CHECK_STATES((&g_States, + new State_Func1_Called(pB1), + new State_Func2_Called(pB2), + NULL), "Part 2"); + + + // 3) Add hooks on them (referring to them through pD1 / Derived) + // Check whether the hooks are called with the correct this pointer + + SH_ADD_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); + SH_ADD_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + + pD->Func1(); + pD->Func2(); + pD->Func3(); + pB1->Func1(); + pB2->Func2(); + + // The handlers should always be called with the pointer to Derived + CHECK_STATES((&g_States, + new State_Func1H_Called(pD), + new State_Func1_Called(pB1), + new State_Func2H_Called(pD), + new State_Func2_Called(pB2), + new State_Func3H_Called(pD), + new State_Func3_Called(pD), + new State_Func1H_Called(pD), + new State_Func1_Called(pB1), + new State_Func2H_Called(pD), + new State_Func2_Called(pB2), + NULL), "Part 3"); + + SH_REMOVE_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); + SH_REMOVE_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); + SH_REMOVE_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + + // 4) + // Now add the hooks on Base1 and Base2 and check again + + // Note that the new implicit_cast should convert the pD to Base1*/Base2* :) + SH_ADD_HOOK_STATICFUNC(Base1, Func1, pD, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(Base2, Func2, pD, Handler_Func2, false); + SH_ADD_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + + pD->Func1(); + pD->Func2(); + pD->Func3(); + pB1->Func1(); + pB2->Func2(); + + // This time, the handlers for Func1 should be called with pB1 and the handlers + // for Func2 should be called with pB2 + CHECK_STATES((&g_States, + new State_Func1H_Called(pB1), + new State_Func1_Called(pB1), + new State_Func2H_Called(pB2), + new State_Func2_Called(pB2), + new State_Func3H_Called(pD), + new State_Func3_Called(pD), + new State_Func1H_Called(pB1), + new State_Func1_Called(pB1), + new State_Func2H_Called(pB2), + new State_Func2_Called(pB2), + NULL), "Part 4"); + + SH_REMOVE_HOOK_STATICFUNC(Base1, Func1, pD, Handler_Func1, false); + SH_REMOVE_HOOK_STATICFUNC(Base2, Func2, pD, Handler_Func2, false); + SH_REMOVE_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + + + // 5) + // Add some hooks, and use callclasses + + // 5.1) First off, add all of them on pD + SH_ADD_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); + SH_ADD_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + + pD->Func1(); + pD->Func2(); + pD->Func3(); + + CHECK_STATES((&g_States, + new State_Func1H_Called(pD), + new State_Func1_Called(pB1), + new State_Func2H_Called(pD), + new State_Func2_Called(pB2), + new State_Func3H_Called(pD), + new State_Func3_Called(pD), + NULL), "Part 5.1"); + + SH_CALL(pD_CC, &Derived::Func1)(); + SH_CALL(pD_CC, &Derived::Func2)(); + SH_CALL(pD_CC, &Derived::Func3)(); + SH_CALL(pB1_CC, &Base1::Func1)(); + SH_CALL(pB2_CC, &Base2::Func2)(); + + CHECK_STATES((&g_States, + new State_Func1_Called(pB1), + new State_Func2_Called(pB2), + new State_Func3_Called(pD), + new State_Func1_Called(pB1), + new State_Func2_Called(pB2), + NULL), "Part 5.2"); + + SH_REMOVE_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); + SH_REMOVE_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); + SH_REMOVE_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + + SH_RELEASE_CALLCLASS(pB1_CC); + SH_RELEASE_CALLCLASS(pB2_CC); + SH_RELEASE_CALLCLASS(pD_CC); + + return true; +} diff --git a/sourcehook/test/test4.cpp b/sourcehook/test/test4.cpp new file mode 100644 index 0000000..f2b0a88 --- /dev/null +++ b/sourcehook/test/test4.cpp @@ -0,0 +1,420 @@ +#include +#include "sourcehook_test.h" +#include "testevents.h" + +// TEST4 +// Tests of plugin management system + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + MAKE_STATE(State_Func1_Called); + MAKE_STATE(State_Func2_Called); + MAKE_STATE(State_Func3_Called); + + MAKE_STATE(State_Func1H_Called); + MAKE_STATE(State_Func2H_Called); + MAKE_STATE(State_Func3H_Called); + + MAKE_STATE_2(State_PluginInUse, int, bool); + + class Test + { + public: + virtual void Func1() + { + ADD_STATE(State_Func1_Called); + } + + virtual void Func2() + { + ADD_STATE(State_Func2_Called); + } + + virtual void Func3() + { + ADD_STATE(State_Func3_Called); + } + }; + + SH_DECL_HOOK0_void(Test, Func1, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, Func2, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(Test, Func3, SH_NOATTRIB, 0); + + void Handler_Func1() + { + ADD_STATE(State_Func1H_Called); + } + void Handler_Func2() + { + ADD_STATE(State_Func2H_Called); + } + void Handler_Func3() + { + ADD_STATE(State_Func3H_Called); + } +} + +bool TestPlugSys(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1; + + Test inst; + Test *pInst = &inst; + + // 1) + // Add hooks, then issue a complete shutdown + SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1H_Called, + new State_Func1_Called, + new State_Func2_Called, + new State_Func2H_Called, + new State_Func3H_Called, + new State_Func3_Called, + NULL), "Part 1.1"); + + Test_CompleteShutdown(g_SHPtr); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1_Called, + new State_Func2_Called, + new State_Func3_Called, + NULL), "Part 1.2"); + + // 2) + // Add hooks from "different plugins", then shutdown the plugins + + g_PLID = 1; + SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); + g_PLID = 2; + SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + g_PLID = 3; + SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + + g_PLID = 1; + SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + + g_PLID = 2; + SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + + g_PLID = 3; + SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1H_Called, + new State_Func1H_Called, + new State_Func1H_Called, + new State_Func1_Called, + new State_Func2_Called, + new State_Func2H_Called, + new State_Func2H_Called, + new State_Func2H_Called, + new State_Func3H_Called, + new State_Func3H_Called, + new State_Func3H_Called, + new State_Func3_Called, + NULL), "Part 2.1"); + + ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); + ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); + ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); + ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); + + CHECK_STATES((&g_States, + new State_PluginInUse(1, true), + new State_PluginInUse(2, true), + new State_PluginInUse(3, true), + new State_PluginInUse(4, false), + NULL), "Part 2.2"); + + // Unload plugins one by one + Test_UnloadPlugin(g_SHPtr, 3); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1H_Called, + new State_Func1H_Called, + new State_Func1_Called, + new State_Func2_Called, + new State_Func2H_Called, + new State_Func2H_Called, + new State_Func3H_Called, + new State_Func3H_Called, + new State_Func3_Called, + NULL), "Part 2.3.1"); + + ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); + ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); + ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); + ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); + + CHECK_STATES((&g_States, + new State_PluginInUse(1, true), + new State_PluginInUse(2, true), + new State_PluginInUse(3, false), + new State_PluginInUse(4, false), + NULL), "Part 2.3.2"); + + Test_UnloadPlugin(g_SHPtr, 2); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1H_Called, + new State_Func1_Called, + new State_Func2_Called, + new State_Func2H_Called, + new State_Func3H_Called, + new State_Func3_Called, + NULL), "Part 2.4.1"); + + ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); + ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); + ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); + ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); + + CHECK_STATES((&g_States, + new State_PluginInUse(1, true), + new State_PluginInUse(2, false), + new State_PluginInUse(3, false), + new State_PluginInUse(4, false), + NULL), "Part 2.4.2"); + + Test_UnloadPlugin(g_SHPtr, 1); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1_Called, + new State_Func2_Called, + new State_Func3_Called, + NULL), "Part 2.5.1"); + + ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); + ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); + ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); + ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); + + CHECK_STATES((&g_States, + new State_PluginInUse(1, false), + new State_PluginInUse(2, false), + new State_PluginInUse(3, false), + new State_PluginInUse(4, false), + NULL), "Part 2.5.2"); + + + // 3) + // Add hooks from "different plugins", then pause the plugins + + g_PLID = 1; + SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); + g_PLID = 2; + SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + g_PLID = 3; + SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + + g_PLID = 1; + SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + + g_PLID = 2; + SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + + g_PLID = 3; + SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1H_Called, + new State_Func1H_Called, + new State_Func1H_Called, + new State_Func1_Called, + new State_Func2_Called, + new State_Func2H_Called, + new State_Func2H_Called, + new State_Func2H_Called, + new State_Func3H_Called, + new State_Func3H_Called, + new State_Func3H_Called, + new State_Func3_Called, + NULL), "Part 3.1"); + + ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); + ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); + ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); + ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); + + CHECK_STATES((&g_States, + new State_PluginInUse(1, true), + new State_PluginInUse(2, true), + new State_PluginInUse(3, true), + new State_PluginInUse(4, false), + NULL), "Part 3.2"); + + // Unload plugins one by one + Test_PausePlugin(g_SHPtr, 3); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1H_Called, + new State_Func1H_Called, + new State_Func1_Called, + new State_Func2_Called, + new State_Func2H_Called, + new State_Func2H_Called, + new State_Func3H_Called, + new State_Func3H_Called, + new State_Func3_Called, + NULL), "Part 3.3.1"); + + ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); + ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); + ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); + ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); + + CHECK_STATES((&g_States, + new State_PluginInUse(1, true), + new State_PluginInUse(2, true), + new State_PluginInUse(3, true), + new State_PluginInUse(4, false), + NULL), "Part 3.3.2"); + + Test_PausePlugin(g_SHPtr, 2); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1H_Called, + new State_Func1_Called, + new State_Func2_Called, + new State_Func2H_Called, + new State_Func3H_Called, + new State_Func3_Called, + NULL), "Part 3.4.1"); + + ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); + ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); + ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); + ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); + + CHECK_STATES((&g_States, + new State_PluginInUse(1, true), + new State_PluginInUse(2, true), + new State_PluginInUse(3, true), + new State_PluginInUse(4, false), + NULL), "Part 3.4.2"); + + Test_PausePlugin(g_SHPtr, 1); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1_Called, + new State_Func2_Called, + new State_Func3_Called, + NULL), "Part 3.5.1"); + + ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); + ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); + ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); + ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); + + CHECK_STATES((&g_States, + new State_PluginInUse(1, true), + new State_PluginInUse(2, true), + new State_PluginInUse(3, true), + new State_PluginInUse(4, false), + NULL), "Part 3.5.2"); + + Test_UnpausePlugin(g_SHPtr, 1); + Test_UnpausePlugin(g_SHPtr, 2); + Test_UnpausePlugin(g_SHPtr, 3); + + ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); + ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); + ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); + ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); + + CHECK_STATES((&g_States, + new State_PluginInUse(1, true), + new State_PluginInUse(2, true), + new State_PluginInUse(3, true), + new State_PluginInUse(4, false), + NULL), "Part 3.6"); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1H_Called, + new State_Func1H_Called, + new State_Func1H_Called, + new State_Func1_Called, + new State_Func2_Called, + new State_Func2H_Called, + new State_Func2H_Called, + new State_Func2H_Called, + new State_Func3H_Called, + new State_Func3H_Called, + new State_Func3H_Called, + new State_Func3_Called, + NULL), "Part 3.7"); + + // 4) Shutdown :) + Test_CompleteShutdown(g_SHPtr); + + pInst->Func1(); + pInst->Func2(); + pInst->Func3(); + + CHECK_STATES((&g_States, + new State_Func1_Called, + new State_Func2_Called, + new State_Func3_Called, + NULL), "Part 4"); + + return true; +} diff --git a/sourcehook/test/testbail.cpp b/sourcehook/test/testbail.cpp new file mode 100644 index 0000000..d86f0c3 --- /dev/null +++ b/sourcehook/test/testbail.cpp @@ -0,0 +1,115 @@ +// TESTBAIL +// This test used to be a test for a bug BAIL found. +// That bug is now fixed so I've granted BAIL the pleasure of being a test for +// the correct priority ordering of hook managers based on their version. + +/* + THE PROBLEM: + Old hook funcs don't work right when you combine override returns and recalls. + THE SOLUTION: + Always use a new hook func when possible. For this, hook funcs have to be able to say + " HELLO I'M NEW! " + + This file tests that functionality. + + How it works: + testbail.cpp compiles with old version of sourcehook.h. + It sets everything up, adds a hook on a function + Then testbail2.cpp which has the new version adds a hook on the same function and + does a recall and overrides the value in it. +*/ +#include "sourcehook_test.h" +#include "testbail.h" + +namespace N_TestBail +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + IGaben *g_Gabgab; +} + +namespace +{ + int EatYams_Handler1(int a) + { + ADD_STATE(State_EatYams_Handler1_Called(a)); + RETURN_META_VALUE(MRES_IGNORED, 0); + } +} + +bool TestBail(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1; + + g_Gabgab = new IGaben; + + SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); + + ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); + + CHECK_STATES((&g_States, + new State_EatYams_Handler1_Called(0xDEAD), + new State_EatYams_Called(0xDEAD), + new State_EatYams_Return(5), + NULL), "Part 1"); + + if (!TestBail2(error)) + return false; + + CHECK_STATES((&g_States, + new State_EatYams_Handler1_Called(0xDEAD), + new State_EatYams_Handler2_Called(0xDEAD), + new State_EatYams_Handler3_Called(0xBEEF), + new State_EatYams_Called(0xBEEF), + NULL), "Part 2.1"); + + // WHAT IF NOW SOMEONE UNLOADS PLUGIN 2 !?!?!?!? + Test_UnloadPlugin(g_SHPtr, 2); + + ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); + + CHECK_STATES((&g_States, + new State_EatYams_Handler1_Called(0xDEAD), + new State_EatYams_Called(0xDEAD), + new State_EatYams_Return(5), + NULL), "Part 3"); + + SH_REMOVE_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); + + ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); + + CHECK_STATES((&g_States, + new State_EatYams_Called(0xDEAD), + new State_EatYams_Return(5), + NULL), "Part 4"); + + // Now, heh, try it the other way round. + + Test_CompleteShutdown(g_SHPtr); + + if (!TestBail2(error)) + return false; + + CHECK_STATES((&g_States, + new State_EatYams_Handler2_Called(0xDEAD), + new State_EatYams_Handler3_Called(0xBEEF), + new State_EatYams_Called(0xBEEF), + NULL), "Part 5"); + + SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); + + ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); + + CHECK_STATES((&g_States, + new State_EatYams_Handler2_Called(0xDEAD), + new State_EatYams_Handler3_Called(0xBEEF), + new State_EatYams_Handler1_Called(0xBEEF), + new State_EatYams_Called(0xBEEF), + new State_EatYams_Return(6), + NULL), "Part 6"); + + delete g_Gabgab; + + return true; +} diff --git a/sourcehook/test/testbail.h b/sourcehook/test/testbail.h new file mode 100644 index 0000000..258a49c --- /dev/null +++ b/sourcehook/test/testbail.h @@ -0,0 +1,39 @@ +////////////////////////////////////////////////////////////////////////// +// Shared data for testbail + +#include +#include "testevents.h" + +namespace N_TestBail +{ + extern StateList g_States; + extern SourceHook::ISourceHook *g_SHPtr; + + MAKE_STATE_1(State_EatYams_Called, int); + MAKE_STATE_1(State_EatYams_Handler1_Called, int); + MAKE_STATE_1(State_EatYams_Handler2_Called, int); + MAKE_STATE_1(State_EatYams_Handler3_Called, int); + MAKE_STATE_1(State_EatYams_Return, int); + + class IGaben + { + public: + virtual int EatYams(int a) + { + ADD_STATE(State_EatYams_Called(a)); + return 5; + } + }; + + extern IGaben *g_Gabgab; + + bool TestBail2(std::string &error); +} + +using namespace N_TestBail; + +namespace +{ + SourceHook::Plugin g_PLID; + SH_DECL_HOOK1(IGaben, EatYams, SH_NOATTRIB, 0, int, int); +} diff --git a/sourcehook/test/testbail2.cpp b/sourcehook/test/testbail2.cpp new file mode 100644 index 0000000..3c5db52 --- /dev/null +++ b/sourcehook/test/testbail2.cpp @@ -0,0 +1,36 @@ +// TESTBAIL +// Different compilation unit + +#include "sourcehook.h" +#include "sourcehook_test.h" +#include "testbail.h" + + +int EatYams_Handler2(int a) +{ + ADD_STATE(State_EatYams_Handler2_Called(a)); + RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, 6, &IGaben::EatYams, (0xBEEF)); +} + +int EatYams_Handler3(int a) +{ + ADD_STATE(State_EatYams_Handler3_Called(a)); + RETURN_META_VALUE(MRES_IGNORED, 0); +} + +namespace N_TestBail +{ + bool TestBail2(std::string &error) + { + g_PLID = 2; + + SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler2, false); + SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler3, false); + + int ret = g_Gabgab->EatYams(0xDEAD); + + CHECK_COND(ret == 6, "Part 2.1"); + + return true; + } +} diff --git a/sourcehook/test/testevents.h b/sourcehook/test/testevents.h new file mode 100644 index 0000000..ef7c891 --- /dev/null +++ b/sourcehook/test/testevents.h @@ -0,0 +1,153 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +#ifndef __TESTEVENTS_H__ +#define __TESTEVENTS_H__ + +#include +#include +#include +#include +#include + +extern bool g_Verbose; + +struct State +{ + virtual ~State() + { + + } + + virtual bool IsEqual(State *other) + { + return (typeid(other) == typeid(this)) ? true : false; + } + + virtual void Dump() = 0; +}; + +typedef std::list StateList; +namespace +{ + void DumpStates(StateList *sl) + { + for (StateList::iterator iter = sl->begin(); iter != sl->end(); ++iter) + (*iter)->Dump(); + } + + bool StatesOk(StateList *sl, ...) + { + StateList requiredstates; + va_list argptr; + va_start(argptr, sl); + while (true) + { + State *cs = va_arg(argptr, State*); + if (!cs) + break; + requiredstates.push_back(cs); + } + va_end(argptr); + + if (requiredstates.size() != sl->size()) + { + if (g_Verbose) + { + std::cout << std::endl << "FAIL: Should be:" << std::endl; + DumpStates(&requiredstates); + std::cout << std::endl << "FAIL: Is:" << std::endl; + DumpStates(sl); + } + + for (StateList::iterator iter = requiredstates.begin(); iter != requiredstates.end(); ++iter) + delete *iter; + for (StateList::iterator iter = sl->begin(); iter != sl->end(); ++iter) + delete *iter; + sl->clear(); + return false; + } + + bool ok = true; + StateList::iterator req_iter = requiredstates.begin(); + for (StateList::iterator o_iter = sl->begin(); o_iter != sl->end(); ++o_iter, ++req_iter) + { + if (!(*o_iter)->IsEqual(*req_iter)) + { + ok = false; + break; + } + } + + for (StateList::iterator iter = requiredstates.begin(); iter != requiredstates.end(); ++iter) + delete *iter; + for (StateList::iterator iter = sl->begin(); iter != sl->end(); ++iter) + delete *iter; + sl->clear(); + + return ok; + } +} + +#define ADD_STATE(name) g_States.push_back(new name) +#define ADD_STATE_PTR(statesptr, name) statesptr->push_back(new name) + +#define CHECK_STATES(mwah, myerr) if (!StatesOk mwah) { error=myerr; return false; } else if (g_Verbose) { std::cout << "No error: " << myerr << std::endl; } + +#define MAKE_STATE(name) struct name : State { \ + virtual void Dump() { \ + std::cout << " " << #name << std::endl; } \ + }; + +#define MAKE_STATE_1(name, p1_type) struct name : State { \ + p1_type m_Param1; \ + name(p1_type param1) : m_Param1(param1) {} \ + virtual bool IsEqual(State *other) { \ + name *other2 = dynamic_cast(other); \ + if (!other2) \ + return false; \ + return other2->m_Param1 == m_Param1;\ + } \ + virtual void Dump() { \ + std::cout << " " << #name << "; Param1=" << m_Param1 << std::endl; } \ + } + +#define MAKE_STATE_2(name, p1_type, p2_type) struct name : State { \ + p1_type m_Param1; \ + p2_type m_Param2; \ + name(p1_type param1, p2_type param2) : m_Param1(param1), m_Param2(param2) {} \ + virtual bool IsEqual(State *other) { \ + name *other2 = dynamic_cast(other); \ + if (!other2) \ + return false; \ + return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2;\ + } \ + virtual void Dump() { \ + std::cout << " " << #name << "; Param1=" << m_Param1 << "; Param2=" << m_Param2 << std::endl; } \ + } + +#define MAKE_STATE_3(name, p1_type, p2_type, p3_type) struct name : State { \ + p1_type m_Param1; \ + p2_type m_Param2; \ + p3_type m_Param3; \ + name(p1_type param1, p2_type param2, p3_type param3) : m_Param1(param1), m_Param2(param2), m_Param3(param3) {} \ + virtual bool IsEqual(State *other) { \ + name *other2 = dynamic_cast(other); \ + if (!other2) \ + return false; \ + return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2 && other2->m_Param3 == m_Param3;\ + } \ + virtual void Dump() { \ + std::cout << " " << #name << "; Param1=" << m_Param1 << "; Param2=" << m_Param2 << "; Param3=" << m_Param3 << std::endl; } \ + } + +#define CHECK_COND(c, err) if (!(c)) { error = err; return false; } + +#endif diff --git a/sourcehook/test/testlist.cpp b/sourcehook/test/testlist.cpp new file mode 100644 index 0000000..bbaa4d3 --- /dev/null +++ b/sourcehook/test/testlist.cpp @@ -0,0 +1,282 @@ +#include +#include "sh_list.h" +#include "sh_stack.h" +#include "sh_tinyhash.h" +#include "sh_vector.h" +#include "testevents.h" + +// TEST LIST +// Tests sh_list, sh_tinyhash, sh_vector + +// :TODO: vector test, list insert test + +namespace +{ + struct Hmm + { + Hmm *m_This; + int m_Int; + Hmm(const Hmm &other) : m_Int(other.m_Int) + { + m_This = this; + } + Hmm(int i) : m_Int(i) + { + m_This = this; + } + Hmm() : m_Int(0) + { + m_This = this; + } + void operator = (const Hmm &other) + { + m_Int = other.m_Int; + } + operator int () const + { + return m_Int; + } + }; + + #define LIST_THIS_CHECK(lst, err) \ + for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) \ + CHECK_COND(&(*iter) == iter->m_This, err); + + bool DoTestList(std::string &error) + { + typedef SourceHook::List ListType; + ListType lst; + + CHECK_COND(lst.empty(), "Part1"); + + for (int i = 1; i <= 100; ++i) + lst.push_back(i); + + LIST_THIS_CHECK(lst, "PartA1"); + + CHECK_COND(!lst.empty(), "Part2"); + + lst.clear(); + + CHECK_COND(lst.empty(), "Part3"); + + for (int i = 1; i <= 100; ++i) + lst.push_back(i); + + CHECK_COND(lst.back() == 100, "Part4"); + LIST_THIS_CHECK(lst, "PartA2"); + + int ver = 1; + for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) + CHECK_COND(*iter == ver++, "Part5"); + + CHECK_COND(ver == 101, "Part 6"); + + ListType::iterator iter50 = lst.find(50); + CHECK_COND(*iter50 == 50, "Part7"); + + iter50 = lst.erase(iter50); + CHECK_COND(*iter50 == 51, "Part8"); + CHECK_COND(*--iter50 == 49, "Part8.2"); + + lst.remove(80); + + ver = 1; + for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) + { + CHECK_COND(*iter == ver++, "Part9"); + if (ver == 50 || ver == 80) + ++ver; + } + CHECK_COND(ver == 101, "Part10"); + LIST_THIS_CHECK(lst, "PartA3"); + + ListType lst2; + lst = lst2; + CHECK_COND(lst.empty(), "Part11"); + + for (int i = 1; i <= 100; ++i) + lst.push_back(i); + lst2 = lst; + CHECK_COND(lst2.size() == 100, "Part11.2"); + + LIST_THIS_CHECK(lst, "PartA4"); + LIST_THIS_CHECK(lst2, "PartA5"); + + ver = 1; + for (ListType::iterator iter = lst2.begin(); iter != lst2.end(); ++iter) + CHECK_COND(*iter == ver++, "Part12"); + + lst.clear(); + for (int i = 401; i <= 500; ++i) + lst.push_back(i); + lst = lst2; + CHECK_COND(lst2.size() == 100, "Part13"); + + ver = 1; + for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) + CHECK_COND(*iter == ver++, "Part14"); + + LIST_THIS_CHECK(lst, "PartA6"); + LIST_THIS_CHECK(lst2, "PartA7"); + + return true; + } + + bool DoTestTinyHash(std::string &error) + { + const int mymax = 5000; + + typedef SourceHook::THash HashType; + HashType hash; + + for (int i = 1; i <= mymax; ++i) + hash[i] = i + 5000; + + for (int i = 1; i <= mymax; ++i) + CHECK_COND(hash[i] == i + 5000, "Part1"); + + // Find + int ver = 1; + HashType::iterator iter; + for (iter = hash.begin(); iter != hash.end(); ++iter) + CHECK_COND(iter->key == ver && iter->val == (ver++) + 5000, "Part2"); + + CHECK_COND(ver == mymax+1, "Part2.1"); + + iter = hash.find(300); + CHECK_COND(iter != hash.end() && iter->val == 300+5000, "Part3.1"); + iter = hash.find(mymax+200); + CHECK_COND(iter == hash.end(), "Part3.2"); + + HashType hash2; + for (int i = 1; i <= mymax; ++i) + hash2[i] = i + 5000; + + hash2.erase(mymax - 100); + CHECK_COND(hash2.find(mymax - 101) != hash2.end(), "Part 4.1"); + CHECK_COND(hash2.find(mymax - 99) != hash2.end(), "Part 4.2"); + CHECK_COND(hash2.find(mymax - 100) == hash2.end(), "Part 4.3"); + hash2.erase(mymax - 99); + CHECK_COND(hash2.find(mymax - 101) != hash2.end(), "Part 4.4"); + CHECK_COND(hash2.find(mymax - 99) == hash2.end(), "Part 4.5"); + CHECK_COND(hash2.find(mymax - 100) == hash2.end(), "Part 4.6"); + + return true; + } + + bool DoTestStack(std::string &error) + { + typedef SourceHook::CStack IntStack; + IntStack stk; + int i; + + CHECK_COND(stk.size() == 0 && stk.empty(), "A0"); + + for (i = 0; i < 5000; ++i) + stk.push(i); + + CHECK_COND(stk.front() == 4999, "1"); + CHECK_COND(stk.size() == 5000 && !stk.empty(), "A1"); + + IntStack::iterator iter; + i = 0; + for (iter = stk.begin(); iter != stk.end(); ++iter, ++i) + CHECK_COND(*iter == i, "2"); + + i = 0; + for (iter = stk.begin(); iter != stk.end(); iter++, ++i) + CHECK_COND(*iter == i, "3"); + + --iter; + iter--; + *iter = 'g'+'a'+'b'+'e'+'n'; + stk.pop(); + + CHECK_COND(stk.size() == 4999 && !stk.empty(), "A2"); + CHECK_COND(stk.front() == 'g'+'a'+'b'+'e'+'n', "4"); + + IntStack stk2(stk); + CHECK_COND(stk2.size() == 4999 && !stk2.empty(), "A3"); + + IntStack::iterator iter2 = stk2.begin(); + for (iter = stk.begin(); iter != stk.end(); ++iter, iter2++) + CHECK_COND(*iter == *iter2, "5"); + + while (!stk2.empty()) + stk2.pop(); + CHECK_COND(stk2.size() == 0 && stk2.empty(), "A4"); + stk = stk2; + CHECK_COND(stk.size() == 0 && stk.empty(), "A5"); + + return true; + } + + bool DoTestVec(std::string &error) + { + typedef SourceHook::CVector IntVector; + IntVector vec1; + IntVector::iterator iter; + int i; + + CHECK_COND(vec1.size() == 0 && vec1.empty(), "V1"); + for (i = 0; i < 500; ++i) + vec1.push_back(i); + + CHECK_COND(vec1.size() == 500 && !vec1.empty(), "V2"); + + for (i = 0; i < 500; ++i) + CHECK_COND(vec1[i] == i, "V3"); + + for (i = 0, iter = vec1.begin(); iter != vec1.end(); ++iter, ++i) + CHECK_COND(*iter == i, "V4"); + + vec1.resize(1000); + for (i = 0; i < 500; ++i) + CHECK_COND(vec1[i] == i, "V5.1"); + for (i = 500; i < 1000; ++i) + CHECK_COND(vec1[i] == 0, "V5.2"); + + vec1.resize(200); + for (i = 0; i < 200; ++i) + CHECK_COND(vec1[i] == i, "V6"); + + vec1.resize(500, 0x12345678); + for (i = 0; i < 200; ++i) + CHECK_COND(vec1[i] == i, "V7.1"); + for (i = 200; i < 500; ++i) + CHECK_COND(vec1[i] == 0x12345678, "V7.2"); + + IntVector vec2(vec1); + CHECK_COND(vec2.size() == vec1.size() && vec2.empty() == vec1.empty(), "V8.0"); + for (i = 0; i < 200; ++i) + CHECK_COND(vec2[i] == i, "V8.1"); + for (i = 200; i < 500; ++i) + CHECK_COND(vec2[i] == 0x12345678, "V8.2"); + + + vec1.clear(); + CHECK_COND(vec1.size() == 0 && vec1.empty() && vec1.begin() == vec1.end(), "V9"); + vec2 = vec1; + CHECK_COND(vec2.size() == 0 && vec2.empty() && vec2.begin() == vec2.end(), "V9"); + + return true; + } +} + +bool TestList(std::string &error) +{ + if (!DoTestList(error)) + return false; + + if (!DoTestTinyHash(error)) + return false; + + if (!DoTestStack(error)) + return false; + + if (!DoTestVec(error)) + return false; + + return true; +} diff --git a/sourcehook/test/testmanual.cpp b/sourcehook/test/testmanual.cpp new file mode 100644 index 0000000..0d1013a --- /dev/null +++ b/sourcehook/test/testmanual.cpp @@ -0,0 +1,355 @@ +#include +#include "sourcehook.h" +#include "sourcehook_test.h" +#include "testevents.h" + +// TESTMANUAL +// Test manual hooks +// :TODO: test more extensively + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + MAKE_STATE_1(State_Func1_Called, void*); // param1: This pointer + MAKE_STATE_2(State_Func2_Called, void*, int); // param1: This pointer; param2: parameter + MAKE_STATE_1(State_Func3_Called, void*); // param1: This pointer + MAKE_STATE_2(State_Func4_Called, void*, int); // param1: This pointer; param2: parameter + MAKE_STATE_1(State_Func5_Called, void*); // param1: This pointer + + MAKE_STATE_1(State_Func1H_Called, void*); + MAKE_STATE_2(State_Func2H_Called, void*, int); + MAKE_STATE_1(State_Func3H_Called, void*); + MAKE_STATE_2(State_Func4H_Called, void*, int); + + MAKE_STATE_1(State_Return, short); + + class TheWall + { + public: + virtual void Func1() + { + ADD_STATE(State_Func1_Called(reinterpret_cast(this))); + } + virtual void Func2(int x) + { + ADD_STATE(State_Func2_Called(reinterpret_cast(this), x)); + } + + virtual short Func3() + { + ADD_STATE(State_Func3_Called(reinterpret_cast(this))); + return 3; + } + virtual short Func4(int x) + { + ADD_STATE(State_Func4_Called(reinterpret_cast(this), x)); + return 4; + } + virtual void Func5() + { + ADD_STATE(State_Func5_Called(reinterpret_cast(this))); + } + }; + + SH_DECL_HOOK0_void(TheWall, Func1, SH_NOATTRIB, 0); + SH_DECL_HOOK1_void(TheWall, Func2, SH_NOATTRIB, 0, int); + SH_DECL_HOOK0(TheWall, Func3, SH_NOATTRIB, 0, short); + SH_DECL_HOOK1(TheWall, Func4, SH_NOATTRIB, 0, short, int); + + SH_DECL_MANUALHOOK0_void(TheWall_Func1, 0, 0, 0); + SH_DECL_MANUALHOOK1_void(TheWall_Func2, 1, 0, 0, int); + SH_DECL_MANUALHOOK0(TheWall_Func3, 2, 0, 0, short); + SH_DECL_MANUALHOOK1(TheWall_Func4, 3, 0, 0, short, int); + + typedef void (SourceHook::EmptyClass::*MFP_Func1)(); + typedef void (SourceHook::EmptyClass::*MFP_Func2)(int); + typedef short (SourceHook::EmptyClass::*MFP_Func3)(); + typedef short (SourceHook::EmptyClass::*MFP_Func4)(int); + + void Handler_Func1() + { + ADD_STATE(State_Func1H_Called(META_IFACEPTR(void))); + } + void Handler_Func2(int x) + { + ADD_STATE(State_Func2H_Called(META_IFACEPTR(void), x)); + RETURN_META_MNEWPARAMS(MRES_IGNORED, TheWall_Func2, (0x87654321)); + } + short Handler_Func3() + { + ADD_STATE(State_Func3H_Called(META_IFACEPTR(void))); + return 0; + } + short Handler_Func4(int x) + { + ADD_STATE(State_Func4H_Called(META_IFACEPTR(void), x)); + + // newparams (recall) using the manual hook declaration! + RETURN_META_VALUE_MNEWPARAMS(MRES_IGNORED, 0, TheWall_Func4, (0x12345678)); + } + + struct AnotherBrick + { + void Handler_Func1() + { + ADD_STATE(State_Func1H_Called(META_IFACEPTR(void))); + RETURN_META(MRES_SUPERCEDE); + } + }; +} + +bool TestManual(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1337; + + TheWall inst; + TheWall *p = &inst; + + SourceHook::ManualCallClass *cc = SH_GET_MCALLCLASS(p, sizeof(void*)); + + // 1) + // Call each function + p->Func1(); + p->Func2(200); + ADD_STATE(State_Return(p->Func3())); + ADD_STATE(State_Return(p->Func4(400))); + + CHECK_STATES((&g_States, + new State_Func1_Called(p), + new State_Func2_Called(p, 200), + new State_Func3_Called(p), + new State_Return(3), + new State_Func4_Called(p, 400), + new State_Return(4), + NULL), "Part 1"); + + // 1.1) + // Now call each function through the manual call class, using the hook decl and manually + SH_MCALL(cc, TheWall_Func1)(); + SH_MCALL2(cc, MFP_Func1(), 0, 0, 0)(); + SH_MCALL(cc, TheWall_Func2)(200); + SH_MCALL2(cc, MFP_Func2(), 1, 0, 0)(200); + ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func3)())); + ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func3(), 2, 0, 0)())); + ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func4)(400))); + ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func4(), 3, 0, 0)(400))); + + CHECK_STATES((&g_States, + new State_Func1_Called(p), + new State_Func1_Called(p), + new State_Func2_Called(p, 200), + new State_Func2_Called(p, 200), + new State_Func3_Called(p), + new State_Return(3), + new State_Func3_Called(p), + new State_Return(3), + new State_Func4_Called(p, 400), + new State_Return(4), + new State_Func4_Called(p, 400), + new State_Return(4), + NULL), "Part 1.1"); + + // 2) + // Hook each function normally, call them + SH_ADD_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); + SH_ADD_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); + SH_ADD_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); + + p->Func1(); + p->Func2(200); + ADD_STATE(State_Return(p->Func3())); + ADD_STATE(State_Return(p->Func4(400))); + + CHECK_STATES((&g_States, + new State_Func1H_Called(p), + new State_Func1_Called(p), + new State_Func2H_Called(p, 200), + new State_Func2_Called(p, 0x87654321), + new State_Func3H_Called(p), + new State_Func3_Called(p), + new State_Return(3), + new State_Func4H_Called(p, 400), + new State_Func4_Called(p, 0x12345678), + new State_Return(4), + NULL), "Part 2"); + + // Call them through the mcallclass + // 2.1) + // Now call each function through the manual call class, using the hook decl and manually + SH_MCALL(cc, TheWall_Func1)(); + SH_MCALL2(cc, MFP_Func1(), 0, 0, 0)(); + SH_MCALL(cc, TheWall_Func2)(200); + SH_MCALL2(cc, MFP_Func2(), 1, 0, 0)(200); + ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func3)())); + ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func3(), 2, 0, 0)())); + ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func4)(400))); + ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func4(), 3, 0, 0)(400))); + + CHECK_STATES((&g_States, + new State_Func1_Called(p), + new State_Func1_Called(p), + new State_Func2_Called(p, 200), + new State_Func2_Called(p, 200), + new State_Func3_Called(p), + new State_Return(3), + new State_Func3_Called(p), + new State_Return(3), + new State_Func4_Called(p, 400), + new State_Return(4), + new State_Func4_Called(p, 400), + new State_Return(4), + NULL), "Part 2.1"); + + // Unhook them + SH_REMOVE_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); + SH_REMOVE_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); + SH_REMOVE_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); + SH_REMOVE_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); + + // 3) + // Hook each function manually, call them + + SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func1, p, Handler_Func1, false); + SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); + SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); + SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); + + p->Func1(); + p->Func2(200); + ADD_STATE(State_Return(p->Func3())); + ADD_STATE(State_Return(p->Func4(400))); + + CHECK_STATES((&g_States, + new State_Func1H_Called(p), + new State_Func1_Called(p), + new State_Func2H_Called(p, 200), + new State_Func2_Called(p, 0x87654321), + new State_Func3H_Called(p), + new State_Func3_Called(p), + new State_Return(3), + new State_Func4H_Called(p, 400), + new State_Func4_Called(p, 0x12345678), + new State_Return(4), + NULL), "Part 3"); + + // Now through the mcallclass + + // Call them through the mcallclass + // 3.1) + // Now call each function through the manual call class, using the hook decl and manually + SH_MCALL(cc, TheWall_Func1)(); + SH_MCALL2(cc, MFP_Func1(), 0, 0, 0)(); + SH_MCALL(cc, TheWall_Func2)(200); + SH_MCALL2(cc, MFP_Func2(), 1, 0, 0)(200); + ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func3)())); + ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func3(), 2, 0, 0)())); + ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func4)(400))); + ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func4(), 3, 0, 0)(400))); + + CHECK_STATES((&g_States, + new State_Func1_Called(p), + new State_Func1_Called(p), + new State_Func2_Called(p, 200), + new State_Func2_Called(p, 200), + new State_Func3_Called(p), + new State_Return(3), + new State_Func3_Called(p), + new State_Return(3), + new State_Func4_Called(p, 400), + new State_Return(4), + new State_Func4_Called(p, 400), + new State_Return(4), + NULL), "Part 3.1"); + + // Unhook them + SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func1, p, Handler_Func1, false); + SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); + SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); + SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); + + // 4) + // Hook each function manually, then normally, call, unhook + + AnotherBrick handler_inst; + + // Why this? + // 1) tests sh_add_manualhook_memfunc + // 2) in my tests, the proto of the manual hook was not equal to the proto of the auto hook + // (because there are no attribs for manual hooks). + // sourcehook.cpp did a !strcmp(..), so it assigned a new hook manager even though there + // already was one for this vfnptr. This hook manager stored the pointer of the original + // hook manager's hookfunc as the orig pointer - everything seemingly worked. + // The problem with this is that returning MRES_SUPERCEDE (as AnotherBrick::Handler_Func1 + // does) will supercede the second hook func from being called - thus bypassing the call + // of the auto hook here. + SH_ADD_MANUALHOOK_MEMFUNC(TheWall_Func1, p, &handler_inst, &AnotherBrick::Handler_Func1, false); + SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); + SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); + SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); + + SH_ADD_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); + SH_ADD_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); + SH_ADD_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); + SH_ADD_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); + + p->Func1(); + p->Func2(200); + ADD_STATE(State_Return(p->Func3())); + ADD_STATE(State_Return(p->Func4(400))); + + CHECK_STATES((&g_States, + new State_Func1H_Called(p), + new State_Func1H_Called(p), + //new State_Func1_Called(p), + new State_Func2H_Called(p, 200), + new State_Func2H_Called(p, 0x87654321), + new State_Func2_Called(p, 0x87654321), + new State_Func3H_Called(p), + new State_Func3H_Called(p), + new State_Func3_Called(p), + new State_Return(3), + new State_Func4H_Called(p, 400), + new State_Func4H_Called(p, 0x12345678), + new State_Func4_Called(p, 0x12345678), + new State_Return(4), + NULL), "Part 4"); + + SH_REMOVE_MANUALHOOK_MEMFUNC(TheWall_Func1, p, &handler_inst, &AnotherBrick::Handler_Func1, false); + SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); + SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); + SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); + + SH_REMOVE_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); + SH_REMOVE_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); + SH_REMOVE_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); + SH_REMOVE_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); + + // 5) Reconfigure TheWall_Func1 to actually hook Func5: + SH_MANUALHOOK_RECONFIGURE(TheWall_Func1, 4, 0, 0); + SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func1, p, Handler_Func1, false); + + p->Func5(); + + CHECK_STATES((&g_States, + new State_Func1H_Called(p), + new State_Func5_Called(p), + NULL), "Part 5"); + + // 6) Test auto-remove on reconfig + SH_MANUALHOOK_RECONFIGURE(TheWall_Func1, 0, 0, 0); + + p->Func1(); + p->Func5(); + + CHECK_STATES((&g_States, + new State_Func1_Called(p), + new State_Func5_Called(p), + NULL), "Part 6"); + + return true; +} diff --git a/sourcehook/test/testmulti.cpp b/sourcehook/test/testmulti.cpp new file mode 100644 index 0000000..2e4ca9a --- /dev/null +++ b/sourcehook/test/testmulti.cpp @@ -0,0 +1,106 @@ +#include +#include "sourcehook.h" +#include "sourcehook_test.h" +#include "testevents.h" + +// This should probably be done the other way round! +#ifdef __linux__ +#define _snprintf snprintf +#endif + +namespace +{ + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + unsigned int g_callcount[10]; + + class VMultiTest + { + public: + VMultiTest(unsigned int index) : m_idx(index) + { + } + public: + virtual void HookTarget() + { + } + virtual void Notify() + { + g_callcount[this->m_idx]++; + } + private: + unsigned int m_idx; + }; + + void HookFunction() + { + VMultiTest *pv = META_IFACEPTR(VMultiTest); + pv->Notify(); + } + + SH_DECL_HOOK0_void(VMultiTest, HookTarget, SH_NOATTRIB, false); +}; + +bool TestMulti(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1337; + + VMultiTest **pv = new VMultiTest *[10]; + for (unsigned int i=0; i<10; i++) + pv[i] = new VMultiTest(i); + + + for (unsigned int i=0; i<10; i++) + SH_ADD_HOOK_STATICFUNC(VMultiTest, HookTarget, pv[i], HookFunction, false); + + pv[0]->HookTarget(); + + if (g_callcount[0] != 1) + { + error.assign("g_callcount[0] != 0"); + return false; + } + + for (unsigned int i=1; i<10; i++) + { + if (g_callcount[i]) + { + error.assign("g_callcount[n] != 0"); + return false; + } + } + + SH_REMOVE_HOOK_STATICFUNC(VMultiTest, HookTarget, pv[0], HookFunction, false); + + for (unsigned int i=1; i<10; i++) + pv[i]->HookTarget(); + + if (g_callcount[0] != 1) + { + error.assign("g_callcount[0] != 0"); + return false; + } + + for (unsigned int i=1; i<10; i++) + { + if (g_callcount[i] != 1) + { + char err[256]; + _snprintf(err, sizeof(err)-1, "g_callcount[%d] != 1", i); + error.assign(err); + return false; + } + } + + for (unsigned int i=1; i<10; i++) + { + SH_REMOVE_HOOK_STATICFUNC(VMultiTest, HookTarget, pv[1], HookFunction, false); + delete pv[i]; + } + + delete [] pv; + + return true; +} diff --git a/sourcehook/test/testrecall.cpp b/sourcehook/test/testrecall.cpp new file mode 100644 index 0000000..a80ad1b --- /dev/null +++ b/sourcehook/test/testrecall.cpp @@ -0,0 +1,226 @@ +#include +#include "sourcehook.h" +#include "sourcehook_test.h" +#include "testevents.h" + +// TESTRECALL +// Test modifying parameters from hook handlers + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + MAKE_STATE_1(State_Func1, int); + MAKE_STATE_1(State_H1_Func1, int); + MAKE_STATE_1(State_H2_Func1, int); + MAKE_STATE_2(State_HP_Func1, int, void*); + + MAKE_STATE_1(State_Func2, int); + MAKE_STATE_1(State_H1_Func2, int); + MAKE_STATE_1(State_H2_Func2, int); + MAKE_STATE_2(State_HP_Func2, int, int); + + MAKE_STATE_2(State_Func22, int, int); + MAKE_STATE_2(State_H1_Func22, int, int); + MAKE_STATE_2(State_HP1_Func22, int, int); + MAKE_STATE_2(State_HP2_Func22, int, int); + + struct Test + { + virtual void Func1(int a) + { + ADD_STATE(State_Func1(a)); + } + + virtual int Func2(int a) + { + ADD_STATE(State_Func2(a)); + return 1000; + } + + // Overloaded version + virtual int Func2(int a, int b) + { + ADD_STATE(State_Func22(a, b)); + return 0xDEADFC; + } + }; + + void Handler1_Func1(int a) + { + ADD_STATE(State_H1_Func1(a)); + RETURN_META_NEWPARAMS(MRES_IGNORED, &Test::Func1, (5)); + } + void Handler2_Func1(int a) + { + ADD_STATE(State_H2_Func1(a)); + RETURN_META_NEWPARAMS(MRES_IGNORED, &Test::Func1, (a - 5)); + } + void HandlerPost_Func1(int a) + { + ADD_STATE(State_HP_Func1(a, META_IFACEPTR(void))); + } + + + int Handler1_Func2(int a) + { + ADD_STATE(State_H1_Func2(a)); + // Pfeeehhh, ugly, I know, but I had to test it :) + RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, 500, + static_cast(&Test::Func2), (a - 10)); + } + + int Handler2_Func2(int a) + { + ADD_STATE(State_H2_Func2(a)); + RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, 0, + static_cast(&Test::Func2), (a - 10)); + } + + int HandlerPost_Func2(int a) + { + ADD_STATE(State_HP_Func2(a, META_RESULT_ORIG_RET(int))); + RETURN_META_VALUE(MRES_IGNORED, 0); + } + + int Handler1_Func22(int a, int b) + { + ADD_STATE(State_H1_Func22(a, b)); + RETURN_META_VALUE(MRES_IGNORED, 0); + } + + int HandlerPost1_Func22(int a, int b) + { + ADD_STATE(State_HP1_Func22(a, b)); + RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, 0, static_cast(&Test::Func2), (1, 2)); + } + + int HandlerPost1A_Func22(int a, int b) + { + ADD_STATE(State_HP1_Func22(a, b)); + RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, 0, static_cast(&Test::Func2), (1, 2)); + } + + int HandlerPost2_Func22(int a, int b) + { + ADD_STATE(State_HP2_Func22(a, b)); + RETURN_META_VALUE(MRES_IGNORED, 0); + } + + SH_DECL_HOOK1_void(Test, Func1, SH_NOATTRIB, 0, int); + SH_DECL_HOOK1(Test, Func2, SH_NOATTRIB, 0, int, int); + SH_DECL_HOOK2(Test, Func2, SH_NOATTRIB, 1, int, int, int); +} + +bool TestRecall(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1337; + + Test inst; + Test *ptr = &inst; + + SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler1_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, HandlerPost_Func1, true); + + ptr->Func1(77); + + CHECK_STATES((&g_States, + new State_H1_Func1(77), + new State_H2_Func1(5), + new State_Func1(0), + new State_HP_Func1(0, ptr), + NULL), "Part 1"); + + SH_REMOVE_HOOK_STATICFUNC(Test, Func1, ptr, Handler1_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); + SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); + + ptr->Func1(77); + + CHECK_STATES((&g_States, + new State_H2_Func1(77), + new State_H2_Func1(72), + new State_H2_Func1(67), + new State_H2_Func1(62), + new State_Func1(57), + new State_HP_Func1(57, ptr), + NULL), "Part 2"); + + SH_REMOVE_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); + SH_REMOVE_HOOK_STATICFUNC(Test, Func1, ptr, HandlerPost_Func1, true); + + ptr->Func1(77); + + CHECK_STATES((&g_States, + new State_Func1(77), + NULL), "Part 3"); + + // Func2 + + SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func2, false); + SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost_Func2, true); + + int a = ptr->Func2(77); + CHECK_STATES((&g_States, + new State_H1_Func2(77), + new State_Func2(67), + new State_HP_Func2(67, 1000), // 1000 because it's the ORIG_RET + NULL), "Part 4"); + + CHECK_COND(a == 500, "Part 4.1"); + + // Func2, with other handler + SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func2, false); + SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, Handler2_Func2, false); + + a = ptr->Func2(77); + CHECK_STATES((&g_States, + new State_H2_Func2(77), + new State_Func2(67), + new State_HP_Func2(67, 1000), // 1000 because it's the ORIG_RET + NULL), "Part 4.2"); + + CHECK_COND(a == 1000, "Part 4.2.1"); // Should return 1000 as well. + + // Func22 -> post recalls + + // 1) WITH OVERRIDE + + SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func22, false); + SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1A_Func22, true); + SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); + + a = ptr->Func2(10, 11); + CHECK_STATES((&g_States, + new State_H1_Func22(10, 11), + new State_Func22(10, 11), + new State_HP1_Func22(10, 11), + new State_HP2_Func22(1, 2), + NULL), "Part 5"); + + CHECK_COND(a == 0, "Part 5.1"); + + // 2) WITH IGNORE + SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1A_Func22, true); + SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); + + SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1_Func22, true); + SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); + + a = ptr->Func2(10, 11); + CHECK_STATES((&g_States, + new State_H1_Func22(10, 11), + new State_Func22(10, 11), + new State_HP1_Func22(10, 11), + new State_HP2_Func22(1, 2), + NULL), "Part 5"); + + CHECK_COND(a == 0xDEADFC, "Part 5.1"); + + return true; +} diff --git a/sourcehook/test/testreentr.cpp b/sourcehook/test/testreentr.cpp new file mode 100644 index 0000000..b4f0ec5 --- /dev/null +++ b/sourcehook/test/testreentr.cpp @@ -0,0 +1,599 @@ +// Reentrancy test +// = calling hooks from hook handlers, etc + +#include +#include "sourcehook_test.h" +#include "testevents.h" + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + struct C1; + struct C2; + struct C3; + struct C4; + struct C5; + struct C6; + struct C7; + struct C8; + + C1 *g_pC1; + C2 *g_pC2; + C3 *g_pC3; + C4 *g_pC4; + C5 *g_pC5; + C6 *g_pC6; + C7 *g_pC7; + C8 *g_pC8; + + // param1: This pointer + MAKE_STATE_1(State_C1_F, C1*); + MAKE_STATE_1(State_C2_F, C2*); + MAKE_STATE_1(State_C3_F, C3*); + MAKE_STATE_1(State_C4_F, C4*); + MAKE_STATE_1(State_C5_F, C5*); + MAKE_STATE_1(State_C6_F, C6*); + MAKE_STATE_1(State_C7_F, C7*); + MAKE_STATE_1(State_C8_F, C8*); + + MAKE_STATE_1(State_C1_G, C1*); + MAKE_STATE_1(State_C2_G, C2*); + MAKE_STATE_1(State_C3_G, C3*); + MAKE_STATE_1(State_C4_G, C4*); + MAKE_STATE_1(State_C5_G, C5*); + MAKE_STATE_1(State_C6_G, C6*); + MAKE_STATE_1(State_C7_G, C7*); + MAKE_STATE_1(State_C8_G, C8*); + + MAKE_STATE_1(State_H_C1_F, C1*); + MAKE_STATE_1(State_H_C2_F, C2*); + MAKE_STATE_1(State_H_C3_F, C3*); + MAKE_STATE_1(State_H_C4_F, C4*); + MAKE_STATE_1(State_H_C5_F, C5*); + MAKE_STATE_1(State_H_C6_F, C6*); + MAKE_STATE_1(State_H_C7_F, C7*); + MAKE_STATE_1(State_H_C8_F, C8*); + + MAKE_STATE_1(State_H_C1_G, C1*); + MAKE_STATE_1(State_H_C2_G, C2*); + MAKE_STATE_1(State_H_C3_G, C3*); + MAKE_STATE_1(State_H_C4_G, C4*); + MAKE_STATE_1(State_H_C5_G, C5*); + MAKE_STATE_1(State_H_C6_G, C6*); + MAKE_STATE_1(State_H_C7_G, C7*); + MAKE_STATE_1(State_H_C8_G, C8*); + + MAKE_STATE_1(State_H2_C4_G, C4*); + + int g_TestID; + + struct C1 + { + virtual void F() + { + ADD_STATE(State_C1_F(this)); + } + virtual int G() + { + ADD_STATE(State_C1_G(this)); + return 1; + } + }; + struct C2 + { + virtual void F() + { + ADD_STATE(State_C2_F(this)); + } + virtual int G() + { + ADD_STATE(State_C2_G(this)); + return 2; + } + }; + struct C3 + { + virtual void F() + { + ADD_STATE(State_C3_F(this)); + } + virtual int G() + { + ADD_STATE(State_C3_G(this)); + return 3; + } + }; + struct C4 + { + virtual void F() + { + ADD_STATE(State_C4_F(this)); + } + virtual int G() + { + ADD_STATE(State_C4_G(this)); + return 4; + } + }; + struct C5 + { + virtual void F() + { + ADD_STATE(State_C5_F(this)); + } + virtual int G() + { + ADD_STATE(State_C5_G(this)); + return 5; + } + }; + struct C6 + { + virtual void F() + { + ADD_STATE(State_C6_F(this)); + } + virtual int G() + { + ADD_STATE(State_C6_G(this)); + return 6; + } + }; + struct C7 + { + virtual void F() + { + ADD_STATE(State_C7_F(this)); + } + virtual int G() + { + ADD_STATE(State_C7_G(this)); + return 7; + } + }; + struct C8 + { + virtual void F() + { + ADD_STATE(State_C8_F(this)); + } + virtual int G() + { + ADD_STATE(State_C8_G(this)); + return 8; + } + }; + + SH_DECL_HOOK0_void(C1, F, SH_NOATTRIB, 0); + SH_DECL_HOOK0(C1, G, SH_NOATTRIB, 0, int); + SH_DECL_HOOK0_void(C2, F, SH_NOATTRIB, 0); + SH_DECL_HOOK0(C2, G, SH_NOATTRIB, 0, int); + SH_DECL_HOOK0_void(C3, F, SH_NOATTRIB, 0); + SH_DECL_HOOK0(C3, G, SH_NOATTRIB, 0, int); + SH_DECL_HOOK0_void(C4, F, SH_NOATTRIB, 0); + SH_DECL_HOOK0(C4, G, SH_NOATTRIB, 0, int); + SH_DECL_HOOK0_void(C5, F, SH_NOATTRIB, 0); + SH_DECL_HOOK0(C5, G, SH_NOATTRIB, 0, int); + SH_DECL_HOOK0_void(C6, F, SH_NOATTRIB, 0); + SH_DECL_HOOK0(C6, G, SH_NOATTRIB, 0, int); + SH_DECL_HOOK0_void(C7, F, SH_NOATTRIB, 0); + SH_DECL_HOOK0(C7, G, SH_NOATTRIB, 0, int); + SH_DECL_HOOK0_void(C8, F, SH_NOATTRIB, 0); + SH_DECL_HOOK0(C8, G, SH_NOATTRIB, 0, int); + + void Handler_C1_F() + { + ADD_STATE(State_H_C1_F(META_IFACEPTR(C1))); + g_pC1->G(); + } + int Handler_C1_G() + { + ADD_STATE(State_H_C1_G(META_IFACEPTR(C1))); + g_pC2->F(); + return 1; + } + void Handler_C2_F() + { + ADD_STATE(State_H_C2_F(META_IFACEPTR(C2))); + g_pC2->G(); + } + int Handler_C2_G() + { + ADD_STATE(State_H_C2_G(META_IFACEPTR(C2))); + g_pC3->F(); + return 2; + } + void Handler_C3_F() + { + ADD_STATE(State_H_C3_F(META_IFACEPTR(C3))); + g_pC3->G(); + } + int Handler_C3_G() + { + ADD_STATE(State_H_C3_G(META_IFACEPTR(C3))); + g_pC4->F(); + return 3; + } + void Handler_C4_F() + { + ADD_STATE(State_H_C4_F(META_IFACEPTR(C4))); + g_pC4->G(); + } + int Handler_C4_G() + { + ADD_STATE(State_H_C4_G(META_IFACEPTR(C4))); + g_pC5->F(); + return 4; + } + int Handler2_C4_G() + { + ADD_STATE(State_H2_C4_G(META_IFACEPTR(C4))); + return 4; + } + void Handler_C5_F() + { + ADD_STATE(State_H_C5_F(META_IFACEPTR(C5))); + g_pC5->G(); + } + int Handler_C5_G() + { + ADD_STATE(State_H_C5_G(META_IFACEPTR(C5))); + g_pC6->F(); + return 5; + } + void Handler_C6_F() + { + ADD_STATE(State_H_C6_F(META_IFACEPTR(C6))); + g_pC6->G(); + } + int Handler_C6_G() + { + ADD_STATE(State_H_C6_G(META_IFACEPTR(C6))); + g_pC7->F(); + return 6; + } + void Handler_C7_F() + { + if (g_TestID == 1 || g_TestID == 2) + SH_REMOVE_HOOK_STATICFUNC(C4, G, g_pC4, Handler2_C4_G, false); + if (g_TestID == 2) + SH_REMOVE_HOOK_STATICFUNC(C4, G, g_pC4, Handler_C4_G, false); + + ADD_STATE(State_H_C7_F(META_IFACEPTR(C7))); + g_pC7->G(); + } + int Handler_C7_G() + { + ADD_STATE(State_H_C7_G(META_IFACEPTR(C7))); + g_pC8->F(); + return 7; + } + void Handler_C8_F() + { + ADD_STATE(State_H_C8_F(META_IFACEPTR(C8))); + g_pC8->G(); + } + int Handler_C8_G() + { + ADD_STATE(State_H_C8_G(META_IFACEPTR(C8))); + return 8; + } + + C1 g_C1; + C2 g_C2; + C3 g_C3; + C4 g_C4; + C5 g_C5; + C6 g_C6; + C7 g_C7; + C8 g_C8; +} + +bool TestReentr(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1337; + + g_pC1 = &g_C1; + g_pC2 = &g_C2; + g_pC3 = &g_C3; + g_pC4 = &g_C4; + g_pC5 = &g_C5; + g_pC6 = &g_C6; + g_pC7 = &g_C7; + g_pC8 = &g_C8; + + SH_ADD_HOOK_STATICFUNC(C1, F, g_pC1, Handler_C1_F, false); + SH_ADD_HOOK_STATICFUNC(C1, G, g_pC1, Handler_C1_G, false); + SH_ADD_HOOK_STATICFUNC(C2, F, g_pC2, Handler_C2_F, false); + SH_ADD_HOOK_STATICFUNC(C2, G, g_pC2, Handler_C2_G, false); + SH_ADD_HOOK_STATICFUNC(C3, F, g_pC3, Handler_C3_F, false); + SH_ADD_HOOK_STATICFUNC(C3, G, g_pC3, Handler_C3_G, false); + SH_ADD_HOOK_STATICFUNC(C4, F, g_pC4, Handler_C4_F, false); + SH_ADD_HOOK_STATICFUNC(C4, G, g_pC4, Handler_C4_G, false); + SH_ADD_HOOK_STATICFUNC(C5, F, g_pC5, Handler_C5_F, false); + SH_ADD_HOOK_STATICFUNC(C5, G, g_pC5, Handler_C5_G, false); + SH_ADD_HOOK_STATICFUNC(C6, F, g_pC6, Handler_C6_F, false); + SH_ADD_HOOK_STATICFUNC(C6, G, g_pC6, Handler_C6_G, false); + SH_ADD_HOOK_STATICFUNC(C7, F, g_pC7, Handler_C7_F, false); + SH_ADD_HOOK_STATICFUNC(C7, G, g_pC7, Handler_C7_G, false); + SH_ADD_HOOK_STATICFUNC(C8, F, g_pC8, Handler_C8_F, false); + SH_ADD_HOOK_STATICFUNC(C8, G, g_pC8, Handler_C8_G, false); + + g_pC1->F(); + + CHECK_STATES((&g_States, + new State_H_C1_F(g_pC1), + new State_H_C1_G(g_pC1), + new State_H_C2_F(g_pC2), + new State_H_C2_G(g_pC2), + new State_H_C3_F(g_pC3), + new State_H_C3_G(g_pC3), + new State_H_C4_F(g_pC4), + new State_H_C4_G(g_pC4), + new State_H_C5_F(g_pC5), + new State_H_C5_G(g_pC5), + new State_H_C6_F(g_pC6), + new State_H_C6_G(g_pC6), + new State_H_C7_F(g_pC7), + new State_H_C7_G(g_pC7), + new State_H_C8_F(g_pC8), + new State_H_C8_G(g_pC8), + new State_C8_G(g_pC8), + new State_C8_F(g_pC8), + new State_C7_G(g_pC7), + new State_C7_F(g_pC7), + new State_C6_G(g_pC6), + new State_C6_F(g_pC6), + new State_C5_G(g_pC5), + new State_C5_F(g_pC5), + new State_C4_G(g_pC4), + new State_C4_F(g_pC4), + new State_C3_G(g_pC3), + new State_C3_F(g_pC3), + new State_C2_G(g_pC2), + new State_C2_F(g_pC2), + new State_C1_G(g_pC1), + new State_C1_F(g_pC1), + NULL), "1"); + + + SH_ADD_HOOK_STATICFUNC(C4, G, g_pC4, Handler2_C4_G, false); + + g_pC1->F(); + + CHECK_STATES((&g_States, + new State_H_C1_F(g_pC1), + new State_H_C1_G(g_pC1), + new State_H_C2_F(g_pC2), + new State_H_C2_G(g_pC2), + new State_H_C3_F(g_pC3), + new State_H_C3_G(g_pC3), + new State_H_C4_F(g_pC4), + new State_H_C4_G(g_pC4), + new State_H_C5_F(g_pC5), + new State_H_C5_G(g_pC5), + new State_H_C6_F(g_pC6), + new State_H_C6_G(g_pC6), + new State_H_C7_F(g_pC7), + new State_H_C7_G(g_pC7), + new State_H_C8_F(g_pC8), + new State_H_C8_G(g_pC8), + new State_C8_G(g_pC8), + new State_C8_F(g_pC8), + new State_C7_G(g_pC7), + new State_C7_F(g_pC7), + new State_C6_G(g_pC6), + new State_C6_F(g_pC6), + new State_C5_G(g_pC5), + new State_C5_F(g_pC5), + new State_H2_C4_G(g_pC4), + new State_C4_G(g_pC4), + new State_C4_F(g_pC4), + new State_C3_G(g_pC3), + new State_C3_F(g_pC3), + new State_C2_G(g_pC2), + new State_C2_F(g_pC2), + new State_C1_G(g_pC1), + new State_C1_F(g_pC1), + NULL), "2"); + + g_pC1->F(); + + CHECK_STATES((&g_States, + new State_H_C1_F(g_pC1), + new State_H_C1_G(g_pC1), + new State_H_C2_F(g_pC2), + new State_H_C2_G(g_pC2), + new State_H_C3_F(g_pC3), + new State_H_C3_G(g_pC3), + new State_H_C4_F(g_pC4), + new State_H_C4_G(g_pC4), + new State_H_C5_F(g_pC5), + new State_H_C5_G(g_pC5), + new State_H_C6_F(g_pC6), + new State_H_C6_G(g_pC6), + new State_H_C7_F(g_pC7), + new State_H_C7_G(g_pC7), + new State_H_C8_F(g_pC8), + new State_H_C8_G(g_pC8), + new State_C8_G(g_pC8), + new State_C8_F(g_pC8), + new State_C7_G(g_pC7), + new State_C7_F(g_pC7), + new State_C6_G(g_pC6), + new State_C6_F(g_pC6), + new State_C5_G(g_pC5), + new State_C5_F(g_pC5), + new State_H2_C4_G(g_pC4), + new State_C4_G(g_pC4), + new State_C4_F(g_pC4), + new State_C3_G(g_pC3), + new State_C3_F(g_pC3), + new State_C2_G(g_pC2), + new State_C2_F(g_pC2), + new State_C1_G(g_pC1), + new State_C1_F(g_pC1), + NULL), "3"); + + g_TestID = 1; + + g_pC1->F(); + + CHECK_STATES((&g_States, + new State_H_C1_F(g_pC1), + new State_H_C1_G(g_pC1), + new State_H_C2_F(g_pC2), + new State_H_C2_G(g_pC2), + new State_H_C3_F(g_pC3), + new State_H_C3_G(g_pC3), + new State_H_C4_F(g_pC4), + new State_H_C4_G(g_pC4), + new State_H_C5_F(g_pC5), + new State_H_C5_G(g_pC5), + new State_H_C6_F(g_pC6), + new State_H_C6_G(g_pC6), + new State_H_C7_F(g_pC7), + new State_H_C7_G(g_pC7), + new State_H_C8_F(g_pC8), + new State_H_C8_G(g_pC8), + new State_C8_G(g_pC8), + new State_C8_F(g_pC8), + new State_C7_G(g_pC7), + new State_C7_F(g_pC7), + new State_C6_G(g_pC6), + new State_C6_F(g_pC6), + new State_C5_G(g_pC5), + new State_C5_F(g_pC5), + new State_C4_G(g_pC4), + new State_C4_F(g_pC4), + new State_C3_G(g_pC3), + new State_C3_F(g_pC3), + new State_C2_G(g_pC2), + new State_C2_F(g_pC2), + new State_C1_G(g_pC1), + new State_C1_F(g_pC1), + NULL), "4"); + + g_pC1->F(); + + CHECK_STATES((&g_States, + new State_H_C1_F(g_pC1), + new State_H_C1_G(g_pC1), + new State_H_C2_F(g_pC2), + new State_H_C2_G(g_pC2), + new State_H_C3_F(g_pC3), + new State_H_C3_G(g_pC3), + new State_H_C4_F(g_pC4), + new State_H_C4_G(g_pC4), + new State_H_C5_F(g_pC5), + new State_H_C5_G(g_pC5), + new State_H_C6_F(g_pC6), + new State_H_C6_G(g_pC6), + new State_H_C7_F(g_pC7), + new State_H_C7_G(g_pC7), + new State_H_C8_F(g_pC8), + new State_H_C8_G(g_pC8), + new State_C8_G(g_pC8), + new State_C8_F(g_pC8), + new State_C7_G(g_pC7), + new State_C7_F(g_pC7), + new State_C6_G(g_pC6), + new State_C6_F(g_pC6), + new State_C5_G(g_pC5), + new State_C5_F(g_pC5), + new State_C4_G(g_pC4), + new State_C4_F(g_pC4), + new State_C3_G(g_pC3), + new State_C3_F(g_pC3), + new State_C2_G(g_pC2), + new State_C2_F(g_pC2), + new State_C1_G(g_pC1), + new State_C1_F(g_pC1), + NULL), "5"); + + + + SH_ADD_HOOK_STATICFUNC(C4, G, g_pC4, Handler2_C4_G, false); + + g_TestID = 2; + + g_pC1->F(); + + CHECK_STATES((&g_States, + new State_H_C1_F(g_pC1), + new State_H_C1_G(g_pC1), + new State_H_C2_F(g_pC2), + new State_H_C2_G(g_pC2), + new State_H_C3_F(g_pC3), + new State_H_C3_G(g_pC3), + new State_H_C4_F(g_pC4), + new State_H_C4_G(g_pC4), + new State_H_C5_F(g_pC5), + new State_H_C5_G(g_pC5), + new State_H_C6_F(g_pC6), + new State_H_C6_G(g_pC6), + new State_H_C7_F(g_pC7), + new State_H_C7_G(g_pC7), + new State_H_C8_F(g_pC8), + new State_H_C8_G(g_pC8), + new State_C8_G(g_pC8), + new State_C8_F(g_pC8), + new State_C7_G(g_pC7), + new State_C7_F(g_pC7), + new State_C6_G(g_pC6), + new State_C6_F(g_pC6), + new State_C5_G(g_pC5), + new State_C5_F(g_pC5), + new State_C4_G(g_pC4), + new State_C4_F(g_pC4), + new State_C3_G(g_pC3), + new State_C3_F(g_pC3), + new State_C2_G(g_pC2), + new State_C2_F(g_pC2), + new State_C1_G(g_pC1), + new State_C1_F(g_pC1), + NULL), "6"); + + g_pC1->F(); + + CHECK_STATES((&g_States, + new State_H_C1_F(g_pC1), + new State_H_C1_G(g_pC1), + new State_H_C2_F(g_pC2), + new State_H_C2_G(g_pC2), + new State_H_C3_F(g_pC3), + new State_H_C3_G(g_pC3), + new State_H_C4_F(g_pC4), + new State_C4_G(g_pC4), + new State_C4_F(g_pC4), + new State_C3_G(g_pC3), + new State_C3_F(g_pC3), + new State_C2_G(g_pC2), + new State_C2_F(g_pC2), + new State_C1_G(g_pC1), + new State_C1_F(g_pC1), + NULL), "7"); + + SH_REMOVE_HOOK_STATICFUNC(C1, F, g_pC1, Handler_C1_F, false); + SH_REMOVE_HOOK_STATICFUNC(C1, G, g_pC1, Handler_C1_G, false); + SH_REMOVE_HOOK_STATICFUNC(C2, F, g_pC2, Handler_C2_F, false); + SH_REMOVE_HOOK_STATICFUNC(C2, G, g_pC2, Handler_C2_G, false); + SH_REMOVE_HOOK_STATICFUNC(C3, F, g_pC3, Handler_C3_F, false); + SH_REMOVE_HOOK_STATICFUNC(C3, G, g_pC3, Handler_C3_G, false); + SH_REMOVE_HOOK_STATICFUNC(C4, F, g_pC4, Handler_C4_F, false); + SH_REMOVE_HOOK_STATICFUNC(C4, G, g_pC4, Handler_C4_G, false); + SH_REMOVE_HOOK_STATICFUNC(C5, F, g_pC5, Handler_C5_F, false); + SH_REMOVE_HOOK_STATICFUNC(C5, G, g_pC5, Handler_C5_G, false); + SH_REMOVE_HOOK_STATICFUNC(C6, F, g_pC6, Handler_C6_F, false); + SH_REMOVE_HOOK_STATICFUNC(C6, G, g_pC6, Handler_C6_G, false); + SH_REMOVE_HOOK_STATICFUNC(C7, F, g_pC7, Handler_C7_F, false); + SH_REMOVE_HOOK_STATICFUNC(C7, G, g_pC7, Handler_C7_G, false); + SH_REMOVE_HOOK_STATICFUNC(C8, F, g_pC8, Handler_C8_F, false); + SH_REMOVE_HOOK_STATICFUNC(C8, G, g_pC8, Handler_C8_G, false); + + return true; +} diff --git a/sourcehook/test/testref.cpp b/sourcehook/test/testref.cpp new file mode 100644 index 0000000..db5062a --- /dev/null +++ b/sourcehook/test/testref.cpp @@ -0,0 +1,163 @@ +#include "testevents.h" +#include "sourcehook_test.h" + +// References and private copy constructors and stuff like that! + +/* +BAILOPAN, 29.04.2006 21:51 : +onoto-san, interesting error from VS +we have this function: +void GabHaben(ISomething &sth); + +SomethingDerived sth; +and SH_CALL(cc, &WHAT::GabHaben)(sth); +"No copy constructor available for class 'SomethingDerived'" +*/ + + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + MAKE_STATE_1(State_Result, int); + MAKE_STATE_1(State_Result_InHook, int); + + class CBase + { + // Private copy constructor! + CBase(CBase &other) + { + } + public: + CBase() + { + } + + virtual int Func() + { + return 0; + } + }; + + class CDerived : public CBase + { + virtual int Func() + { + return 10; + } + }; + + // Complicated derived shit ! + class COtherWeirdBase + { + int member; + }; + class CDerived2 : private COtherWeirdBase, public CBase + { + int m_Return; + public: + CDerived2(int a) : m_Return(a) + { + } + + virtual int Func() + { + return m_Return; + } + }; + + class CHello + { + public: + virtual int Func(CBase &sth) + { + return sth.Func(); + } + }; + + class CHook + { + public: + virtual int Func(CBase &sth) + { + ADD_STATE(State_Result_InHook(sth.Func())); + RETURN_META_VALUE(MRES_SUPERCEDE, 20); + } + }; + SH_DECL_HOOK1(CHello, Func, SH_NOATTRIB, 0, int, CBase&); +} + + +bool TestRef(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1; + + CBase base; + CDerived der; + CDerived2 der2(11); + CDerived2 der3(12); + CHello hello; + CHello *pHello = &hello; + CHook hook; + + SourceHook::CallClass *cc = SH_GET_CALLCLASS(&hello); + + ADD_STATE(State_Result(pHello->Func(base))); + ADD_STATE(State_Result(pHello->Func(der))); + ADD_STATE(State_Result(pHello->Func(der2))); + ADD_STATE(State_Result(pHello->Func(der3))); + + CHECK_STATES((&g_States, + new State_Result(0), + new State_Result(10), + new State_Result(11), + new State_Result(12), + NULL), "Part 1"); + + ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(base))); + ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der))); + ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der2))); + ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der3))); + + CHECK_STATES((&g_States, + new State_Result(0), + new State_Result(10), + new State_Result(11), + new State_Result(12), + NULL), "Part 2"); + + SH_ADD_HOOK_MEMFUNC(CHello, Func, &hello, &hook, &CHook::Func, false); + + ADD_STATE(State_Result(pHello->Func(base))); + ADD_STATE(State_Result(pHello->Func(der))); + ADD_STATE(State_Result(pHello->Func(der2))); + ADD_STATE(State_Result(pHello->Func(der3))); + + CHECK_STATES((&g_States, + new State_Result_InHook(0), + new State_Result(20), + new State_Result_InHook(10), + new State_Result(20), + new State_Result_InHook(11), + new State_Result(20), + new State_Result_InHook(12), + new State_Result(20), + NULL), "Part 3"); + + ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(base))); + ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der))); + ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der2))); + ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der3))); + + CHECK_STATES((&g_States, + new State_Result(0), + new State_Result(10), + new State_Result(11), + new State_Result(12), + NULL), "Part 4"); + + return true; +} diff --git a/sourcehook/test/testrefret.cpp b/sourcehook/test/testrefret.cpp new file mode 100644 index 0000000..6853cf8 --- /dev/null +++ b/sourcehook/test/testrefret.cpp @@ -0,0 +1,200 @@ +#include "testevents.h" +#include "sourcehook_test.h" + +// Tests support for functions which return references + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + MAKE_STATE_1(State_Func1_Pre1, int*); // p1: the ref Func1_Pre1 is going to return + MAKE_STATE_3(State_Func1_Pre2, META_RES, int*, int*); // p1: current status + // p2: override ret + // p3: what this handler is going to supercede with + MAKE_STATE_1(State_Func1, int*); // p1: the ref Func1 is going to return + MAKE_STATE_2(State_Func1_Post1, int*, int*); // p1: orig_ret; p2: override_ret + MAKE_STATE_1(State_Func1_Post2, int*); // p1: what it's going to return + MAKE_STATE_1(State_Func1_Ret, int*); // p1: the ref it returned + + + MAKE_STATE_2(State_Func2_Pre1, int, const int*); // p1: func's p1; p2: what it's going to ret + MAKE_STATE_2(State_Func2, int, const int*); // p1: func's p1; p2: what it's going to ret + MAKE_STATE_3(State_Func2_Post1, int, const int*, const int*); // p1: func's p1; p2: orig ret; p3: override ret + MAKE_STATE_1(State_Func2_Ret, const int*); // p1: ret + + int g_Var; + + class Test + { + public: + int m_Var1; + int m_Var2; + + Test() : m_Var1(87) + { + } + + virtual int& Func1() + { + ADD_STATE(State_Func1(&m_Var1)); + return m_Var1; + } + virtual const int& Func2(int p1) + { + ADD_STATE(State_Func2(p1, &m_Var2)); + m_Var2 = p1; + return m_Var2; + } + }; + + class CHook + { + public: + int m_Var; + virtual int& Func1_Pre1() + { + ADD_STATE(State_Func1_Pre1(&m_Var)); + RETURN_META_VALUE(MRES_OVERRIDE, m_Var); + } + virtual int &Func1_Pre2() + { + int &overrideret = META_RESULT_OVERRIDE_RET(int&); + overrideret = 1337; + ADD_STATE(State_Func1_Pre2(META_RESULT_STATUS, &overrideret, &g_Var)); + RETURN_META_VALUE(MRES_SUPERCEDE, g_Var); + } + virtual int& Func1_Post1() + { + ADD_STATE(State_Func1_Post1(&META_RESULT_ORIG_RET(int&), &META_RESULT_OVERRIDE_RET(int&))); + RETURN_META_NOREF(MRES_IGNORED, int&); + } + virtual int& Func1_Post2() + { + ADD_STATE(State_Func1_Post2(&m_Var)); + RETURN_META_VALUE(MRES_OVERRIDE, m_Var); + } + + virtual const int& Func2_Pre1(int p1) + { + ADD_STATE(State_Func2_Pre1(p1, &m_Var)); + RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, m_Var, static_cast(&Test::Func2), (1337)); + } + + virtual const int& Func2_Post1(int p1) + { + ADD_STATE(State_Func2_Post1(p1, &META_RESULT_ORIG_RET(int&), &META_RESULT_OVERRIDE_RET(int&))); + RETURN_META_NOREF(MRES_IGNORED, const int&); + } + }; + + SH_DECL_HOOK0(Test, Func1, SH_NOATTRIB, 0, int&); + SH_DECL_HOOK1(Test, Func2, SH_NOATTRIB, 0, const int&, int); +} + +bool TestRefRet(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1; + + Test test; + Test *pTest = &test; + CHook hook; + + int &ret1 = pTest->Func1(); + ADD_STATE(State_Func1_Ret(&ret1)); + + CHECK_STATES((&g_States, + new State_Func1(&test.m_Var1), + new State_Func1_Ret(&test.m_Var1), + NULL), "Part 1"); + + // Now add Func1_Pre1, which supercedes and returns hook.m_Var + SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Pre1, false); + + int &ret2 = pTest->Func1(); + ADD_STATE(State_Func1_Ret(&ret2)); + + CHECK_STATES((&g_States, + new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var + new State_Func1(&test.m_Var1), // Function says that it's going to return test.m_Var1 + new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned + NULL), "Part 2"); + + // Now add Func1_Post1, which only reports orig ret and override ret + SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Post1, true); + + int &ret3 = pTest->Func1(); + ADD_STATE(State_Func1_Ret(&ret3)); + + CHECK_STATES((&g_States, + new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var + new State_Func1(&test.m_Var1), // Function says that it's going to return test.m_Var1 + new State_Func1_Post1(&test.m_Var1, &hook.m_Var), // origret(=p1) is what it wanted to + // return, overrideret(=p2) is pre1's var + new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned + NULL), "Part 3"); + + // Now add Func1_Pre2, which supercedes and returns g_Var (it also sets the override ret from pre1 to 1337) + // and add Func1_Post2, which overrides and returns hook.m_Var again. + + SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Pre2, false); + SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Post2, true); + + int &ret4 = pTest->Func1(); + ADD_STATE(State_Func1_Ret(&ret4)); + + CHECK_STATES((&g_States, + new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var + new State_Func1_Pre2(MRES_OVERRIDE, // current status + &hook.m_Var, // override ret (which it set to 1337) + &g_Var), // what it's going to ret, AND supercede with + + new State_Func1_Post1(&g_Var, &g_Var), // origret(=p1) is what pre2 superceded with, + // so overrideret(=p2) has to be the same + new State_Func1_Post2(&hook.m_Var), // post2 is going to override with hook.m_Var again + new State_Func1_Ret(&hook.m_Var), // ==>>> hook.m_Var is returned + NULL), "Part 4"); + + CHECK_COND(hook.m_Var == 1337, "Part 4.1"); + + // Through a callclass + SourceHook::CallClass *cc1 = SH_GET_CALLCLASS(&test); + int &ret5 = SH_CALL(cc1, &Test::Func1)(); + ADD_STATE(State_Func1_Ret(&ret5)); + + CHECK_STATES((&g_States, + new State_Func1(&test.m_Var1), + new State_Func1_Ret(&test.m_Var1), + NULL), "Part 5"); + + SH_RELEASE_CALLCLASS(cc1); + + //////////////////////////////////////////////////////////////////////////////////////// + // Func2 tests + const int &ret21 = pTest->Func2(500); + ADD_STATE(State_Func2_Ret(&ret21)); + + CHECK_STATES((&g_States, + new State_Func2(500, &test.m_Var2), + new State_Func2_Ret(&test.m_Var2), + NULL), "Part 6"); + + SH_ADD_HOOK_MEMFUNC(Test, Func2, &test, &hook, &CHook::Func2_Pre1, false); + SH_ADD_HOOK_MEMFUNC(Test, Func2, &test, &hook, &CHook::Func2_Post1, true); + + const int &ret22 = pTest->Func2(500); + ADD_STATE(State_Func2_Ret(&ret22)); + + CHECK_STATES((&g_States, + new State_Func2_Pre1(500, &hook.m_Var), // p1 was 500; it's going to override with hook.m_Var; and also change p1 to 1337 + new State_Func2(1337, &test.m_Var2), // p1 was 1337; it's going to ret test.m_Var2 + new State_Func2_Post1(1337, // p1 was 1337 + &test.m_Var2, // orig ret was test.m_Var2 + &hook.m_Var), // override ret was hook.m_Var + new State_Func2_Ret(&hook.m_Var), // really returned hook.m_Var + NULL), "Part 7"); + + return true; +} diff --git a/sourcemm/CPlugin.cpp b/sourcemm/CPlugin.cpp new file mode 100644 index 0000000..218a1ad --- /dev/null +++ b/sourcemm/CPlugin.cpp @@ -0,0 +1,618 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#include "CPlugin.h" +#include "CSmmAPI.h" +#include "sourcemm.h" +#include "concommands.h" + +/** + * @brief Implements functions from CPlugin.h + * @file CPlugin.cpp + */ + +using namespace SourceMM; + +#define ITER_PLEVENT(evn, plid) \ + CPluginManager::CPlugin *_Xpl; \ + SourceHook::List::iterator event; \ + IMetamodListener *api; \ + for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ + _Xpl = (*iter); \ + if (_Xpl->m_Id == plid) \ + continue; \ + for (event=_Xpl->m_Events.begin(); event!=_Xpl->m_Events.end(); event++) { \ + api = (*event); \ + api->evn(plid); \ + } \ + } + +CPluginManager g_PluginMngr; + +CPluginManager::CPluginManager() +{ + m_LastId = Pl_MinId; + m_AllLoaded = false; +} + +CPluginManager::~CPluginManager() +{ + SourceHook::List::iterator iter; + + for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++) + { + delete (*iter); + } + + m_Aliases.clear(); +} + +const char *CPluginManager::LookupAlias(const char *alias) +{ + SourceHook::List::iterator iter; + CNameAlias *p; + + for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++) + { + p = (*iter); + if (p->alias.compare(alias) == 0) + { + return p->value.c_str(); + } + } + + return NULL; +} + +SourceHook::List::iterator CPluginManager::_alias_begin() +{ + return m_Aliases.begin(); +} + +SourceHook::List::iterator CPluginManager::_alias_end() +{ + return m_Aliases.end(); +} + +void CPluginManager::SetAlias(const char *alias, const char *value) +{ + SourceHook::List::iterator iter; + CNameAlias *p; + + for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++) + { + p = (*iter); + if (p->alias.compare(alias) == 0) + { + if (value[0] == '\0') + { + iter = m_Aliases.erase(iter); + return; + } else { + p->value.assign(value); + return; + } + } + } + + if (value[0] != '\0') + { + p = new CNameAlias; + + p->alias.assign(alias); + p->value.assign(value); + + m_Aliases.push_back(p); + } +} + +CPluginManager::CPlugin::CPlugin() : m_Id(0), m_Source(0), m_API(NULL), m_Lib(NULL) +{ + +} + +PluginId CPluginManager::Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen) +{ + already = false; + //Check if we're about to reload an old plugin + PluginIter i = m_Plugins.begin(); + while (i != m_Plugins.end()) + { + if ( (*i) && UTIL_PathCmp(file, (*i)->m_File.c_str()) ) + { + if ( (*i)->m_Status < Pl_Paused ) + { + //Attempt to load the plugin again + already = true; + i = m_Plugins.erase(i); + continue; + } else { + //No need to load it + already = true; + return (*i)->m_Id; + } + } + i++; + } + + CPlugin *pl = _Load(file, source, error, maxlen); + + if (!pl) + return Pl_BadLoad; + + ITER_PLEVENT(OnPluginLoad, pl->m_Id); + + return pl->m_Id; +} + +CPluginManager::CPlugin *CPluginManager::FindById(PluginId id) +{ + PluginIter i; + + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i)->m_Id == id ) + return (*i); + } + + return NULL; +} + +void CPluginManager::SetAllLoaded() +{ + m_AllLoaded = true; + PluginIter i; + + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i) && (*i)->m_Status == Pl_Running && (*i)->m_API ) + { + //API 4 is when we added this callback + //Min version is now 5, so we ignore this check + //if ( (*i)->m_API->GetApiVersion() >= 004 ) + (*i)->m_API->AllPluginsLoaded(); + } + } +} + +bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen) +{ + CPlugin *pl = FindById(id); + + if (!pl) + { + UTIL_Format(error, maxlen, "Plugin id not found"); + return false; + } + + bool ret; + + if ( (ret=_Pause(pl, error, maxlen)) == true ) + { + ITER_PLEVENT(OnPluginPause, pl->m_Id); + } + + return ret; +} + +bool CPluginManager::Unpause(PluginId id, char *error, size_t maxlen) +{ + CPlugin *pl = FindById(id); + + if (!pl) + { + UTIL_Format(error, maxlen, "Plugin id not found"); + return false; + } + + bool ret; + + if ( (ret=_Unpause(pl, error, maxlen)) == true ) + { + ITER_PLEVENT(OnPluginUnpause, pl->m_Id); + } + + return ret; +} + +bool CPluginManager::Unload(PluginId id, bool force, char *error, size_t maxlen) +{ + CPlugin *pl = FindById(id); + + if (!pl) + { + UTIL_Format(error, maxlen, "Plugin %d not found", id); + return false; + } + + bool ret; + PluginId old_id = pl->m_Id; + if ( (ret=_Unload(pl, force, error, maxlen)) == true ) + { + ITER_PLEVENT(OnPluginUnload, old_id); + } + + return ret; +} + +bool CPluginManager::Retry(PluginId id, char *error, size_t len) +{ + PluginIter i; + char buffer[64]; + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i) && (*i)->m_Id == id ) + { + if ( (*i)->m_Status >= Pl_Paused) + { + UTIL_Format(error, len, "Plugin %d is already running.", id); + return false; + } + CPlugin *pl = _Load((*i)->m_File.c_str(), Pl_Console, error, len); + if (!pl) + return false; + if (pl->m_Status >= Pl_Paused) + { + //Now it gets crazy... unload the original copy. + _Unload( (*i), true, buffer, sizeof(buffer)-1 ); + + //Set the new copy's id + pl->m_Id = id; + + //We just wasted an id... reclaim it + m_LastId--; + + return true; + } else { + //don't really care about the buffer here + _Unload(pl, true, buffer, sizeof(buffer)-1); + + //We just wasted an id... reclaim it + m_LastId--; + return false; + } + } + } + + UTIL_Format(error, len, "Plugin %d not found,", id); + return false; +} + +CPluginManager::CPlugin *CPluginManager::FindByAPI(ISmmPlugin *api) +{ + PluginIter i; + + //don't find bad plugins! + if (!api) + return NULL; + + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i)->m_API == api ) + return (*i); + } + + return NULL; +} + +CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source, char *error, size_t maxlen) +{ + FILE *fp; + CPlugin *pl; + + pl = new CPlugin(); + *error = '\0'; + + //Add plugin to list + pl->m_Id = m_LastId; + pl->m_File.assign(file); + m_Plugins.push_back(pl); + m_LastId++; + + //Check if the file even exists + fp = fopen(file, "r"); + if (!fp) + { + if (error) + UTIL_Format(error, maxlen, "File not found: %s", file); + pl->m_Status = Pl_NotFound; + } + + if (fp) + { + fclose(fp); + fp = NULL; + + //Load the file + pl->m_Lib = dlmount(file); + if (!pl->m_Lib) + { + if (error) + UTIL_Format(error, maxlen, "%s", dlerror()); + pl->m_Status = Pl_Error; + } else { + CreateInterfaceFn pfn = (CreateInterfaceFn)(dlsym(pl->m_Lib, PL_EXPOSURE_C)); + if (!pfn) + { + if (error) + UTIL_Format(error, maxlen, "Function %s not found", PL_EXPOSURE_C); + pl->m_Status = Pl_Error; + } else { + pl->m_API = static_cast((pfn)(PLAPI_NAME, NULL)); + if (!pl->m_API) + { + if (error) + UTIL_Format(error, maxlen, "Failed to get API"); + pl->m_Status = Pl_Error; + } else { + int api = pl->m_API->GetApiVersion(); + if (api < PLAPI_MIN_VERSION) + { + if (error) + UTIL_Format(error, maxlen, "Plugin API %d is out of date with required minimum (%d)", api, PLAPI_MIN_VERSION); + pl->m_Status = Pl_Error; + } else if (api > PLAPI_VERSION) { + if (error) + UTIL_Format(error, maxlen, "Plugin API %d is newer than internal version (%d)", api, PLAPI_VERSION); + pl->m_Status = Pl_Error; + } else { + if (pl->m_API->Load(pl->m_Id, static_cast(&g_SmmAPI), error, maxlen, m_AllLoaded)) + { + pl->m_Status = Pl_Running; + if (m_AllLoaded) + { + //API 4 is when we added this callback + //Removing this code as the min version is now 5 + //if (pl->m_API->GetApiVersion() >= 4) + pl->m_API->AllPluginsLoaded(); + } + } else { + pl->m_Status = Pl_Refused; + } + } + } + } + } + } + + if (pl->m_Lib && (pl->m_Status < Pl_Paused)) + { + pl->m_Events.clear(); + g_SourceHook.UnloadPlugin(pl->m_Id); + UnregAllConCmds(pl); + + dlclose(pl->m_Lib); + pl->m_Lib = NULL; + pl->m_API = NULL; + } + + return pl; +} + +bool CPluginManager::_Unload(CPluginManager::CPlugin *pl, bool force, char *error, size_t maxlen) +{ + if (error) + *error = '\0'; + if (pl->m_API && pl->m_Lib) + { + //Note, we'll always tell the plugin it will be unloading... + if (pl->m_API->Unload(error, maxlen) || force) + { + //Make sure to detach it from sourcehook! + g_SourceHook.UnloadPlugin(pl->m_Id); + + UnregAllConCmds(pl); + + //Clean up the DLL + dlclose(pl->m_Lib); + pl->m_Lib = NULL; + pl->m_API = NULL; + + //Remove the plugin from the list + PluginIter i; + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i)->m_Id == pl->m_Id ) + { + i = m_Plugins.erase(i); + break; + } + } + //Free its memory + delete pl; + + return true; + } + } else { + //The plugin is not valid, and let's just remove it from the list anyway + PluginIter i; + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i)->m_Id == pl->m_Id ) + { + i = m_Plugins.erase(i); + break; + } + } + delete pl; + + return true; + } + + return false; +} + +bool CPluginManager::_Pause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) +{ + if (error) + *error = '\0'; + if (pl->m_Status != Pl_Running || !pl->m_API) + { + if (error) + UTIL_Format(error, maxlen, "Plugin cannot be paused"); + } else { + if (pl->m_API->Pause(error, maxlen)) + { + g_SourceHook.PausePlugin(pl->m_Id); + pl->m_Status = Pl_Paused; + + return true; + } + } + + return false; +} + +bool CPluginManager::_Unpause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) +{ + if (error) + *error = '\0'; + + if (pl->m_Status != Pl_Paused || !pl->m_API) + { + if (error) + UTIL_Format(error, maxlen, "Plugin cannot be unpaused"); + } else { + if (pl->m_API->Unpause(error, maxlen)) + { + g_SourceHook.UnpausePlugin(pl->m_Id); + pl->m_Status = Pl_Running; + + return true; + } + } + + return false; +} + +bool CPluginManager::UnloadAll() +{ + PluginIter i; + + char error[128]; + bool status = true; + + while ((i = m_Plugins.begin()) != m_Plugins.end()) + { + if ( !_Unload( (*i), true, error, sizeof(error)) ) + { + status = false; + } + } + + return status; +} + +bool CPluginManager::Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source) +{ + CPlugin *pl = FindById(id); + + if (!pl) + return false; + + file = pl->m_File.c_str(); + status = pl->m_Status; + source = pl->m_Source; + + return true; +} + +bool CPluginManager::QueryRunning(PluginId id, char *error, size_t maxlength) +{ + CPlugin *pl = FindById(id); + + if (!pl || !pl->m_API) + { + if (error) + UTIL_Format(error, maxlength, "Plugin not valid"); + return false; + } + + return pl->m_API->QueryRunning(error, maxlength); +} + +bool CPluginManager::QueryHandle(PluginId id, void *&handle) +{ + CPlugin *pl = FindById(id); + + if (!pl) + { + return false; + } + + handle = static_cast(pl->m_Lib); + + return true; +} + +PluginIter CPluginManager::_begin() +{ + return m_Plugins.begin(); +} + +PluginIter CPluginManager::_end() +{ + return m_Plugins.end(); +} + +void CPluginManager::AddPluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) +{ + CPlugin *pl = FindByAPI(api); + + if (!pl) + return; + + pl->m_Cvars.push_back(pCvar); +} + +void CPluginManager::AddPluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) +{ + CPlugin *pl = FindByAPI(api); + + if (!pl) + return; + + pl->m_Cmds.push_back(pCmd); +} + +void CPluginManager::RemovePluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) +{ + CPlugin *pl = FindByAPI(api); + + if (!pl) + return; + + pl->m_Cvars.remove(pCvar); +} + +void CPluginManager::RemovePluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) +{ + CPlugin *pl = FindByAPI(api); + + if (!pl) + return; + + pl->m_Cmds.remove(pCmd); +} + +void CPluginManager::UnregAllConCmds(CPlugin *pl) +{ + SourceHook::List::iterator i; + + for (i=pl->m_Cvars.begin(); i!=pl->m_Cvars.end(); i++) + g_SMConVarAccessor.Unregister( (*i) ); + + pl->m_Cvars.clear(); + + for (i=pl->m_Cmds.begin(); i!=pl->m_Cmds.end(); i++) + g_SMConVarAccessor.Unregister( (*i) ); + + pl->m_Cmds.clear(); +} diff --git a/sourcemm/CPlugin.h b/sourcemm/CPlugin.h new file mode 100644 index 0000000..005041f --- /dev/null +++ b/sourcemm/CPlugin.h @@ -0,0 +1,146 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): David "BAILOPAN" Anderson +* ============================ +*/ + +#ifndef _INCLUDE_CPLUGIN_H +#define _INCLUDE_CPLUGIN_H + +/** + * @brief Implementation of Plugin API and Management routines + * @file CPlugin.cpp + */ + +#include +#include +#include "convar_smm.h" +#include "IPluginManager.h" +#include "oslink.h" +#include "sh_list.h" +#include "sh_string.h" + +/** + * History of plugin versions: (M=min, C=current) + * 1: Initial interface + * 2: Added GetLogTag() + * 3: Moved GetApiVersion() to top (2005-04-16) + * 4: Added AllPluginsLoaded() callback (2005-04-18) + * 5: Bumped version for SourceHook V4 (2005-05-01) + * 6: Added functions for console printing (2005-05-26) + * M 7: Changed template libraries (2005-08-11) + * New loading structure mechanism + * New SourceHook version + * 8: New SourceHook version (2005-12-23) + * New ISmmAPI additions + * 9: New ISmmPluginManager additions + * C 10: Added VSP listen functions to ISmmAPI and IMetamodListener (2007-02-09) + */ + +#define PLAPI_MIN_VERSION 7 + +namespace SourceMM +{ + struct CNameAlias + { + SourceHook::String alias; + SourceHook::String value; + }; + /** + * @brief Implements Plugin Manager API + */ + class CPluginManager : public ISmmPluginManager + { + public: + /** + * @brief Internal structure for holding plugin data + */ + class CPlugin + { + public: + CPlugin(); + public: + PluginId m_Id; + SourceHook::String m_File; + Pl_Status m_Status; + PluginId m_Source; + ISmmPlugin *m_API; + HINSTANCE m_Lib; + SourceHook::List m_Cvars; + SourceHook::List m_Cmds; + SourceHook::List m_Events; + }; + public: + CPluginManager(); + ~CPluginManager(); + void SetAllLoaded(); + public: + PluginId Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen); + bool Unload(PluginId id, bool force, char *error, size_t maxlen); + bool Pause(PluginId id, char *error, size_t maxlen); + bool Unpause(PluginId id, char *error, size_t maxlen); + bool UnloadAll(); + void SetAlias(const char *alias, const char *value); + public: + bool Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source); + bool QueryRunning(PluginId id, char *error, size_t maxlength); + bool QueryHandle(PluginId id, void *&handle); + + void AddPluginCvar(ISmmPlugin *api, ConCommandBase *pCvar); + void AddPluginCmd(ISmmPlugin *api, ConCommandBase *pCmd); + void RemovePluginCvar(ISmmPlugin *api, ConCommandBase *pCvar); + void RemovePluginCmd(ISmmPlugin *api, ConCommandBase *pCmd); + + /** + * @brief Finds a plugin by Id + * + * @param id Id of plugin + * @return CPlugin on success, NULL otherwise + */ + CPlugin *FindById(PluginId id); + + CPlugin *FindByAPI(ISmmPlugin *api); + + /** + * @brief Attempts to reload a failed plugin + * + * @param id Id of plugin + * @param error Error message buffer + * @param len Maximum length of buffer + * @return True on success, false otherwise + */ + bool Retry(PluginId id, char *error, size_t len); + + //get alias info + const char *LookupAlias(const char *alias); + SourceHook::List::iterator _alias_begin(); + SourceHook::List::iterator _alias_end(); + + //Internal iterators + SourceHook::List::iterator _begin(); + SourceHook::List::iterator _end(); + private: + //These are identical internal functions for the wrappers above. + CPlugin *_Load(const char *file, PluginId source, char *error, size_t maxlen); + bool _Unload(CPlugin *pl, bool force, char *error, size_t maxlen); + bool _Pause(CPlugin *pl, char *error, size_t maxlen); + bool _Unpause(CPlugin *pl, char *error, size_t maxlen); + void UnregAllConCmds(CPlugin *pl); + private: + PluginId m_LastId; + SourceHook::List m_Plugins; + SourceHook::List m_Aliases; + bool m_AllLoaded; + }; +}; + +typedef SourceHook::List::iterator PluginIter; + +/** @brief Singleton for plugin manager */ +extern SourceMM::CPluginManager g_PluginMngr; + +#endif //_INCLUDE_CPLUGIN_H diff --git a/sourcemm/CSmmAPI.cpp b/sourcemm/CSmmAPI.cpp new file mode 100644 index 0000000..29963a9 --- /dev/null +++ b/sourcemm/CSmmAPI.cpp @@ -0,0 +1,668 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#include "convar_smm.h" +#include "CSmmAPI.h" +#include "sourcemm.h" +#include "concommands.h" +#include "CPlugin.h" +#include "vsp_listener.h" + +/** + * @brief Implementation of main API interface + * @file CSmmAPI.cpp + */ + +using namespace SourceMM; + +CSmmAPI g_SmmAPI; + +CSmmAPI::CSmmAPI() +{ + m_ConPrintf = NULL; + m_CmdCache = false; + m_MsgCount = -1; + m_VSP = false; +} + +CSmmAPI::~CSmmAPI() +{ + m_UserMessages.RemoveAll(); +} + +void CSmmAPI::LogMsg(ISmmPlugin *pl, const char *msg, ...) +{ + va_list ap; + static char buffer[2048]; + + va_start(ap, msg); + UTIL_FormatArgs(buffer, sizeof(buffer), msg, ap); + va_end(ap); + + LogMessage("[%s] %s", pl->GetLogTag(), buffer); +} + +CreateInterfaceFn CSmmAPI::engineFactory(bool syn) +{ + if (syn) + return EngineFactory; + return g_Engine.engineFactory; +} + +CreateInterfaceFn CSmmAPI::physicsFactory(bool syn) +{ + if (syn) + return PhysicsFactory; + return g_Engine.physicsFactory; +} + +CreateInterfaceFn CSmmAPI::fileSystemFactory(bool syn) +{ + if (syn) + return FileSystemFactory; + return g_Engine.fileSystemFactory; +} + +CreateInterfaceFn CSmmAPI::serverFactory(bool syn) +{ + if (syn) + return CreateInterface; + return g_GameDll.factory; +} + +CGlobalVars *CSmmAPI::pGlobals() +{ + return g_Engine.pGlobals; +} + +void CSmmAPI::SetLastMetaReturn(META_RES res) +{ + m_Res = res; +} + +META_RES CSmmAPI::GetLastMetaReturn() +{ + return m_Res; +} + +IConCommandBaseAccessor *CSmmAPI::GetCvarBaseAccessor() +{ + return static_cast(&g_SMConVarAccessor); +} + +bool CSmmAPI::RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) +{ + if (pCommand->IsCommand()) + { + g_PluginMngr.AddPluginCmd(plugin, pCommand); + } else { + g_PluginMngr.AddPluginCvar(plugin, pCommand); + } + + return g_SMConVarAccessor.Register(pCommand); +} + +void CSmmAPI::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) +{ + if (pCommand->IsCommand()) + { + g_PluginMngr.RemovePluginCmd(plugin, pCommand); + } else { + g_PluginMngr.RemovePluginCvar(plugin, pCommand); + } + + g_SMConVarAccessor.Unregister(pCommand); +} + +void CSmmAPI::ConPrint(const char *fmt) +{ + (m_ConPrintf)("%s", fmt); +} + +void CSmmAPI::ConPrintf(const char *fmt, ...) +{ + va_list ap; + static char buffer[4096]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + (m_ConPrintf)("%s", buffer); +} + +void CSmmAPI::AddListener(ISmmPlugin *plugin, IMetamodListener *pListener) +{ + CPluginManager::CPlugin *pl = g_PluginMngr.FindByAPI(plugin); + + pl->m_Events.push_back(pListener); +} + +void *CSmmAPI::MetaFactory(const char *iface, int *_ret, PluginId *id) +{ + if (id) + { + *id = 0; + } + + if (!iface) + { + return NULL; + } + + //first check ours... we get first chance! + if (strcmp(iface, MMIFACE_SOURCEHOOK) == 0) + { + if (_ret) + { + *_ret = IFACE_OK; + } + return static_cast(static_cast(&g_SourceHook)); + } else if (strcmp(iface, MMIFACE_PLMANAGER) == 0) { + if (_ret) + { + *_ret = IFACE_OK; + } + return static_cast(static_cast(&g_PluginMngr)); + } + + CPluginManager::CPlugin *pl; + SourceHook::List::iterator event; + IMetamodListener *api; + int ret = 0; + void *val = NULL; + + for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) + { + pl = (*iter); + for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) + { + api = (*event); + ret = IFACE_FAILED; + if ( (val=api->OnMetamodQuery(iface, &ret)) != NULL ) + { + if (_ret) + *_ret = ret; + if (id) + *id = pl->m_Id; + return val; + } + } + } + + if (_ret) + *_ret = IFACE_FAILED; + + return NULL; +} + +////////////////////////////////////////////////////////////////////////// +//THERE BE HAX HERE!!!! DON'T TELL ALFRED, BUT GABE WANTED IT THAT WAY. // +// (note: you can find the offset by looking for the text // +// "Echo text to console", you'll find the callback cmd pushed on the // +// stack.) // +////////////////////////////////////////////////////////////////////////// + +#define SIGLEN 8 +#define ENGINE486_SIG "\x55\x89\xE5\x53\x83\xEC\x14\xBB" +#define ENGINE486_OFFS 40 +#define ENGINE686_SIG "\x53\x83\xEC\x08\xBB\x01\x00\x00" +#define ENGINE686_OFFS 50 +#define ENGINEAMD_SIG "\x53\x51\xBB\x01\x00\x00\x00\x51" +#define ENGINEAMD_OFFS 47 +#define ENGINEW32_SIG "\xA1\x2A\x2A\x2A\x2A\x56\xBE\x01" +#define ENGINEW32_OFFS 38 +#define IA32_CALL 0xE8 + +bool vcmp(const void *_addr1, const void *_addr2, size_t len) +{ + unsigned char *addr1 = (unsigned char *)_addr1; + unsigned char *addr2 = (unsigned char *)_addr2; + + for (size_t i=0; iGetCommands(); + unsigned char *ptr = NULL; + FnCommandCallback callback = NULL; + int offs = 0; + + while (pBase) + { + if ( strcmp(pBase->GetName(), "echo") == 0 ) + { + //callback = //*((FnCommandCallback *)((char *)pBase + offsetof(ConCommand, m_fnCommandCallback))); + callback = ((ConCommand *)pBase)->GetCallback(); + ptr = (unsigned char *)callback; + #ifdef OS_LINUX + if (vcmp(ptr, ENGINE486_SIG, SIGLEN)) + { + offs = ENGINE486_OFFS; + } + else if (vcmp(ptr, ENGINE686_SIG, SIGLEN)) + { + offs = ENGINE686_OFFS; + } + else if (vcmp(ptr, ENGINEAMD_SIG, SIGLEN)) + { + offs = ENGINEAMD_OFFS; + } + #elif defined OS_WIN32 // Only one Windows engine binary so far... + if (vcmp(ptr, ENGINEW32_SIG, SIGLEN)) + { + offs = ENGINEW32_OFFS; + } + #endif + + if (!offs || ptr[offs - 1] != IA32_CALL) + { + m_ConPrintf = (CONPRINTF_FUNC)Msg; + return false; + } + //get the relative offset + m_ConPrintf = *((CONPRINTF_FUNC *)(ptr + offs)); + //add the base offset, to the ip (which is the address+offset + 4 bytes for next instruction) + m_ConPrintf = (CONPRINTF_FUNC)((unsigned long)m_ConPrintf + (unsigned long)(ptr + offs) + 4); + + m_CmdCache = true; + + return true; + } + pBase = const_cast(pBase->GetNext()); + } + + m_ConPrintf = (CONPRINTF_FUNC)Msg; + + return false; +} + +bool CSmmAPI::CmdCacheSuccessful() +{ + return m_CmdCache; +} + +void CSmmAPI::GetApiVersions(int &major, int &minor, int &plvers, int &plmin) +{ + major = SM_VERS_API_MAJOR; + minor = SM_VERS_API_MINOR; + plvers = PLAPI_VERSION; + plmin = PLAPI_MIN_VERSION; +} + +void CSmmAPI::GetShVersions(int &shvers, int &shimpl) +{ + shvers = SH_IFACE_VERSION; + shimpl = SH_IMPL_VERSION; +} + +int CSmmAPI::FormatIface(char iface[], unsigned int maxlength) +{ + int length = (int)strlen(iface); + int i; + int num = 0; + + for (i = length - 1; i >= 0; i--) + { + if (!isdigit(iface[i])) + { + if (i != length - 1) + { + num = 1; + } + break; + } + } + + if ( (num && ((int)maxlength <= length)) || (!num && ((int)maxlength <= length + 3)) ) + { + return -1; + } + + if (i != length - 1) + num = atoi(&(iface[++i])); + + num++; + + snprintf(&(iface[i]), 4, "%03d", num); + + return num; +} + +void *CSmmAPI::InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret) +{ + char _if[256]; /* assume no interface goes beyond this */ + size_t len = strlen(iface); + int num = 0; + void *pf = NULL; + + if (max > 999) + max = 999; + + if (len + 4 > sizeof(_if)) + { + if (ret) + { + *ret = IFACE_FAILED; + } + return NULL; + } + + strcpy(_if, iface); + + do + { + if ( (pf = (fn)(_if, ret)) != NULL ) + break; + if (num > max) + break; + } while (( num = FormatIface(_if, len+1) )); + + return pf; +} + +void *CSmmAPI::VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min) +{ + char buffer[256]; /* assume no interface will go beyond this */ + size_t len = strlen(iface); + int ret; /* just in case something doesn't handle NULL properly */ + + if (len > sizeof(buffer) - 4) + { + return NULL; + } + + strcpy(buffer, iface); + + if (min != -1) + { + char *ptr = &buffer[len - 1]; + int digits = 0; + while (isdigit(*ptr) && digits <=3) + { + *ptr = '\0'; + digits++; + ptr--; + } + if (digits != 3) + { + /* for now, assume this is an error */ + strcpy(buffer, iface); + } else { + char num[4]; + min = (min == 0) ? 1 : min; + snprintf(num, sizeof(num), "%03d", min); + strcat(buffer, num); + } + } + + return InterfaceSearch(fn, buffer, IFACE_MAXNUM, &ret); +} + +const char *CSmmAPI::GetBaseDir() +{ + return g_ModPath.c_str(); +} + +void CSmmAPI::PathFormat(char *buffer, size_t len, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + size_t mylen = UTIL_FormatArgs(buffer, len, fmt, ap); + va_end(ap); + + for (size_t i = 0; i < mylen; i++) + { + if (buffer[i] == ALT_SEP_CHAR) + { + buffer[i] = PATH_SEP_CHAR; + } + } +} + +void CSmmAPI::ClientConPrintf(edict_t *client, const char *fmt, ...) +{ + va_list ap; + static char buffer[4096]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + g_Engine.engine->ClientPrintf(client, buffer); +} + +void CSmmAPI::LoadAsVSP() +{ + size_t len; + char engine_file[PATH_SIZE]; + char rel_path[PATH_SIZE * 2]; + + GetFileOfAddress(g_Engine.engine, engine_file, sizeof(engine_file)); + + /* Chop off the "engine" file part */ + len = strlen(engine_file); + for (size_t i = len - 1; i >= 0 && i < len; i--) + { + if (engine_file[i] == '/' + || engine_file[i] == '\\') + { + engine_file[i] = '\0'; + break; + } + } + + const char *usepath = g_SmmPath.c_str(); + if (UTIL_Relatize(rel_path, sizeof(rel_path), engine_file, g_SmmPath.c_str())) + { + usepath = rel_path; + } + + char command[PATH_SIZE * 2]; + g_VspListener.SetLoadable(true); + UTIL_Format(command, sizeof(command), "plugin_load \"%s\"\n", usepath); + g_Engine.engine->ServerCommand(command); +} + +void CSmmAPI::EnableVSPListener() +{ + /* If GameInit already passed and we're not already enabled or loaded, go ahead and LoadAsVSP load */ + if (bGameInit && !m_VSP && !g_VspListener.IsLoaded()) + { + LoadAsVSP(); + } + m_VSP = true; +} + +int CSmmAPI::GetGameDLLVersion() +{ + return g_GameDllVersion; +} + +////////////////////////////////////////////////////////////////////// +// EVEN MORE HACKS HERE! YOU HAVE BEEN WARNED! // +// Signatures necessary in finding the pointer to the CUtlDict that // +// stores user message information. // +// IServerGameDLL::GetUserMessageInfo() normally crashes with bad // +// message indices. This is our answer to it. Yuck! <:-( // +////////////////////////////////////////////////////////////////////// +#ifdef OS_WIN32 + /* General Windows sig */ + #define MSGCLASS_SIGLEN 7 + #define MSGCLASS_SIG "\x8B\x0D\x2A\x2A\x2A\x2A\x56" + #define MSGCLASS_OFFS 2 + + /* Dystopia Wimdows hack */ + #define MSGCLASS2_SIGLEN 16 + #define MSGCLASS2_SIG "\x56\x8B\x74\x24\x2A\x85\xF6\x7C\x2A\x3B\x35\x2A\x2A\x2A\x2A\x7D" + #define MSGCLASS2_OFFS 11 + + /* Windows frame pointer sig */ + #define MSGCLASS3_SIGLEN 18 + #define MSGCLASS3_SIG "\x55\x8B\xEC\x51\x89\x2A\x2A\x8B\x2A\x2A\x50\x8B\x0D\x2A\x2A\x2A\x2A\xE8" + #define MSGCLASS3_OFFS 13 +#elif defined OS_LINUX + /* No frame pointer sig */ + #define MSGCLASS_SIGLEN 14 + #define MSGCLASS_SIG "\x53\x83\xEC\x2A\x8B\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" + #define MSGCLASS_OFFS 9 + + /* Frame pointer sig */ + #define MSGCLASS2_SIGLEN 16 + #define MSGCLASS2_SIG "\x55\x89\xE5\x53\x83\xEC\x2A\x8B\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" + #define MSGCLASS2_OFFS 11 +#endif + +/* This is the ugliest function in all of SourceMM */ +/* :TODO: Make this prettier */ +bool CSmmAPI::CacheUserMessages() +{ + SourceHook::MemFuncInfo info = {true, -1, 0, 0}; + SourceHook::GetFuncInfo(&IServerGameDLL::GetUserMessageInfo, info); + + /* Get address of original GetUserMessageInfo() */ + char *vfunc = reinterpret_cast(g_GameDllPatch->GetOrigFunc(info.vtbloffs, info.vtblindex)); + + /* If we can't get original function, that means there's no hook */ + if (vfunc == NULL) + { + /* Get virtual function address 'manually' then */ + char *adjustedptr = reinterpret_cast(g_GameDll.pGameDLL) + info.thisptroffs + info.vtbloffs; + char **vtable = *reinterpret_cast(adjustedptr); + + vfunc = vtable[info.vtblindex]; + } + + /* Oh dear, we have a relative jump on our hands + * PVK II on Windows made me do this, but I suppose it doesn't hurt to check this on Linux too... + */ + if (*vfunc == '\xE9') + { + /* Get address from displacement... + * + * Add 5 because it's relative to next instruction: + * Opcode <1 byte> + 32-bit displacement <4 bytes> + */ + vfunc = vfunc + *reinterpret_cast(vfunc + 1) + 5; + } + + UserMsgDict *dict = NULL; + + if (vcmp(vfunc, MSGCLASS_SIG, MSGCLASS_SIGLEN)) + { + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + } else if (vcmp(vfunc, MSGCLASS2_SIG, MSGCLASS2_SIGLEN)) { + #ifdef OS_WIN32 + /* If we get here, the code is possibly inlined like in Dystopia */ + + /* Get the address of the CUtlRBTree */ + char *rbtree = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); + + /* CUtlDict should be 8 bytes before the CUtlRBTree (hacktacular!) */ + dict = reinterpret_cast(rbtree - 8); + #elif defined OS_LINUX + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + #endif + #ifdef OS_WIN32 + } else if (vcmp(vfunc, MSGCLASS3_SIG, MSGCLASS3_SIGLEN)) { + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS3_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + #endif + } + + if (dict) + { + m_MsgCount = dict->Count(); + + /* Ensure that count is within bounds of an unsigned byte, because that's what engine supports */ + if (m_MsgCount < 0 || m_MsgCount > 255) + { + m_MsgCount = -1; + return false; + } + + UserMessage *msg; + + /* Cache messages in our CUtlDict */ + for (int i = 0; i < m_MsgCount; i++) + { + msg = dict->Element(i); + m_UserMessages.Insert(msg->name, msg); + } + + return true; + } + + return false; +} + +bool CSmmAPI::MsgCacheSuccessful() +{ + return m_MsgCount > -1; +} + +int CSmmAPI::GetUserMessageCount() +{ + return m_MsgCount; +} + +int CSmmAPI::FindUserMessage(const char *name, int *size) +{ + int index = m_UserMessages.Find(name); + + if (size && index > -1) + { + UserMessage *msg = m_UserMessages.Element(index); + *size = msg->size; + } + + return index; +} + +const char *CSmmAPI::GetUserMessage(int index, int *size) +{ + if (m_MsgCount <= 0 || index < 0 || index >= m_MsgCount) + { + return NULL; + } + + UserMessage *msg = m_UserMessages.Element(index); + + if (size) + { + *size = msg->size; + } + + return msg->name; +} diff --git a/sourcemm/CSmmAPI.h b/sourcemm/CSmmAPI.h new file mode 100644 index 0000000..914fb7f --- /dev/null +++ b/sourcemm/CSmmAPI.h @@ -0,0 +1,98 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_CSMM_API_H +#define _INCLUDE_CSMM_API_H + +/** + * @brief Header for CSmmAPI implementation + * @file CSmmAPI.h + */ + +#include "ISmmAPI.h" +#include + +struct UserMessage +{ + int size; + const char *name; +}; + +typedef CUtlDict UserMsgDict; + +typedef void (*CONPRINTF_FUNC)(const char *, ...); + +namespace SourceMM +{ + class CSmmAPI : public ISmmAPI + { + public: + CSmmAPI(); + ~CSmmAPI(); + public: + void LogMsg(ISmmPlugin *pl, const char *msg, ...); + public: + CreateInterfaceFn engineFactory(bool syn=true); + CreateInterfaceFn physicsFactory(bool syn=true); + CreateInterfaceFn fileSystemFactory(bool syn=true); + CreateInterfaceFn serverFactory(bool syn=true); + CGlobalVars *pGlobals(); + void SetLastMetaReturn(META_RES res); + META_RES GetLastMetaReturn(); + IConCommandBaseAccessor *GetCvarBaseAccessor(); + bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); + void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); + void ConPrint(const char *fmt); + void ConPrintf(const char *fmt, ...); + bool RemotePrintingAvailable() + { + return CmdCacheSuccessful(); + } + virtual void GetApiVersions(int &major, int &minor, int &plvers, int &plmin); + virtual void GetShVersions(int &shvers, int &shimpl); + virtual void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener); + virtual void *MetaFactory(const char *iface, int *ret, PluginId *id); + virtual int FormatIface(char buffer[], unsigned int maxlength); + virtual void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret); + virtual const char *GetBaseDir(); + virtual void PathFormat(char *buffer, size_t len, const char *fmt, ...); + void ClientConPrintf(edict_t *client, const char *fmt, ...); + void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1); + void EnableVSPListener(); + int GetGameDLLVersion(); + int GetUserMessageCount(); + int FindUserMessage(const char *name, int *size=NULL); + const char *GetUserMessage(int index, int *size=NULL); + public: + bool CacheCmds(); + bool CmdCacheSuccessful(); + void LoadAsVSP(); + bool VSPEnabled() + { + return m_VSP; + } + bool CacheUserMessages(); + bool MsgCacheSuccessful(); + private: + META_RES m_Res; + CONPRINTF_FUNC m_ConPrintf; + bool m_CmdCache; + bool m_VSP; + int m_MsgCount; + UserMsgDict m_UserMessages; + }; +}; + +extern SourceMM::CSmmAPI g_SmmAPI; + +#define CONMSG g_SmmAPI.ConPrintf +#define CLIENT_CONMSG g_SmmAPI.ClientConPrintf + +#endif //_INCLUDE_CSMM_API_H diff --git a/sourcemm/IPluginManager.h b/sourcemm/IPluginManager.h new file mode 100644 index 0000000..fd0662f --- /dev/null +++ b/sourcemm/IPluginManager.h @@ -0,0 +1,137 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): David "BAILOPAN" Anderson +* ============================ +*/ + +#ifndef _INCLUDE_PLUGINMANAGER_H +#define _INCLUDE_PLUGINMANAGER_H + +/** + * @brief Plugin Manager interface + * @file IPluginManager.h + */ + +typedef int PluginId; + +#include "ISmmPlugin.h" + +/** + * @brief Load sources + */ +enum +{ + Pl_BadLoad=0, + Pl_Console=-1, + Pl_File=-2, + Pl_MinId=1, +}; + +/** + * @brief Status of a plugin at runtime + */ +enum Pl_Status +{ + Pl_NotFound=-4, + Pl_Error=-3, + Pl_Refused=-2, + Pl_Paused=-1, + Pl_Running=0, +}; + +typedef int PluginId; +struct factories; + +class ISmmPluginManager +{ +public: + /** + * @brief Loads a plugin and returns its id. If this is called before DLLInit(), + * then the plugin is considered to be "hot" - it might refuse its own load later! + * Also, a hot plugin might not have an error message. + * + * @param file String containing file name + * @param source Specifies who loaded the plugin + * @param status Status of the plugin + * @param ismm Pointer to Smm API + * @param error String buffer for error messages + * @param maxlen Maximum length of buffer + * @return Id of plugin + */ + virtual PluginId Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen) =0; + + /** + * @brief Unloads a plugin + * + * @param id Id of plugin + * @param error String buffer for error messages + * @param maxlen Maximum length of buffer + * @return True on success, false otherwise + */ + virtual bool Unload(PluginId id, bool force, char *error, size_t maxlen) =0; + + /** + * @brief Pauses a plugin + * + * @param id Id of plugin + * @param error String buffer for error messages + * @param maxlen Maximum length of buffer + * @return True on success, false otherwise + */ + virtual bool Pause(PluginId id, char *error, size_t maxlen) =0; + + /** + * @brief Unpauses a plugin + * + * @param id Id of plugin + * @param force If true, forces the plugin to unload + * @param error String buffer for error messages + * @param maxlen Maximum length of buffer + * @return True on success, false otherwise + */ + virtual bool Unpause(PluginId id, char *error, size_t maxlen) =0; + + /** + * @brief Unloads all plugins forcefully + * + * @return True on success, false otherwise + */ + virtual bool UnloadAll() =0; + + /** + * @brief Returns information about a plugin + * + * @param id Id of plugin + * @param file Pointer to file string by reference + * @param list Pointer to factories by reference + * @param status By reference status of plugin + * @param source By reference source of plugin + * @return True on success, false if not found + */ + virtual bool Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source) =0; + + /** + * @brief Checks another plugin's QueryRunning() status. + * + * @param id Id of plugin + * @param error Message buffer + * @param maxlen Size of error buffer + * @return Status value + */ + virtual bool QueryRunning(PluginId id, char *error, size_t maxlength) =0; + + /** + * @brief Returns the handle of a plugin (OS dependent meaning) + * + * @param id Id of plugin + * @param handle By reference handle of plugin, if any + * @return True if plugin id is valid, false otherwise + */ + virtual bool QueryHandle(PluginId id, void *&handle) =0; +}; + +#endif //_INCLUDE_PLUGINMANAGER_H diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h new file mode 100644 index 0000000..e6e90a7 --- /dev/null +++ b/sourcemm/ISmmAPI.h @@ -0,0 +1,320 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): David "BAILOPAN" Anderson +* ============================ +*/ + +#ifndef _INCLUDE_ISMM_API_H +#define _INCLUDE_ISMM_API_H + +/** + * @brief External API interface + * @file ISmmAPI.h + */ + +#include +#include +#include +#include "IPluginManager.h" + +#if defined __GNUC__ +#if ((__GNUC__ == 3) && (__GNUC_MINOR__ < 4)) || (__GNUC__ < 3) +#error "You must compile with at least GCC 3.4! If you know what you are doing, you can remove this message." +#endif //version check +#endif //__GNUC__ + +class IMetamodListener; +class ISmmPluginManager; +class ISmmPlugin; + +#define MMIFACE_SOURCEHOOK "ISourceHook" /**< ISourceHook Pointer */ +#define MMIFACE_PLMANAGER "IPluginManager" /**< SourceMM Plugin Functions */ +#define IFACE_MAXNUM 999 + +class ISmmAPI +{ +public: + /** + * @brief Logs a message through the HL2 log system. + * Note: Newlines are appended automatically. + * + * @param pl Plugin API pointer (used for tagging message) + * @param msg Formatted string. + */ + virtual void LogMsg(ISmmPlugin *pl, const char *msg, ...) =0; +public: + /** + * @brief Returns an interface factory for the HL2 engine. + * + * @param syn If syn is true, the synthetic wrapper is returned. + * If syn is false, the true function is returned. + * @return CreateInterfaceFn function pointer. + */ + virtual CreateInterfaceFn engineFactory(bool syn=true) =0; + + /** + * @brief Returns an interface factory for the HL2 physics engine. + * + * @param syn If syn is true, the synthetic wrapper is returned. + * If syn is false, the true function is returned. + * @return CreateInterfaceFn function pointer. + */ + virtual CreateInterfaceFn physicsFactory(bool syn=true) =0; + + /** + * @brief Returns an interface factory for the HL2 file system. + * + * @param syn If syn is true, the synthetic wrapper is returned. + * If syn is false, the true function is returned. + * @return CreateInterfaceFn function pointer. + */ + virtual CreateInterfaceFn fileSystemFactory(bool syn=true) =0; + + /** + * @brief Returns an interface factory for the GameDLL. + * + * @param syn If syn is true, the synthetic wrapper is returned. + * If syn is false, the true function is returned. + * @return CreateInterfaceFn function pointer. + */ + virtual CreateInterfaceFn serverFactory(bool syn=true) =0; + + /** + * @brief Returns a CGlobalVars pointer from the HL2 Engine. + * + * @return CGlobalVars pointer. + */ + virtual CGlobalVars *pGlobals() =0; + + /** + * @brief Used with SourceHook, sets teh last meta return value. + * Note: Do not call this directly, use the Metamod macros. + * + * @param res META_RETURN value to set. + */ + virtual void SetLastMetaReturn(META_RES res) =0; + + /** + * @brief Used with SourceHook, returns the last meta return value. + * Note: This is only valid inside a hook function. + * + * @return Last META_RETURN value set by a plugin. + */ + virtual META_RES GetLastMetaReturn() =0; + +public: // Added in 1.00-RC2 (0:0) + /** + * @brief Allows access to Metamod's ConCommandBaseAccessor. + * + * @return Returns IConCommandBaseAccessor pointer. + */ + virtual IConCommandBaseAccessor *GetCvarBaseAccessor() =0; + + /** + * @brief Registers a ConCommandBase. + * + * @param plugin Parent plugin API pointer. + * @param pCommand ConCommandBase to register. + * @return True if successful, false otherwise. Does not return false yet. + */ + virtual bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) =0; + + /** + * @brief Unregisters a ConCommandBase. + * + * @param plugin Parent plugin API pointer. + * @param pCommand ConCommandBase to unlink. + */ + virtual void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) =0; + + /** + * @brief Prints an unformatted string to the remote server console. + * Note: Newlines are not added automatically. + * + * @param str Message string. + */ + virtual void ConPrint(const char *str) =0; + + /** + * @brief Prints a formatted message to the remote server console. + * Note: Newlines are not added automatically. + * + * @param fmt Formatted message. + */ + virtual void ConPrintf(const char *fmt, ...) =0; + +public: // Added in 1.1.0 (1:0) + /** + * @brief Checks if ConPrint/ConPrintf will mirror to rcon. + * + * @return True if remote printing available, false otherwise. + */ + virtual bool RemotePrintingAvailable() =0; + + /** + * @brief Returns the Metamod Version numbers as major version and minor (API) version. + * Changes to minor version are guaranteed to be backwards compatible. + * Changes to major version are not. + * + * @param major Filled with the major API version number. + * @param minor Filled with the minor API version number. + * @param plvers Filled with the current plugin API version number. + * @param plmin Filled with the minimum plugin API version number supported. + */ + virtual void GetApiVersions(int &major, int &minor, int &plvers, int &plmin) =0; + + /** + * @brief Returns sourcehook API version and implementation version. + * + * @param shvers Filled with the SourceHook API version number. + * @param shimpl Filled with the SourceHook implementation number. + */ + virtual void GetShVersions(int &shvers, int &shimpl) =0; + + /** + * @brief Adds a Metamod listener. + * + * @param plugin Plugin interface pointer. + * @param pListener Listener interface pointer to add. + */ + virtual void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener) =0; + + /** + * @brief Queries the metamod factory + * + * @param iface String containing interface name + * @param ret Optional pointer to store return status + * @param id Optional pointer to store id of plugin that overrode interface, 0 if none + * @return Returned pointer + */ + virtual void *MetaFactory(const char *iface, int *ret, PluginId *id) =0; + +public: // Added in 1.1.2 (1:1) + /** + * @brief Given a base interface name, such as ServerGameDLL or ServerGameDLL003, + * reformats the string to increase the number, then returns the new number. + * This is the base function to InterfaceSearch() and VInterfaceMatch(). + * + * @param iface Input/output interface name. Must be writable. + * @param maxlength Maximum length of iface buffer. Must be at least strlen(iface)+4 chars. + * @return The newly incremented iface version number. + */ + virtual int FormatIface(char iface[], unsigned int maxlength) =0; + +public: // Added in 1.2 (1:2) + /** + * @brief Searches for an interface for you. + * + * @param fn InterfaceFactory function. + * @param iface Interface string name. + * @param max Maximum version to look up. + * @param ret Last return code from interface factory function. + * @return Interface pointer, or NULL if not found. + */ + virtual void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret) =0; + + /** + * @brief Returns the base directory of the game/server, equivalent to + * IVEngineServer::GetGameDir(), except the path is absolute. + * + * @return Static pointer to game's absolute basedir. + */ + virtual const char *GetBaseDir() =0; + + /** + * @brief Formats a file path to the local OS. Does not include any base directories. + * Note that all slashes and black slashes are reverted to the local OS's expectancy. + * + * @param buffer Destination buffer to store path. + * @param len Maximum length of buffer, including null terminator. + * @param fmt Formatted string. + */ + virtual void PathFormat(char *buffer, size_t len, const char *fmt, ...) =0; + +public: // Added in 1.2.2 (1:3) + /** + * @brief Prints text in the specified client's console. Same as IVEngineServer::ClientPrintf + * except that it allows for string formatting. + * + * @param client Client edict pointer. + * @param fmt Formatted string to print to the client. + */ + virtual void ClientConPrintf(edict_t *client, const char *fmt, ...) =0; + +public: // Added in 1.3 (1:4) + /** + * @brief Wrapper around InterfaceSearch(). Assumes no maximum. + * This is designed to replace the fact that searches only went upwards. + * The "V" is intended to convey that this is for Valve formatted interface strings. + * + * @param fn Interface factory function. + * @param iface Interface string. + * @param min Minimum value to search from. If zero, searching begins from the + * first available version regardless of the interface. + * Note that this can return interfaces EARLIER than the version specified. + * A value of -1 (default) specifies the string version as the minimum. + * Any other value specifices the minimum value to search from. + * @return Interface pointer, or NULL if not found. + */ + virtual void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1) =0; + +public: // Added in 1.4 (1:5) + /** + * @brief Tells SourceMM to add VSP hooking capability to plugins. + * + * Since this potentially uses more resources than it would otherwise, plugins have to + * explicitly enable the feature. Whether requested or not, if it is enabled, all plugins + * will get a pointer to the VSP listener through IMetamodListener. + */ + virtual void EnableVSPListener() =0; + + /** + * @brief Returns the interface version of the GameDLL's IServerGameDLL implementation. + * + * @return Interface version of the loaded IServerGameDLL. + */ + virtual int GetGameDLLVersion() =0; + + /** + * @brief Returns the number of user messages in the GameDLL. + * + * @return Number of user messages, or -1 if SourceMM has failed to get user message list. + */ + virtual int GetUserMessageCount() =0; + + /** + * @brief Returns the index of the specified user message. + * + * @param name User message name. + * @param size Optional pointer to store size of user message. + * @return Message index, or -1 on failure. + */ + virtual int FindUserMessage(const char *name, int *size=NULL) =0; + + /** + * @brief Returns the name of the specified user message. + * + * @param index User message index. + * @param size Optional pointer to store size of user message. + * @return Message name, or NULL on failure. + */ + virtual const char *GetUserMessage(int index, int *size=NULL) =0; +}; + + +/** + * Version History + * + * 1.1.0 Bumped API to 1:0. The breaking changes occurred in SourceHook and the plugin API. + * 1.1.2 Added API call for generating iface names. + * 1.2 Added API more helper functions and new SourceHook version. + * 1.2.2 Added API for printing to client console (with string formatting). + * 1.3 Added new interface search API. + * 1.4 Added VSP listener and user message API. + */ + +#endif //_INCLUDE_ISMM_API_H diff --git a/sourcemm/ISmmPlugin.h b/sourcemm/ISmmPlugin.h new file mode 100644 index 0000000..dea7700 --- /dev/null +++ b/sourcemm/ISmmPlugin.h @@ -0,0 +1,409 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): David "BAILOPAN" Anderson +* ============================ +*/ + +#ifndef _INCLUDE_ISMM_PLUGIN_H +#define _INCLUDE_ISMM_PLUGIN_H + +/** + * @brief Plugin API interface + * @file ISmmPlugin.h + */ + +#include +#include +#include "ISmmAPI.h" + +#define PLAPI_VERSION 10 +#define PLAPI_NAME "ISmmPlugin" + +class ISmmAPI; + +class ISmmPlugin +{ +public: + virtual int GetApiVersion() { return PLAPI_VERSION; } + virtual ~ISmmPlugin() { } +public: + /** + * @brief Called on plugin load. + * NOTE - As of API 7, this is called as DLLInit() executes - after the parameters are known, but before + * the original GameDLL function is called. Therefore, you cannot hook it, but you don't need to - + * Load() is basically your hook. + * NOTE - As of API 7, you can override factories before the engine and gamedll exchange them. + * However, take care to note that if your plugin is unloaded, and the gamedll/engine have cached + * an interface you've passed, something will definitely crash. Be careful. + * + * @param id Internal id of plugin. Saved globally by PLUGIN_SAVEVARS() + * @param ismm External API for SourceMM. Saved globally by PLUGIN_SAVEVARS() + * @param list Contains a list of factories. Hook a factory call by setting one equal to your own function. + * @param late Set to true if your plugin was loaded late (not at server load). + * @param error Error message buffer + * @param maxlen Size of error message buffer + * @return True if successful, return false to reject the load. + */ + virtual bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlength, bool late) =0; + + /** + * @brief Called when your plugin is "queried". This is useful for rejecting a loaded + * state. For example, if your plugin wants to stop operating, it can simply return + * false and copy an error message. This will notify other plugins or MM:S of something + * bad that happened. NOTE - MM:S will not cache the return state, so if you return false, + * your plugin will not actually be paused or unloaded. This callback will be called when: + * - Another plugin requests it + * - Someone types "meta list", it will show up as "REFUSED" + * - When Metamod need to re-check the plugin's status + * - If the plugin does something like overload a factory, Metamod will make sure the Query() returns true + * before calling it. + * Also note that this query will only override Metamod when the plugin is running and not paused. + * + * @param error Buffer for error message. This can be NULL! + * @param maxlen Maximum length of error buffer. + * @return Status code - true for okay, false for badness. + */ + virtual bool QueryRunning(char *error, size_t maxlen) + { + return true; + } + + /** + * @brief Called on plugin unload. You can return false if you know your plugin + * is not capable of restoring critical states it modifies. + * + * @param error Error message buffer + * @param maxlen Size of error message buffer + * @return True on success, return false to request no unload. + */ + virtual bool Unload(char *error, size_t maxlen) + { + return true; + } + + /** @brief Called on plugin pause. + * + * @param error Error message buffer + * @param maxlen Size of error message buffer + * @return True on success, return false to request no pause. + */ + virtual bool Pause(char *error, size_t maxlen) + { + return true; + } + + /** @brief Called on plugin unpause. + * + * @param error Error message buffer + * @param maxlen Size of error message buffer + * @return True on success, return false to request no unpause. + */ + virtual bool Unpause(char *error, size_t maxlen) + { + return true; + } +public: + /** @brief Return author as string */ + virtual const char *GetAuthor() =0; + + /** @brief Return plugin name as string */ + virtual const char *GetName() =0; + + /** @brief Return a description as string */ + virtual const char *GetDescription() =0; + + /** @brief Return a URL as string */ + virtual const char *GetURL() =0; + + /** @brief Return quick license code as string */ + virtual const char *GetLicense() =0; + + /** @brief Return version as string */ + virtual const char *GetVersion() =0; + + /** @brief Return author as string */ + virtual const char *GetDate() =0; + + /** @brief Return author as string */ + virtual const char *GetLogTag() =0; +public: + /** + * @brief Called when all plugins have been loaded - API version 4 + * + * This is useful for knowing when it's safe to request things another plugin might have. + * NOTE for API 7 - This is called after DLLInit(). + */ + virtual void AllPluginsLoaded() + { + } +}; + +/** + * @brief Added in 1.1 so plugins could listen to specific events + */ +class IMetamodListener +{ +public: + virtual ~IMetamodListener() { } +public: + /** + * @brief Called when a plugin is loaded. + * + * @param id Id of the plugin. + */ + virtual void OnPluginLoad(PluginId id) { } + + /** + * @brief Called when a plugin is unloaded. + * + * @param id Id of the plugin. + */ + virtual void OnPluginUnload(PluginId id) { } + + /** + * @brief Called when a plugin is paused. + * + * @param id Id of the plugin. + */ + virtual void OnPluginPause(PluginId id) { } + + /** + * @brief Called when a plugin is unpaused. + * + * @param id Id of the plugin. + */ + virtual void OnPluginUnpause(PluginId id) { } + + /** + * @brief Called when the level is loaded (after GameInit, before ServerActivate). + * + * To override this, hook IServerGameDLL::LevelInit(). + * + * @param pMapName Name of the map. + * @param pMapEntities Lump string of the map entities, in KeyValue format. + * @param pOldLevel Unknown. + * @param pLandmarkName Unknown. + * @param loadGame Unknown. + * @param background Unknown. + */ + virtual void OnLevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background) { } + + /** + * @brief Called when the level is shut down. May be called more than once. + */ + virtual void OnLevelShutdown() { } + + /** + * @brief Called when engineFactory() is used through Metamod:Source's wrapper. + * This can be used to provide interfaces to other plugins or the GameDLL. + * + * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. + * + * @param iface Interface string. + * @param ret Optional pointer to store return code. + * @return Generic pointer to the interface, or NULL if not found. + */ + virtual void *OnEngineQuery(const char *iface, int *ret) + { + if (ret) + { + *ret = IFACE_FAILED; + } + + return NULL; + } + + /** + * @brief Called when the physics factory is used through Metamod:Source's wrapper. + * This can be used to provide interfaces to other plugins. + * + * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. + * + * @param iface Interface string. + * @param ret Optional pointer to store return code. + * @return Generic pointer to the interface, or NULL if not found. + */ + virtual void *OnPhysicsQuery(const char *iface, int *ret) + { + if (ret) + { + *ret = IFACE_FAILED; + } + + return NULL; + } + + /** + * @brief Called when the filesystem factory is used through Metamod:Source's wrapper. + * This can be used to provide interfaces to other plugins. + * + * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. + * + * @param iface Interface string. + * @param ret Optional pointer to store return code. + * @return Generic pointer to the interface, or NULL if not found. + */ + virtual void *OnFileSystemQuery(const char *iface, int *ret) + { + if (ret) + { + *ret = IFACE_FAILED; + } + + return NULL; + } + + /** + * @brief Called when the server DLL's factory is used through Metamod:Source's wrapper. + * This can be used to provide interfaces to other plugins. + * + * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. + * + * @param iface Interface string. + * @param ret Optional pointer to store return code. + * @return Generic pointer to the interface, or NULL if not found. + */ + virtual void *OnGameDLLQuery(const char *iface, int *ret) + { + if (ret) + { + *ret = IFACE_FAILED; + } + + return NULL; + } + + /** + * @brief Called when Metamod's own factory is invoked. + * This can be used to provide interfaces to other plugins. + * + * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. + * + * @param iface Interface string. + * @param ret Optional pointer to store return code. + * @return Generic pointer to the interface, or NULL if not found. + */ + virtual void *OnMetamodQuery(const char *iface, int *ret) + { + if (ret) + { + *ret = IFACE_FAILED; + } + + return NULL; + } + + /** + * @brief Called when Metamod:Source acquires a valid IServerPluginCallbacks + * pointer to be used for hooking by plugins. + * + * This will only be called after a call to ISmmAPI::EnableVSPListener(). + * If called before GameInit, this callback will occur before LevelInit. + * Otherwise, it will be called on the first call after that. + * + * This callback is provided to all plugins regardless of which (or how many) + * called EnableVSPListener(), but only if at least one did in fact enable it. + * + * This callback is only available for plugins using API v1:5 (SourceMM 1.4+). + * + * @param iface Interface pointer. If NULL, then the VSP listening construct + * failed to initialize and is not available. + */ + virtual void OnVSPListening(IServerPluginCallbacks *iface) + { + } +}; + +#define PL_EXPOSURE CreateInterface +#define PL_EXPOSURE_C "CreateInterface" + +#define PLUGIN_EXPOSE(name, var) \ + ISmmAPI *g_SMAPI = NULL; \ + ISmmPlugin *g_PLAPI = NULL; \ + PluginId g_PLID = (PluginId)0; \ + SourceHook::ISourceHook *g_SHPtr = NULL; \ + SMM_API void *PL_EXPOSURE(const char *name, int *code) { \ + if (name && !strcmp(name, PLAPI_NAME)) { \ + return static_cast(&var); \ + } \ + return NULL; \ + } + +#define PLUGIN_GLOBALVARS() \ + extern SourceHook::ISourceHook *g_SHPtr; \ + extern ISmmAPI *g_SMAPI; \ + extern ISmmPlugin *g_PLAPI; \ + extern PluginId g_PLID; + +#define PLUGIN_SAVEVARS() \ + g_SMAPI = ismm; \ + g_SHPtr = static_cast(ismm->MetaFactory(MMIFACE_SOURCEHOOK, NULL, NULL)); \ + g_PLAPI = static_cast(this); \ + g_PLID = id; + +#define META_LOG g_SMAPI->LogMsg +#define META_REGCMD(name) g_SMAPI->RegisterConCmdBase(g_PLAPI, name##_command) +#define META_REGCVAR(var) g_SMAPI->RegisterConCmdBase(g_PLAPI, var) +#define META_UNREGCMD(name) g_SMAPI->UnregisterConCmdBase(g_PLAPI, name##_command) +#define META_UNREGCVAR(var) g_SMAPI->UnregisterConCmdBase(g_PLAPI, var) +#define META_CONPRINT g_SMAPI->ConPrint +#define META_CONPRINTF g_SMAPI->ConPrintf + +/* Probably should use this up above someday */ +#define CONCMD_VARNAME(name) name##_command + +#if !defined SMM_API +#if defined __WIN32__ || defined _WIN32 || defined WIN32 + #define SMM_API extern "C" __declspec(dllexport) +#elif defined __GNUC__ + #if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 1) + #define SMM_API extern "C" __attribute__ ((visibility("default"))) + #else + #define SMM_API extern "C" + #endif +#endif +#endif //!defined SMM_API + +/** + * @brief Macro for automatically getting a current or newer Valve interface. + * + * @param v_factory Factory method to use from ISmmAPI (such as engineFactory). + * @param v_var Variable name to store into. + * @param v_type Interface type (do not include the pointer/asterisk). + * @param v_name Interface name. + */ +#define GET_V_IFACE_CURRENT(v_factory, v_var, v_type, v_name) \ + v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name); \ + if (!v_var) \ + { \ + if (error && maxlen) \ + { \ + snprintf(error, maxlen, "Could not find interface: %s", v_name); \ + } \ + return false; \ + } + + /** + * @brief Same as GET_V_IFACE, except searches for any. + * + * @param v_factory Factory method to use from ISmmAPI (such as engineFactory). + * @param v_var Variable name to store into. + * @param v_type Interface type (do not include the pointer/asterisk). + * @param v_name Interface name. + */ +#define GET_V_IFACE_ANY(v_factory, v_var, v_type, v_name) \ + v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name, 0); \ + if (!v_var) \ + { \ + if (error && maxlen) \ + { \ + snprintf(error, maxlen, "Could not find interface: %s", v_name); \ + } \ + return false; \ + } + +#endif //_INCLUDE_ISMM_PLUGIN_H diff --git a/sourcemm/LICENSE.txt b/sourcemm/LICENSE.txt new file mode 100644 index 0000000..bf9f1fd --- /dev/null +++ b/sourcemm/LICENSE.txt @@ -0,0 +1,29 @@ +The software is Copyright (C) 2004-2007, Metamod:Source Development Team. + +Metamod:Source is distributed under the "zLib/libpng" license, which is reproduced +below: + +----------------------------------------------------------------------------- + +This software is provided "as-is", without any express or implied warranty. +In no event will the authors be held liable for any damages arising from +the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in + a product, an acknowledgment in the product documentation would be + appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +----------------------------------------------------------------------------- + +The zLib/libpng license has been approved by the "Open Source Initiative" +organization. diff --git a/sourcemm/Makefile b/sourcemm/Makefile new file mode 100644 index 0000000..7cea117 --- /dev/null +++ b/sourcemm/Makefile @@ -0,0 +1,69 @@ +#(C)2004-2007 SourceMM Development Team +# Makefile written by David "BAILOPAN" Anderson + +HL2SDK = ../../hl2sdk +SMM_ROOT = .. +SRCDS = ~/srcds + +### EDIT BELOW FOR OTHER PROJECTS ### + +OPT_FLAGS = -O2 -funroll-loops -s -pipe +GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden +DEBUG_FLAGS = -g -ggdb3 +CPP = gcc-4.1 +BINARY = server_i486.so + +HL2PUB = $(HL2SDK)/public +HL2LIB = $(HL2SDK)/linux_sdk + +OBJECTS = oslink.cpp util.cpp concommands.cpp CSmmAPI.cpp \ + sourcemm.cpp CPlugin.cpp sourcehook.cpp vsp_listener.cpp + +LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc + +INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ + -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug + CFLAGS = $(DEBUG_FLAGS) +else + BIN_DIR = Release + CFLAGS = $(OPT_FLAGS) +endif + +GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) + +CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse + +ifeq "$(GCC_VERSION)" "4" + CFLAGS += $(GCC4_FLAGS) +endif + +OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +$(BIN_DIR)/%.o: %.cpp + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +all: + mkdir -p $(BIN_DIR) + ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so + ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so + ln -sf $(SMM_ROOT)/sourcehook/sourcehook.cpp sourcehook.cpp + $(MAKE) sourcemm + rm -rf $(BINARY) + ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) + +sourcemm: $(OBJ_LINUX) + $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) + +debug: + $(MAKE) all DEBUG=true + +default: all + +clean: + rm -rf Release/*.o + rm -rf Release/$(BINARY) + rm -rf Debug/*.o + rm -rf Debug/$(BINARY) diff --git a/sourcemm/SourceMM.Doxyfile b/sourcemm/SourceMM.Doxyfile new file mode 100644 index 0000000..b7f2df7 --- /dev/null +++ b/sourcemm/SourceMM.Doxyfile @@ -0,0 +1,257 @@ +# Doxyfile 1.4.2 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = SourceMM +PROJECT_NUMBER = 1.00 +OUTPUT_DIRECTORY = c:\temp\smm-dox +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = YES +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = "C:/Documents and Settings/dvander.WHITENIGHT/Desktop/code/" +STRIP_FROM_INC_PATH = +SHORT_NAMES = YES +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = NO +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 38 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = YES +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = "C:/Documents and Settings/dvander.WHITENIGHT/Desktop/code/sourcemm" +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = test \ + sample_mm +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = NO +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = NO +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = NO +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 1000 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = YES diff --git a/sourcemm/changelog.txt b/sourcemm/changelog.txt new file mode 100644 index 0000000..40867d6 --- /dev/null +++ b/sourcemm/changelog.txt @@ -0,0 +1,125 @@ +2007/06/26 1.4.2: + - Fixed a bug where unloading all plugins could crash if one plugin had child plugins. + +2007/05/16 1.4.1: + - The client version of the "meta" command should now work with games using the latest + Source beta (srcds0407). + - Fixed amb233 (VSP listener didn't work with Steam dedicated version). + - Fixed amb277 (failed to get user message list in Kreedz Climbing). + +2007/04/05 1.4.0: + - Added API functions for retrieving User Message info without potentially crashing. + - Added API functions for letting SourceMM plugins use Valve Server Plugin callbacks. + - Added plugin status to client version of "meta list" command. Previously, it did not + differentiate between running and paused plugins. + - An experimental automatic gameinfo.txt fixer is now available. + - Changed version numbering to include the build number (SVN revision). + - Fixed amb93 (improved mod path detection). + - Fixed various rare string inconsistencies. + +2006/11/29 1.3d: + - Updated Metamod:Source to recognize the latest Source Engine version (ServerGameDLL006) + +2006/09/06 1.3a: + - Fixed a building issue on Linux which caused unresolved symbol errors when trying to + load Metamod:Source on a game using an older set of engine libraries. This fix should + now allow Metamod:Source to run with The Ship on Linux. + +2006/08/16 1.3: + - Added SourceHook support for functions that return references. + - Added some extra information to the "meta game" command: Description and Interface. For + example, CS:S would display "Counter-Strike: Source" and "ServerGameDLL004." + - Added some extra functionality to ISmmPluginManager. + - Added compiling support for MSVC 8.0 (Visual Studio 2005) and GCC 4.x + - Added another API helper function for formatting and searching for interfaces. + - Updated project files and source tree to use the latest HL2SDK. + - Updated the sample plugins to be a bit cleaner and use newer API. + - Fixed bug where Metamod:Source could load the wrong GameDLL and/or load more than one + GameDLL. This issue occured in HL2 CTF, SourceForts, or any other mod that relied on + files from another mod directory. + - Fixed bug where ISmmAPI::MetaFactory() would return the wrong interface when trying to + retrieve ISmmPluginManager. + - Fixed bug where returning false in Load() after adding a Metamod event listener or + hooking a function could cause a crash instead of rejecting the plugin. + - Fixed bug where trying to load Metamod:Source a second time as a SourceMM or Valve + server plugin could cause a crash. + - Fixed a bug in FormatIface() that caused InterfaceSearch() to infinite loop. + +2006/06/14 1.2.3: + - Added SourceHook API for manual recalls: RETURN_META_(VALUE_)MNEWPARAMS + - Added support for ServerGameDLL005 (latest HL2DM update) + +2006/05/25 1.2.2: + - Added the ability to "alias" plugin names in metaplugins.ini. + - Added "meta alias" command. + - Added SourceHook API for manual callclasses. + - Added support for the latest Source engine (ServerGameDLL005). + - Added API for printing text in a client's console with ClientConPrintf. This does the + same thing as IVEngineServer::ClientPrintf except that it allows string formatting. + - Added client version of "meta" command in order to allow clients to view version + information and a list of loaded plugins. + - Fixed a bug causing old mods on newer engines to fail loading. + - Fixed issues with SourceHook's SH_CALL and reference parameters. + - Fixed a bug where the mm_pluginsfile cvar was being ignored. + - Fixed a memory leak when using ISmmAPI::InterfaceSearch. + +2006/02/15 1.2.1: + - Fixed bug where returning newparams in a post hook would cause infinite recursion. + - Fixed bug where "meta load" could load the same plugin multiple times. + - Fixed bug where unloading a plugin could crash internal hook states. + - Fixed bug where unhooking a single hook would clear the hook chain. + +2006/01/07 1.2: + - Added SourceHook API for modifying parameters in the hook chain. + - Added SourceHook API for declaring and hooking manual vtable hooks. + - Added better API for querying an interface factory. + - Added API for formatting an OS-independent path. + - Added Listen Server Launcher to the graphical installer. + - Fixed bug where failed plugins could crash the plugin list. + - NOTE: SourceHook changes may require plugins to be recompiled against + the new API. + +2005/12/06 1.1.2: + - Added interface overriding/sharing examples to sample plugins. + - Added API to help guessing at Valve interface versions. + - Fixed various memory leaks. + - Fixed memory corruption bug on vector copying. + - Fixed other various template bugs. + +2005/10/21 1.1.1: + - Fixed a bug where AllPluginsLoaded() was not called after DLLInit(). + +2005/10/21 1.1: + - Rewrote GameDLL loading code to be API version generic. + As such, SourceMM will now easily support new API releases without + an SDK release, such as the case with Day of Defeat:Source + - Added more flexibility to plugin control by supplying an event system. + - Removed dependency on libstdc++.so by supplying a small template library. + - SourceHook internal API is now interface-based, meaning that future + updates to the API will not break older plugins. This update, however, + breaks older plugins. + - SourceHook is now re-entrant. + - Added a basic automated installer (by Basic-Master). + - Fixed a bug where games with changing game names would not work. + - Fixed various bugs, including a cvarlist corruption bug on unloading plugins. + +2005/07/07 1.00-RC2: + - Added API for dealing with ConCommandBase registration (cvars/concmds). + This is to fix the fact that Valve API provides no way to unlist a cvar/cmd. + - Added two new commands - "meta cmds" and "meta cvars". + - Added API calls for correctly printing to the console such that rcon + will also receive messages that a plugin prints. + This problem was mentioned on hlcoders and Valve offered no reply. + - Added event hooking and cvar samples to sample_mm. + - Added new cvar, mm_pluginsfile, which defaults to "addons/metamod/metaplugins.ini". + - Fixed a bug where multiple vtable patches on the same hook were not re-patched when removed. + This caused a crash when two hooks were declared on one function, the first was removed, and + the original function was then called. + - Fixed "meta clear" not unloading all plugins. + - Fixed Metamod:Source loading plugins with a higher current API version. + - Fixed whitespace being parsed in metaplugins.ini. + - Fixed bug where SourceHook tried to patch already destroyed/unavailable memory. + - Bumped Plugin API version to 6. + +2005/05/06 1.00-RC1: + - Initial release. diff --git a/sourcemm/concommands.cpp b/sourcemm/concommands.cpp new file mode 100644 index 0000000..4a3344f --- /dev/null +++ b/sourcemm/concommands.cpp @@ -0,0 +1,764 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#include +#include "CSmmAPI.h" +#include "concommands.h" +#include "CPlugin.h" +#include "sh_string.h" +#include "sh_list.h" + +/** + * @brief Console Command Implementations + * @file concommands.cpp + */ + +CAlwaysRegisterableCommand g_EternalCommand; +SMConVarAccessor g_SMConVarAccessor; + +bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) +{ + // Add the FCVAR_GAMEDLL flag + // => No crash on exit! + // UPDATE: Do _not_ add the FCVAR_GAMEDLL flag here, as it + // causes the command to be unusable on listenservers until you load a map + // We will set the FCVAR_GAMEDLL flag on all commands we have registered once we are being unloaded + //pCommand->AddFlags(FCVAR_GAMEDLL); + m_RegisteredCommands.push_back(pCommand); + + pCommand->SetNext( NULL ); + g_Engine.icvar->RegisterConCommandBase(pCommand); + + return true; +} + +bool SMConVarAccessor::Register(ConCommandBase *pCommand) +{ + //simple, don't mark as part of sourcemm! + pCommand->SetNext( NULL ); + g_Engine.icvar->RegisterConCommandBase(pCommand); + + return true; +} + +void SMConVarAccessor::MarkCommandsAsGameDLL() +{ + for (SourceHook::List::iterator iter = m_RegisteredCommands.begin(); + iter != m_RegisteredCommands.end(); ++iter) + { + (*iter)->AddFlags(FCVAR_GAMEDLL); + } +} + +void SMConVarAccessor::Unregister(ConCommandBase *pCommand) +{ + ICvar *cv = g_Engine.icvar; + ConCommandBase *ptr = cv->GetCommands(); + + if (ptr == pCommand) + { + //first in list + g_EternalCommand.BringToFront(); + g_EternalCommand.SetNext(const_cast(pCommand->GetNext())); + } else { + //find us and unregister us + ConCommandBase *pPrev = NULL; + while (ptr) + { + if (ptr == pCommand) + break; + pPrev = ptr; + ptr = const_cast(ptr->GetNext()); + } + if (pPrev && ptr == pCommand) + { + pPrev->SetNext(const_cast(pCommand->GetNext())); + } + } +} + +void SMConVarAccessor::UnregisterGameDLLCommands() +{ + ConCommandBase *begin = g_Engine.icvar->GetCommands(); + ConCommandBase *iter = begin; + ConCommandBase *prev = NULL; + while (iter) + { + // watch out for the ETERNAL COMMAND! + if (iter != &g_EternalCommand && iter->IsBitSet(FCVAR_GAMEDLL)) + { + // Remove it! + if (iter == begin) + { + g_EternalCommand.BringToFront(); + iter = const_cast(iter->GetNext()); + g_EternalCommand.SetNext(iter); + prev = &g_EternalCommand; + continue; + } + else + { + iter = const_cast(iter->GetNext()); + prev->SetNext(iter); + continue; + } + } + prev = iter; + iter = const_cast(iter->GetNext()); + } +} + +ConVar metamod_version("metamod_version", SOURCEMM_VERSION, FCVAR_REPLICATED | FCVAR_SPONLY | FCVAR_NOTIFY, "Metamod:Source Version"); +#if defined WIN32 || defined _WIN32 +ConVar mm_pluginsfile("mm_pluginsfile", "addons\\metamod\\metaplugins.ini", FCVAR_SPONLY, "Metamod:Source Plugins File"); +#else +ConVar mm_pluginsfile("mm_pluginsfile", "addons/metamod/metaplugins.ini", FCVAR_SPONLY, "Metamod:Source Plugins File"); +#endif + +CON_COMMAND(meta, "Metamod:Source Menu") +{ + IVEngineServer *e = g_Engine.engine; + + int args = e->Cmd_Argc(); + + if (args >= 2) + { + const char *command = e->Cmd_Argv(1); + if (strcmp(command, "credits") == 0) + { + CONMSG("Metamod:Source was developed by:\n"); + CONMSG(" SourceHook: Pavol \"PM OnoTo\" Marko\n"); + CONMSG(" GameDLL/Plugins: David \"BAILOPAN\" Anderson\n"); + CONMSG(" GameDLL: Scott \"Damaged Soul\" Ehlert\n"); + CONMSG("For more information, see the official website\n"); + CONMSG("http://www.sourcemm.net/\n"); + + return; + } else if (strcmp(command, "version") == 0) { + CONMSG("Metamod:Source version %s\n", SOURCEMM_VERSION); + CONMSG("Compiled on: %s\n", SOURCEMM_DATE); + CONMSG("Plugin interface version: %d:%d\n", PLAPI_VERSION, PLAPI_MIN_VERSION); + CONMSG("SourceHook version: %d:%d\n", g_SourceHook.GetIfaceVersion(), g_SourceHook.GetImplVersion()); + CONMSG("http://www.sourcemm.net/\n"); + + return; + } else if (strcmp(command, "game") == 0) { + CONMSG("GameDLL Information\n"); + CONMSG(" Description: %s\n", g_GameDll.pGameDLL->GetGameDescription()); + CONMSG(" Mod Path: %s\n", g_ModPath.c_str()); + CONMSG(" DLL Path: %s\n", g_BinPath.c_str()); + CONMSG(" Interface: ServerGameDLL%03d\n", g_GameDllVersion); + + // Display user messages + if (g_SmmAPI.MsgCacheSuccessful()) + { + const char *msgname; + int msgsize; + int msgcount = g_SmmAPI.GetUserMessageCount(); + + if (msgcount > 0) + { + CONMSG(" User Messages: %-32.31s %-5s %-5s\n", "Name", "Index", "Size"); + + for (int i = 0; i < msgcount; i++) + { + msgname = g_SmmAPI.GetUserMessage(i, &msgsize); + + CONMSG(" %-32.31s %-5d %-5d\n", msgname, i, msgsize); + } + + CONMSG(" %d user message%s in total\n", msgcount, (msgcount > 1) ? "s" : ""); + } else { + CONMSG(" User Messages: None\n"); + } + } else { + CONMSG(" User Messages: Failed to get list of user messages\n"); + } + + return; + } else if (strcmp(command, "refresh") == 0) { + char full_path[255]; + g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), GetPluginsFile()); + + LoadPluginsFromFile(full_path); + + return; + } else if (strcmp(command, "list") == 0) { + SourceMM::CPluginManager::CPlugin *pl; + PluginIter i; + const char *status=""; + const char *version=NULL; + const char *name=NULL; + const char *author=NULL; + + CONMSG("-Id- %-20.19s %-10.9s %-20.19s %-8.7s\n", "Name", "Version", "Author", "Status"); + for (i=g_PluginMngr._begin(); i!=g_PluginMngr._end(); i++) + { + pl = (*i); + if (!pl) + break; + if (pl->m_Status == Pl_Paused) + { + status = "PAUSE"; + } else if (pl->m_Status == Pl_Running) { + if (pl->m_API && pl->m_API->QueryRunning(NULL, 0)) + status = "RUN"; + else + status = "STOPPED"; + } else if (pl->m_Status == Pl_Refused) { + status = "FAIL"; + } else if (pl->m_Status == Pl_Error) { + status = "ERROR"; + } else if (pl->m_Status == Pl_NotFound) { + status = "NOFILE"; + } + + if (pl->m_API) + { + version = pl->m_API->GetVersion(); + author = pl->m_API->GetAuthor(); + name = pl->m_API->GetName(); + } else { + version = "-"; + author = "-"; + name = "-"; + } + + if (!version) + version = "-"; + if (!author) + author = "-"; + if (!name) + name = pl->m_File.c_str(); + + + CONMSG("[%02d] %-20.19s %-10.9s %-20.19s %-8.7s\n", pl->m_Id, name, version, author, status); + } + + //CONMSG("\n"); + + return; + } else if (strcmp(command, "cmds") == 0) { + if (args >= 3) + { + int id = atoi(e->Cmd_Argv(2)); + SourceMM::CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); + + if (!pl) + { + CONMSG("Plugin %d not found.\n", id); + return; + } + + if (!pl->m_API) + { + CONMSG("Plugin %d is not loaded.\n", id); + } else { + CONMSG("Console commands for %s:\n", pl->m_API->GetName()); + SourceHook::List::iterator ci; + size_t count = 0; + + for (ci=pl->m_Cmds.begin(); ci!=pl->m_Cmds.end(); ci++) + { + count++; + CONMSG(" [%5d] %-s\n", count, (*ci)->GetName()); + } + } + } else { + CONMSG("Usage: meta cmds \n"); + } + + return; + } else if (strcmp(command, "cvars") == 0) { + if (args >= 3) + { + int id = atoi(e->Cmd_Argv(2)); + SourceMM::CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); + + if (!pl) + { + CONMSG("Plugin %d not found.\n", id); + return; + } + + if (!pl->m_API) + { + CONMSG("Plugin %d is not loaded.\n", id); + } else { + CONMSG("Registered cvars for %s:\n", pl->m_API->GetName()); + SourceHook::List::iterator ci; + size_t count = 0; + + for (ci=pl->m_Cvars.begin(); ci!=pl->m_Cvars.end(); ci++) + { + count++; + CONMSG(" [%5d] %-s\n", count, (*ci)->GetName()); + } + } + } else { + CONMSG("Usage: meta cvars \n"); + } + + return; + } else if (strcmp(command, "info") == 0) { + if (args >= 3) + { + int id = atoi(e->Cmd_Argv(2)); + SourceMM::CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); + if (!pl) + { + CONMSG("Plugin %d not found.\n", id); + return; + } + + if (!pl->m_API) + { + CONMSG("Plugin %d is not loaded.\n", id); + } else { + if (pl->m_Status == Pl_Paused) + { + CONMSG("Plugin %d is paused.\n", id); + } else if (pl->m_Status == Pl_Running) { + char run_msg[255]; + bool run = false; + if (pl->m_API && pl->m_API->QueryRunning(run_msg, sizeof(run_msg)-1)) + run = true; + if (run) + { + CONMSG("Plugin %d is running.\n", id); + } else { + CONMSG("Plugin %d is stopped: %s\n", id, run_msg); + } + } + CONMSG(" Name: \"%s\" by %s\n", pl->m_API->GetName(), pl->m_API->GetAuthor()); + CONMSG(" Version: %s\n", pl->m_API->GetVersion()); + CONMSG(" Description: %s\n", pl->m_API->GetDescription()); + CONMSG(" License: %s\n", pl->m_API->GetLicense()); + CONMSG(" URL: %s\n", pl->m_API->GetURL()); + CONMSG(" Details: API %03d, Date: %s\n", pl->m_API->GetApiVersion(), pl->m_API->GetDate()); + } + CONMSG("File: %s\n\n", pl->m_File.c_str()); + + return; + } else { + CONMSG("Usage: meta info \n"); + + return; + } + } else if (strcmp(command, "pause") == 0) { + if (args >= 3) + { + int id = atoi(e->Cmd_Argv(2)); + + char error[255]; + + if (!g_PluginMngr.Pause(id, error, sizeof(error))) + { + CONMSG("Pause failed: %s\n", error); + return; + } + + CONMSG("Plugin %d has been paused.\n", id); + + return; + } else { + CONMSG("Usage: meta pause \n"); + + return; + } + } else if (strcmp(command, "unpause") == 0) { + if (args >= 3) + { + int id = atoi(e->Cmd_Argv(2)); + char error[255]; + + if (!g_PluginMngr.Unpause(id, error, sizeof(error))) + { + CONMSG("Unpause failed: %s\n", error); + return; + } + + CONMSG("Plugin %d has been unpaused.\n", id); + + return; + } else { + CONMSG("Usage: meta unpause \n"); + + return; + } + } else if (strcmp(command, "load") == 0) { + if (args >= 3) + { + const char *file = e->Cmd_Argv(2); + char full_path[255]; + + const char *alias = g_PluginMngr.LookupAlias(file); + if (alias) + { + file = alias; + } + + if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0) + { + g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s", file); + } else { + const char *ext = UTIL_GetExtension(file); +#if defined WIN32 || defined _WIN32 + ext = ext ? "" : ".dll"; +#else + ext = ext ? "" : "_i486.so"; +#endif + g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); + } + + char error[255]={0}; + bool already; + SourceMM::CPluginManager::CPlugin *pl; + + PluginId id = g_PluginMngr.Load(full_path, Pl_Console, already, error, sizeof(error)); + pl = g_PluginMngr.FindById(id); + if (!pl || id < Pl_MinId || (pl->m_Status < Pl_Paused)) + { + CONMSG("Failed to load plugin %s (%s).\n", file, error); + return; + } + + if (!already) + { + CONMSG("Plugin \"%s\" loaded with id %d.\n", pl->m_API->GetName(), pl->m_Id); + } else { + CONMSG("Plugin \"%s\" is already loaded as %d.\n", pl->m_API->GetName(), pl->m_Id); + } + + return; + } else { + CONMSG("Usage: meta load \n"); + + return; + } + } else if ( (strcmp(command, "alias") == 0) || + (strcmp(command, "aliases") == 0) ) { + if (args >= 4) + { + const char *alias = e->Cmd_Argv(2); + const char *value = e->Cmd_Argv(3); + + g_PluginMngr.SetAlias(alias, value); + if (value[0] == '\0') + { + CONMSG("Deleted alias: %s.\n", alias); + } else { + CONMSG("Set alias \"%s\" to: %s\n", alias, value); + } + } else if (args >= 3) { + const char *alias = e->Cmd_Argv(2); + const char *value = g_PluginMngr.LookupAlias(alias); + if (value) + { + CONMSG("Alias \"%s\" is set to: %s\n", alias, value); + } else { + CONMSG("Alias \"%s\" was not found.\n", alias); + } + } else { + SourceHook::List::iterator iter, end; + SourceMM::CNameAlias *p; + + iter = g_PluginMngr._alias_begin(); + end = g_PluginMngr._alias_end(); + size_t total = 0; + if (iter != end) + { + CONMSG("%-10.9s %s\n", "Alias", "File"); + CONMSG(" --- \n"); + for (; iter!=end; iter++) + { + p = (*iter); + CONMSG("%-10.9s %s\n", p->alias.c_str(), p->value.c_str()); + total++; + } + CONMSG(" --- \n"); + CONMSG("%d aliases total.\n", total); + } else { + CONMSG("No aliases found.\n"); + } + } + return; + } else if (strcmp(command, "unload") == 0) { + if (args >= 3) + { + const char *file = e->Cmd_Argv(2); + int id = atoi(file); + char error[255]={0}; + + if (id == 0 && isalpha(file[0])) + { + char full_path[255]; + const char *alias = g_PluginMngr.LookupAlias(file); + + if (alias) + { + file = alias; + } + + /* first check if it's a known filename */ + if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0) + { + g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s", file); + } else { + const char *ext = UTIL_GetExtension(file); +#if defined WIN32 || defined _WIN32 + ext = ext ? "" : ".dll"; +#else + ext = ext ? "" : "_i486.so"; +#endif + g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); + } + + SourceHook::List::iterator iter, end; + SourceMM::CPluginManager::CPlugin *pl; + iter = g_PluginMngr._begin(); + end = g_PluginMngr._end(); + for (; iter!=end; iter++) + { + pl = (*iter); + if (strcmp(pl->m_File.c_str(), full_path) == 0) + { + id = pl->m_Id; + break; + } + } + if (id == 0) + { + CONMSG("Plugin \"%s\" not found.\n", full_path); + return; + } + } + + if (!g_PluginMngr.Unload(id, false, error, sizeof(error))) + { + CONMSG("Unload failed: %s\n", error); + return; + } + + CONMSG("Plugin %d unloaded.\n", id); + } else { + CONMSG("Usage: meta unload \n"); + } + return; + } else if (strcmp(command, "force_unload") == 0) { + if (args >= 3) + { + int id = atoi(e->Cmd_Argv(2)); + char error[255]={0}; + + if (!g_PluginMngr.Unload(id, false, error, sizeof(error))) + { + CONMSG("Force unload failed: %s\n", error); + return; + } + + CONMSG("Plugin %d force unloaded.\n", id); + + return; + } else { + CONMSG("Usage: meta force_unload \n"); + + return; + } + } else if (strcmp(command, "clear") == 0) { + if (!g_PluginMngr.UnloadAll()) + { + CONMSG("One or more plugins resisted removal (cleaned anyway).\n"); + return; + } + + CONMSG("All plugins unloaded.\n"); + + return; + } else if (strcmp(command, "retry") == 0) { + if (args >= 3) + { + int id = atoi(e->Cmd_Argv(2)); + char error[255]; + + if (!g_PluginMngr.Retry(id, error, sizeof(error))) + { + CONMSG("Error reloading plugin: %s\n", error); + return; + } + + CONMSG("Plugin %d successfully reloaded.\n", id); + + return; + } else { + CONMSG("Usage: meta retry \n"); + + return; + } + } + } + + CONMSG("Metamod:Source Menu\n"); + CONMSG("usage: meta [arguments]\n"); + CONMSG(" alias - List or set an alias\n"); + CONMSG(" clear - Unload all plugins forcefully\n"); + CONMSG(" cmds - Show plugin commands\n"); + CONMSG(" cvars - Show plugin cvars\n"); + CONMSG(" credits - About Metamod:Source\n"); + CONMSG(" force_unload - Forcefully unload a plugin\n"); + CONMSG(" game - Information about GameDLL\n"); + CONMSG(" info - Information about a plugin\n"); + CONMSG(" list - List plugins\n"); + CONMSG(" load - Load a plugin\n"); + CONMSG(" pause - Pause a running plugin\n"); + CONMSG(" refresh - Reparse plugins file\n"); + CONMSG(" retry - Attempt to reload a plugin\n"); + CONMSG(" unload - Unload a loaded plugin\n"); + CONMSG(" unpause - Unpause a paused plugin\n"); + CONMSG(" version - Version information\n"); +} + +CAlwaysRegisterableCommand::CAlwaysRegisterableCommand() +{ + Create("", NULL, FCVAR_UNREGISTERED|FCVAR_GAMEDLL); + m_pICvar = NULL; +} + +bool CAlwaysRegisterableCommand::IsRegistered( void ) const +{ + return false; +} + +void CAlwaysRegisterableCommand::BringToFront() +{ + if (!m_pICvar) + m_pICvar = g_Engine.icvar; + + // First, let's try to find us! + ConCommandBase *pPtr = m_pICvar->GetCommands(); + + if (pPtr == this) + { + // We are already at the beginning; Nothing to do + return; + } + + while (pPtr) + { + if (pPtr == this && pPtr->IsCommand() && stricmp(GetName(), pPtr->GetName()) == 0) + break; + ConCommandBase *pPrev = NULL; + while (pPtr) + { + if (pPtr == this) + break; + pPrev = pPtr; + pPtr = const_cast(pPtr->GetNext()); + } + if (pPrev && pPtr == this) + { + pPrev->SetNext(m_pNext); // Remove us from the list + } + // Now, register us + SetNext(NULL); + m_pICvar->RegisterConCommandBase(this); + } +} + +void ClientCommand_handler(edict_t *client) +{ + IVEngineServer *e = g_Engine.engine; + const char *cmd = e->Cmd_Argv(0); + + if (strcmp(cmd, "meta") == 0) + { + int args = e->Cmd_Argc(); + if (args == 2) + { + const char *subcmd = e->Cmd_Argv(1); + + if (strcmp(subcmd, "credits") == 0) + { + CLIENT_CONMSG(client, "Metamod:Source was developed by:\n"); + CLIENT_CONMSG(client, " SourceHook: Pavol \"PM OnoTo\" Marko\n"); + CLIENT_CONMSG(client, " GameDLL/Plugins: David \"BAILOPAN\" Anderson\n"); + CLIENT_CONMSG(client, " GameDLL: Scott \"Damaged Soul\" Ehlert\n"); + CLIENT_CONMSG(client, "For more information, see the official website\n"); + CLIENT_CONMSG(client, "http://www.sourcemm.net/\n"); + + RETURN_META(MRES_SUPERCEDE); + } else if(strcmp(subcmd, "version") == 0) { + CLIENT_CONMSG(client, "Metamod:Source version %s\n", SOURCEMM_VERSION); + CLIENT_CONMSG(client, "Compiled on: %s\n", SOURCEMM_DATE); + CLIENT_CONMSG(client, "Plugin interface version: %d:%d\n", PLAPI_VERSION, PLAPI_MIN_VERSION); + CLIENT_CONMSG(client, "SourceHook version: %d:%d\n", g_SourceHook.GetIfaceVersion(), g_SourceHook.GetImplVersion()); + CLIENT_CONMSG(client, "http://www.sourcemm.net/\n"); + + RETURN_META(MRES_SUPERCEDE); + } else if(strcmp(subcmd, "list") == 0) { + SourceMM::CPluginManager::CPlugin *pl; + Pl_Status st; + PluginIter i; + const char *version = NULL; + const char *name = NULL; + const char *author = NULL; + const char *status = NULL; + + CLIENT_CONMSG(client, "-Id- %-20.19s %-10.9s %-20.19s %6s\n", "Name", "Version", "Author", "Status"); + + for (i=g_PluginMngr._begin(); i!=g_PluginMngr._end(); i++) + { + pl = (*i); + if (!pl) + break; + + st = pl->m_Status; + + /* Only show plugins that are running or paused */ + if (pl->m_API && (st == Pl_Running || st == Pl_Paused)) + { + version = pl->m_API->GetVersion(); + author = pl->m_API->GetAuthor(); + name = pl->m_API->GetName(); + + if (st == Pl_Running && pl->m_API->QueryRunning(NULL, 0)) + { + status = "RUN"; + } else { + status = "PAUSE"; + } + + if (!version || !author || !name) + break; + + CLIENT_CONMSG(client, "[%02d] %-20.19s %-10.9s %-20.19s %6s\n", pl->m_Id, name, version, author, status); + } + } + + RETURN_META(MRES_SUPERCEDE); + } + } + + CLIENT_CONMSG(client, "Metamod:Source Menu\n"); + CLIENT_CONMSG(client, "usage: meta \n"); + CLIENT_CONMSG(client, " credits - About Metamod:Source\n"); + CLIENT_CONMSG(client, " list - List plugins\n"); + CLIENT_CONMSG(client, " version - Version information\n"); + + RETURN_META(MRES_SUPERCEDE); + } + + RETURN_META(MRES_IGNORED); +} + +const char *GetPluginsFile() +{ + return mm_pluginsfile.GetString(); +} diff --git a/sourcemm/concommands.h b/sourcemm/concommands.h new file mode 100644 index 0000000..56ca953 --- /dev/null +++ b/sourcemm/concommands.h @@ -0,0 +1,53 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_CONCOMMANDS_H +#define _INCLUDE_CONCOMMANDS_H + +/** + * @brief Header for console commands + * @file concommands.h + */ + +#include +#include +#include "sourcemm.h" +#include "convar_smm.h" +#include "sh_list.h" + +class SMConVarAccessor : public IConCommandBaseAccessor +{ + SourceHook::List m_RegisteredCommands; +public: + virtual bool RegisterConCommandBase(ConCommandBase *pCommand); + bool Register(ConCommandBase *pCommand); + void MarkCommandsAsGameDLL(); + void Unregister(ConCommandBase *pCommand); + void UnregisterGameDLLCommands(); +}; + +class CAlwaysRegisterableCommand : public ConCommandBase +{ + ICvar *m_pICvar; +public: + CAlwaysRegisterableCommand(); + bool IsRegistered( void ) const; + // If already registered, removes us + // Then it registers us again + void BringToFront(); +}; + +void ClientCommand_handler(edict_t *client); + +const char *GetPluginsFile(); + +extern SMConVarAccessor g_SMConVarAccessor; + +#endif //_INCLUDE_CONCOMMANDS_H diff --git a/sourcemm/convar_smm.h b/sourcemm/convar_smm.h new file mode 100644 index 0000000..26abce9 --- /dev/null +++ b/sourcemm/convar_smm.h @@ -0,0 +1,523 @@ +//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $Workfile: $ +// $Date$ +// +//----------------------------------------------------------------------------- +// $NoKeywords: $ +//=============================================================================// + +#ifndef CONVAR_H +#define CONVAR_H +#if _WIN32 +#pragma once +#endif + +#include "tier0/dbg.h" + +#ifdef _WIN32 +#define FORCEINLINE_CVAR FORCEINLINE +#elif _LINUX +#define FORCEINLINE_CVAR __inline__ FORCEINLINE +#else +#error "implement me" +#endif + +// The default, no flags at all +#define FCVAR_NONE 0 + +// Command to ConVars and ConCommands +// ConVar Systems +#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. +#define FCVAR_LAUNCHER (1<<1) // defined by launcher +#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL +#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL +#define FCVAR_MATERIAL_SYSTEM (1<<4) // Defined by the material system. +#define FCVAR_DATACACHE (1<<19) // Defined by the datacache system. +#define FCVAR_STUDIORENDER (1<<15) // Defined by the studiorender system. +#define FCVAR_FILESYSTEM (1<<21) // Defined by the file system. +#define FCVAR_PLUGIN (1<<18) // Defined by a 3rd party plugin. +#define FCVAR_TOOLSYSTEM (1<<20) // Defined by an IToolSystem library +#define FCVAR_SOUNDSYSTEM (1<<23) // Defined by the soundsystem library +#define FCVAR_INPUTSYSTEM (1<<25) // Defined by the inputsystem dll +#define FCVAR_NETWORKSYSTEM (1<<26) // Defined by the network system +// NOTE!! if you add a cvar system, add it here too!!!! +// the engine lacks a cvar flag, but needs it for xbox +// an engine cvar is thus a cvar not marked with any other system +#define FCVAR_NON_ENGINE ((FCVAR_LAUNCHER|FCVAR_GAMEDLL|FCVAR_CLIENTDLL|FCVAR_MATERIAL_SYSTEM|FCVAR_DATACACHE|FCVAR_STUDIORENDER|FCVAR_FILESYSTEM|FCVAR_PLUGIN|FCVAR_TOOLSYSTEM|FCVAR_SOUNDSYSTEM|FCVAR_INPUTSYSTEM|FCVAR_NETWORKSYSTEM)) + +// ConVar only +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc +#define FCVAR_NOTIFY (1<<8) // notifies players when changed +#define FCVAR_USERINFO (1<<9) // changes the client's info string +#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats + +#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log +#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar + +// It's a ConVar that's shared between the client and the server. +// At signon, the values of all such ConVars are sent from the server to the client (skipped for local +// client, of course ) +// If a change is requested it must come from the console (i.e., no remote client changes) +// If a value is changed while a server is active, it's replicated to all connected clients +#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time +#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file +#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles + +#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server + +#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox + + +// #define FCVAR_AVAILABLE (1<<27) +// #define FCVAR_AVAILABLE (1<<28) +// #define FCVAR_AVAILABLE (1<<29) +// #define FCVAR_AVAILABLE (1<<30) +// #define FCVAR_AVAILABLE (1<<31) + + +class ConVar; +class ConCommand; +class ConCommandBase; + +// Any executable that wants to use ConVars need to implement one of +// these to hook up access to console variables. +class IConCommandBaseAccessor +{ +public: + // Flags is a combination of FCVAR flags in cvar.h. + // hOut is filled in with a handle to the variable. + virtual bool RegisterConCommandBase( ConCommandBase *pVar )=0; +}; + + +// You don't have to instantiate one of these, just call its +// OneTimeInit function when your executable is initializing. +class ConCommandBaseMgr +{ +public: + // Call this ONCE when the executable starts up. + static void OneTimeInit( IConCommandBaseAccessor *pAccessor ); +#ifdef _XBOX + static bool Fixup( ConCommandBase* pConCommandBase ); +#ifndef _RETAIL + static void PublishCommands( bool bForce ); +#endif +#endif +}; + +// Called when a ConVar changes value +typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString ); + +// Called when a ConCommand needs to execute +typedef void ( *FnCommandCallback )( void ); + +#define COMMAND_COMPLETION_MAXITEMS 64 +#define COMMAND_COMPLETION_ITEM_LENGTH 64 + +// Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings +typedef int ( *FnCommandCompletionCallback )( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); + +//----------------------------------------------------------------------------- +// Purpose: The base console invoked command/cvar interface +//----------------------------------------------------------------------------- +class ConCommandBase +{ + friend class ConCommandBaseMgr; + friend class CCvar; + friend class ConVar; + friend class ConCommand; + +public: + ConCommandBase( void ); + ConCommandBase( char const *pName, char const *pHelpString = 0, + int flags = 0 ); + + virtual ~ConCommandBase( void ); + + virtual bool IsCommand( void ) const; + + // Check flag + virtual bool IsBitSet( int flag ) const; + // Set flag + virtual void AddFlags( int flags ); + + // Return name of cvar + virtual char const *GetName( void ) const; + + // Return help text for cvar + virtual char const *GetHelpText( void ) const; + + // Deal with next pointer + const ConCommandBase *GetNext( void ) const; + void SetNext( ConCommandBase *next ); + + virtual bool IsRegistered( void ) const; + + // Global methods + static ConCommandBase const *GetCommands( void ); + static void AddToList( ConCommandBase *var ); + static void RemoveFlaggedCommands( int flag ); + static void RevertFlaggedCvars( int flag ); + static ConCommandBase const *FindCommand( char const *name ); + +protected: + virtual void Create( char const *pName, char const *pHelpString = 0, + int flags = 0 ); + + // Used internally by OneTimeInit to initialize. + virtual void Init(); + + // Internal copy routine ( uses new operator from correct module ) + char *CopyString( char const *from ); + + // Next ConVar in chain + ConCommandBase *m_pNext; + +private: + // Has the cvar been added to the global list? + bool m_bRegistered; + + // Static data + char const *m_pszName; + char const *m_pszHelpString; + + // ConVar flags + int m_nFlags; + +protected: + + // ConVars add themselves to this list for the executable. Then ConVarMgr::Init() runs through + // all the console variables and registers them. + static ConCommandBase *s_pConCommandBases; + + // ConVars in this executable use this 'global' to access values. + static IConCommandBaseAccessor *s_pAccessor; +}; + +//----------------------------------------------------------------------------- +// Purpose: The console invoked command +//----------------------------------------------------------------------------- +class ConCommand : public ConCommandBase +{ +friend class ConCommandBaseMgr; +friend class CCvar; +#ifdef _STATIC_LINKED +friend class G_ConCommand; +friend class C_ConCommand; +friend class M_ConCommand; +friend class S_ConCommand; +friend class D_ConCommand; +#endif + +public: + typedef ConCommandBase BaseClass; + + ConCommand( void ); + ConCommand( char const *pName, FnCommandCallback callback, + char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); + + virtual ~ConCommand( void ); + + virtual bool IsCommand( void ) const; + + virtual int AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); + + virtual bool CanAutoComplete( void ); + + // Invoke the function + virtual void Dispatch( void ); +private: + virtual void Create( char const *pName, FnCommandCallback callback, + char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); + + // Call this function when executing the command + FnCommandCallback m_fnCommandCallback; + + FnCommandCompletionCallback m_fnCompletionCallback; + bool m_bHasCompletionCallback; +public: + FnCommandCallback GetCallback() { return m_fnCommandCallback; } +}; + +//----------------------------------------------------------------------------- +// Purpose: A console variable +//----------------------------------------------------------------------------- +class ConVar : public ConCommandBase +{ +friend class ConCommandBaseMgr; +friend class CCvar; +friend class CDefaultCvar; +#ifdef _STATIC_LINKED +friend class G_ConVar; +friend class C_ConVar; +friend class M_ConVar; +friend class S_ConVar; +friend class D_ConVar; +#endif + +public: + typedef ConCommandBase BaseClass; + + ConVar( char const *pName, char const *pDefaultValue, int flags = 0); + + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString ); + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ); + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString, FnChangeCallback callback ); + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, + FnChangeCallback callback ); + + virtual ~ConVar( void ); + + virtual bool IsBitSet( int flag ) const; + virtual char const* GetHelpText( void ) const; + virtual bool IsRegistered( void ) const; + virtual char const *GetName( void ) const; + virtual void AddFlags( int flags ); + virtual bool IsCommand( void ) const; + + // Install a change callback (there shouldn't already be one....) + void InstallChangeCallback( FnChangeCallback callback ); + + // Retrieve value + FORCEINLINE_CVAR float GetFloat( void ) const; + FORCEINLINE_CVAR int GetInt( void ) const; + FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } + FORCEINLINE_CVAR char const *GetString( void ) const; + + // Any function that allocates/frees memory needs to be virtual or else you'll have crashes + // from alloc/free across dll/exe boundaries. + + // These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue). + virtual void SetValue( char const *value ); + virtual void SetValue( float value ); + virtual void SetValue( int value ); + + // Reset to default value + void Revert( void ); + + // True if it has a min/max setting + bool GetMin( float& minVal ) const; + bool GetMax( float& maxVal ) const; + char const *GetDefault( void ) const; + + static void RevertAll( void ); +private: + // Called by CCvar when the value of a var is changing. + virtual void InternalSetValue(char const *value); + // For CVARs marked FCVAR_NEVER_AS_STRING + virtual void InternalSetFloatValue( float fNewValue ); + virtual void InternalSetIntValue( int nValue ); + + virtual bool ClampValue( float& value ); + virtual void ChangeStringValue( char const *tempVal ); + + virtual void Create( char const *pName, char const *pDefaultValue, int flags = 0, + char const *pHelpString = 0, bool bMin = false, float fMin = 0.0, + bool bMax = false, float fMax = false, FnChangeCallback callback = 0 ); + + // Used internally by OneTimeInit to initialize. + virtual void Init(); + +private: + + // This either points to "this" or it points to the original declaration of a ConVar. + // This allows ConVars to exist in separate modules, and they all use the first one to be declared. + // m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar). + ConVar *m_pParent; + + // Static data + char const *m_pszDefaultValue; + + // Value + // Dynamically allocated + char *m_pszString; + int m_StringLength; + + // Values + float m_fValue; + int m_nValue; + + // Min/Max values + bool m_bHasMin; + float m_fMinVal; + bool m_bHasMax; + float m_fMaxVal; + + // Call this function when ConVar changes + FnChangeCallback m_fnChangeCallback; +}; + + +//----------------------------------------------------------------------------- +// Purpose: Return ConVar value as a float +// Output : float +//----------------------------------------------------------------------------- +FORCEINLINE_CVAR float ConVar::GetFloat( void ) const +{ + return m_pParent->m_fValue; +} + +//----------------------------------------------------------------------------- +// Purpose: Return ConVar value as an int +// Output : int +//----------------------------------------------------------------------------- +FORCEINLINE_CVAR int ConVar::GetInt( void ) const +{ + return m_pParent->m_nValue; +} + + +//----------------------------------------------------------------------------- +// Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. +// Output : char const * +//----------------------------------------------------------------------------- +FORCEINLINE_CVAR char const *ConVar::GetString( void ) const +{ + if ( m_nFlags & FCVAR_NEVER_AS_STRING ) + { + return "FCVAR_NEVER_AS_STRING"; + } + + return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : ""; +} + + +#ifdef _STATIC_LINKED +// identifies subsystem via piggybacking constructors with flags +class G_ConCommand : public ConCommand +{ +public: + G_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_GAMEDLL, completionFunc) {} +}; + +class C_ConCommand : public ConCommand +{ +public: + C_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_CLIENTDLL, completionFunc) {} +}; + +class M_ConCommand : public ConCommand +{ +public: + M_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_MATERIAL_SYSTEM, completionFunc) {} +}; + +class S_ConCommand : public ConCommand +{ +public: + S_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_STUDIORENDER, completionFunc) {} +}; + +class D_ConCommand : public ConCommand +{ +public: + D_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_DATACACHE, completionFunc) {} +}; + +typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString ); +typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString ); +typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString ); +typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString ); +typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString ); + +class G_ConVar : public ConVar +{ +public: + G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, (FnChangeCallback)callback ) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class C_ConVar : public ConVar +{ +public: + C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, (FnChangeCallback)callback ) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class M_ConVar : public ConVar +{ +public: + M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, (FnChangeCallback)callback ) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class S_ConVar : public ConVar +{ +public: + S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, (FnChangeCallback)callback ) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, S_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class D_ConVar : public ConVar +{ +public: + D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, (FnChangeCallback)callback ) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, D_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +// redirect these declarations to their specific subsystem +#ifdef GAME_DLL +#define ConCommand G_ConCommand +#define ConVar G_ConVar +#endif +#ifdef CLIENT_DLL +#define ConCommand C_ConCommand +#define ConVar C_ConVar +#endif +#ifdef MATERIALSYSTEM_DLL +#define ConCommand M_ConCommand +#define ConVar M_ConVar +#endif +#ifdef STUDIORENDER_DLL +#define ConCommand S_ConCommand +#define ConVar S_ConVar +#endif +#ifdef DATACACHE_DLL +#define ConCommand D_ConCommand +#define ConVar D_ConVar +#endif +#endif // _STATIC_LINKED + +//----------------------------------------------------------------------------- +// Purpose: Utility to quicky generate a simple console command +//----------------------------------------------------------------------------- +#define CON_COMMAND( name, description ) \ + static void name(); \ + static ConCommand name##_command( #name, name, description ); \ + static void name() + +//----------------------------------------------------------------------------- +// Purpose: Utility to quicky generate a simple console command +//----------------------------------------------------------------------------- +#define CON_COMMAND_F( name, description, flags ) \ + static void name(); \ + static ConCommand name##_command( #name, name, description, flags ); \ + static void name() + + +#endif // CONVAR_H diff --git a/sourcemm/msvc7/sourcemm.sln b/sourcemm/msvc7/sourcemm.sln new file mode 100644 index 0000000..fa8eb75 --- /dev/null +++ b/sourcemm/msvc7/sourcemm.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug.ActiveCfg = Debug|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug.Build.0 = Debug|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release.ActiveCfg = Release|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/sourcemm/msvc7/sourcemm.vcproj b/sourcemm/msvc7/sourcemm.vcproj new file mode 100644 index 0000000..556c859 --- /dev/null +++ b/sourcemm/msvc7/sourcemm.vcproj @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcemm/msvc8/sourcemm.sln b/sourcemm/msvc8/sourcemm.sln new file mode 100644 index 0000000..b338452 --- /dev/null +++ b/sourcemm/msvc8/sourcemm.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.ActiveCfg = Debug|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.Build.0 = Debug|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.ActiveCfg = Release|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/sourcemm/msvc8/sourcemm.vcproj b/sourcemm/msvc8/sourcemm.vcproj new file mode 100644 index 0000000..615c8d1 --- /dev/null +++ b/sourcemm/msvc8/sourcemm.vcproj @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcemm/oslink.cpp b/sourcemm/oslink.cpp new file mode 100644 index 0000000..cee64a3 --- /dev/null +++ b/sourcemm/oslink.cpp @@ -0,0 +1,69 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +/** + * @brief Implements OS-dependant functions from oslink.h + * @file oslink.cpp + */ + +#include "oslink.h" +#ifdef __linux +#include +#include +#endif + +#if defined __WIN32__ || defined _WIN32 || defined WIN32 +const char *dlerror() +{ + static char buf[1024]; + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &buf, 0, NULL); + return buf; +} +#endif + +#if defined __linux__ +int GetLastError() +{ + return errno; +} + +extern "C" void __cxa_guard_acquire(void) +{ +} + +extern "C" void __cxa_guard_release(void) +{ +} +#endif + +bool GetFileOfAddress(void *pAddr, char *buffer, size_t maxlength) +{ +#if defined WIN32 || defined _WIN32 + MEMORY_BASIC_INFORMATION mem; + if (!VirtualQuery(pAddr, &mem, sizeof(mem))) + return false; + if (mem.AllocationBase == NULL) + return false; + HMODULE dll = (HMODULE)mem.AllocationBase; + GetModuleFileName(dll, (LPTSTR)buffer, maxlength); +#elif defined __linux__ + Dl_info info; + if (!dladdr(pAddr, &info)) + return false; + if (!info.dli_fbase || !info.dli_fname) + return false; + const char *dllpath = info.dli_fname; + snprintf(buffer, maxlength, "%s", dllpath); +#endif + return true; +} diff --git a/sourcemm/oslink.h b/sourcemm/oslink.h new file mode 100644 index 0000000..77e4b75 --- /dev/null +++ b/sourcemm/oslink.h @@ -0,0 +1,91 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_OSLINK_H +#define _INCLUDE_OSLINK_H + +/** + * @brief Defines OS-independent information + * @file oslink.h + */ + +#if defined __WIN32__ || defined _WIN32 || defined WIN32 + #define WIN32_LEAN_AND_MEAN + #define OS_WIN32 + #if defined _MSC_VER && _MSC_VER >= 1400 + #undef ARRAYSIZE + #else + #define mkdir(a) _mkdir(a) + #endif + #include + #include + #include + #define dlmount(x) LoadLibrary(x) + #define dlsym(x, s) GetProcAddress(x, s) + #define dlclose(x) FreeLibrary(x) + const char* dlerror(); + #define abspath(x, s) _fullpath(x, s, sizeof(x)) + #define PATH_SEP_STR "\\" + #define PATH_SEP_CHAR '\\' + #define ALT_SEP_CHAR '/' + #define PATH_SIZE MAX_PATH + #define SERVER_DLL "server.dll" +#elif defined __linux__ + #define OS_LINUX + #include + #include + #include + #include + typedef void* HINSTANCE; + #define dlmount(x) dlopen(x,RTLD_NOW) + #define abspath(x, s) realpath(s, x) + #define PATH_SEP_STR "/" + #define PATH_SEP_CHAR '/' + #define ALT_SEP_CHAR '\\' + #define PATH_SIZE PATH_MAX + #define stricmp strcasecmp + #define strnicmp strncasecmp + #define SERVER_DLL "server_i486.so" +#endif + +#if defined __linux__ + extern int errno; + int GetLastError(); +#endif + +bool GetFileOfAddress(void *pAddr, char *buffer, size_t maxlength); + +#if defined __WIN32__ || defined _WIN32 || defined WIN32 + #define SMM_API extern "C" __declspec(dllexport) +#elif defined __GNUC__ + #if (__GNUC__ == 4) + #define SMM_API extern "C" __attribute__ ((visibility("default"))) + #else + #define SMM_API extern "C" + #endif +#endif + +#if defined __WIN32__ || defined _WIN32 || defined WIN32 + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; +#elif defined __GNUC__ +#include +#if !__GLIBC_HAVE_LONG_LONG + typedef long long int64_t; + typedef unsigned long long uint64_t; +#endif +#endif + +#ifndef __linux__ + #define snprintf _snprintf + #define vsnprintf _vsnprintf +#endif + +#endif //_INCLUDE_OSLINK_H diff --git a/sourcemm/sample_mm/LICENSE.txt b/sourcemm/sample_mm/LICENSE.txt new file mode 100644 index 0000000..bf9f1fd --- /dev/null +++ b/sourcemm/sample_mm/LICENSE.txt @@ -0,0 +1,29 @@ +The software is Copyright (C) 2004-2007, Metamod:Source Development Team. + +Metamod:Source is distributed under the "zLib/libpng" license, which is reproduced +below: + +----------------------------------------------------------------------------- + +This software is provided "as-is", without any express or implied warranty. +In no event will the authors be held liable for any damages arising from +the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in + a product, an acknowledgment in the product documentation would be + appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +----------------------------------------------------------------------------- + +The zLib/libpng license has been approved by the "Open Source Initiative" +organization. diff --git a/sourcemm/sample_mm/Makefile b/sourcemm/sample_mm/Makefile new file mode 100644 index 0000000..8d6f411 --- /dev/null +++ b/sourcemm/sample_mm/Makefile @@ -0,0 +1,67 @@ +#(C)2004-2007 SourceMM Development Team +# Makefile written by David "BAILOPAN" Anderson + +HL2SDK = ../../../hl2sdk +SMM_ROOT = ../.. +SRCDS = ~/srcds + +### EDIT BELOW FOR OTHER PROJECTS ### + +OPT_FLAGS = -O3 -funroll-loops -s -pipe +GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden +DEBUG_FLAGS = -g -ggdb3 +CPP = gcc-4.1 +BINARY = sample_mm_i486.so + +HL2PUB = $(HL2SDK)/public +HL2LIB = $(HL2SDK)/linux_sdk + +OBJECTS = SamplePlugin.cpp cvars.cpp + +LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc + +INCLUDE = -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ + -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook -I$(SMM_ROOT)/sourcemm + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug + CFLAGS = $(DEBUG_FLAGS) +else + BIN_DIR = Release + CFLAGS = $(OPT_FLAGS) +endif + +GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) + +CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse + +ifeq "$(GCC_VERSION)" "4" + CFLAGS += $(GCC4_FLAGS) +endif + +OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +$(BIN_DIR)/%.o: %.cpp + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +all: + mkdir -p $(BIN_DIR) + ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so + ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so + $(MAKE) sourcemm + rm -rf $(BINARY) + ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) + +sourcemm: $(OBJ_LINUX) + $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) + +debug: + $(MAKE) all DEBUG=true + +default: all + +clean: + rm -rf Release/*.o + rm -rf Release/$(BINARY) + rm -rf Debug/*.o + rm -rf Debug/$(BINARY) diff --git a/sourcemm/sample_mm/SamplePlugin.cpp b/sourcemm/sample_mm/SamplePlugin.cpp new file mode 100644 index 0000000..62c874e --- /dev/null +++ b/sourcemm/sample_mm/SamplePlugin.cpp @@ -0,0 +1,237 @@ +/* ======== sample_mm ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#include +#include "SamplePlugin.h" +#include "cvars.h" + +//Declare the hooks we will be using in this file. Hooking will not compile without these. +//The macro naming scheme is SH_DECL_HOOKn[_void]. +//If you have 5 parameters, it would be HOOK5. If the function is void, add _void. +//It stands for "SourceHook, Declare Hook". +SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, 0, bool, char const *, char const *, char const *, char const *, bool, bool); +SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int); +SH_DECL_HOOK1_void(IServerGameDLL, GameFrame, SH_NOATTRIB, 0, bool); +SH_DECL_HOOK0_void(IServerGameDLL, LevelShutdown, SH_NOATTRIB, 0); +SH_DECL_HOOK2_void(IServerGameClients, ClientActive, SH_NOATTRIB, 0, edict_t *, bool); +SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *); +SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, char const *); +SH_DECL_HOOK1_void(IServerGameClients, SetCommandClient, SH_NOATTRIB, 0, int); +SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *); +SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char*, const char *, char *, int); +SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); +SH_DECL_HOOK2(IGameEventManager2, FireEvent, SH_NOATTRIB, 0, bool, IGameEvent *, bool); + +SamplePlugin g_SamplePlugin; +MyListener g_Listener; + +PLUGIN_EXPOSE(SamplePlugin, g_SamplePlugin); + +bool SamplePlugin::LevelInit(const char *pMapName, const char *pMapEntities, const char *pOldLevel, const char *pLandmarkName, bool loadGame, bool background) +{ + META_LOG(g_PLAPI, "LevelInit() called: pMapName=%s", pMapName); + RETURN_META_VALUE(MRES_IGNORED, true); +} + +void SamplePlugin::OnLevelShutdown() +{ + META_LOG(g_PLAPI, "OnLevelShutdown() called from listener"); +} + +void SamplePlugin::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) +{ + META_LOG(g_PLAPI, "ServerActivate() called: edictCount=%d, clientMax=%d", edictCount, clientMax); + RETURN_META(MRES_IGNORED); +} + +void SamplePlugin::GameFrame(bool simulating) +{ + //don't log this, it just pumps stuff to the screen ;] + //META_LOG(g_PLAPI, "GameFrame() called: simulating=%d", simulating); + RETURN_META(MRES_IGNORED); +} + +void SamplePlugin::LevelShutdown( void ) +{ + META_LOG(g_PLAPI, "LevelShutdown() called"); + RETURN_META(MRES_IGNORED); +} + +void SamplePlugin::ClientActive(edict_t *pEntity, bool bLoadGame) +{ + META_LOG(g_PLAPI, "ClientActive called: pEntity=%d", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0); + RETURN_META(MRES_IGNORED); +} + +void SamplePlugin::ClientDisconnect(edict_t *pEntity) +{ + META_LOG(g_PLAPI, "ClientDisconnect called: pEntity=%d", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0); + RETURN_META(MRES_IGNORED); +} + +void SamplePlugin::ClientPutInServer(edict_t *pEntity, char const *playername) +{ + META_LOG(g_PLAPI, "ClientPutInServer called: pEntity=%d, playername=%s", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0, playername); + RETURN_META(MRES_IGNORED); +} + +void SamplePlugin::SetCommandClient(int index) +{ + META_LOG(g_PLAPI, "SetCommandClient() called: index=%d", index); + RETURN_META(MRES_IGNORED); +} + +void SamplePlugin::ClientSettingsChanged(edict_t *pEdict) +{ + META_LOG(g_PLAPI, "ClientSettingsChanged called: pEdict=%d", pEdict ? m_Engine->IndexOfEdict(pEdict) : 0); + RETURN_META(MRES_IGNORED); +} + +bool SamplePlugin::ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) +{ + META_LOG(g_PLAPI, "ClientConnect called: pEntity=%d, pszName=%s, pszAddress=%s", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0, pszName, pszAddress); + RETURN_META_VALUE(MRES_IGNORED, true); +} + +void SamplePlugin::ClientCommand(edict_t *pEntity) +{ + META_LOG(g_PLAPI, "ClientCommand called: pEntity=%d (commandString=%s)", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0, m_Engine->Cmd_Args() ? m_Engine->Cmd_Args() : ""); + RETURN_META(MRES_IGNORED); +} + +bool FireEvent_Handler(IGameEvent *event, bool bDontBroadcast) +{ + if (!event || !event->GetName()) + RETURN_META_VALUE(MRES_IGNORED, false); + + /** + * Note that this will only fire on game events that are already being listened to. + * For events that are not firing (such as item_pickup), you must actually + * register an event listener in the event manager. This hook is provided + * as an example for non-eiface hooks only. + */ + + const char *name = event->GetName(); + + META_LOG(g_PLAPI, "FireGameEvent called: name=%s", name); + + RETURN_META_VALUE(MRES_IGNORED, true); +} + +bool SamplePlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) +{ + PLUGIN_SAVEVARS(); + + GET_V_IFACE_ANY(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); + GET_V_IFACE_CURRENT(engineFactory, m_Engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); + GET_V_IFACE_ANY(serverFactory, m_ServerClients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS); + GET_V_IFACE_CURRENT(engineFactory, m_GameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2); + + META_LOG(g_PLAPI, "Starting plugin.\n"); + + ismm->AddListener(this, &g_Listener); + + //Init our cvars/concmds + ConCommandBaseMgr::OneTimeInit(&g_Accessor); + + //We're hooking the following things as POST, in order to seem like Server Plugins. + //However, I don't actually know if Valve has done server plugins as POST or not. + //Change the last parameter to 'false' in order to change this to PRE. + //SH_ADD_HOOK_MEMFUNC means "SourceHook, Add Hook, Member Function". + + //Hook LevelInit to our function + SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelInit, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelInit, true); + //Hook ServerActivate to our function + SH_ADD_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, m_ServerDll, &g_SamplePlugin, &SamplePlugin::ServerActivate, true); + //Hook GameFrame to our function + SH_ADD_HOOK_MEMFUNC(IServerGameDLL, GameFrame, m_ServerDll, &g_SamplePlugin, &SamplePlugin::GameFrame, true); + //Hook LevelShutdown to our function -- this makes more sense as pre I guess + SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelShutdown, false); + //Hook ClientActivate to our function + SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientActive, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientActive, true); + //Hook ClientDisconnect to our function + SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientDisconnect, true); + //Hook ClientPutInServer to our function + SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientPutInServer, true); + //Hook SetCommandClient to our function + SH_ADD_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, m_ServerClients, &g_SamplePlugin, &SamplePlugin::SetCommandClient, true); + //Hook ClientSettingsChanged to our function + SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientSettingsChanged, true); + + //The following functions are pre handled, because that's how they are in IServerPluginCallbacks + + //Hook ClientConnect to our function + SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientConnect, false); + //Hook ClientCommand to our function + SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientCommand, false); + + //This hook is a static hook, no member function + SH_ADD_HOOK_STATICFUNC(IGameEventManager2, FireEvent, m_GameEventManager, FireEvent_Handler, false); + + //Get the call class for IVServerEngine so we can safely call functions without + // invoking their hooks (when needed). + m_Engine_CC = SH_GET_CALLCLASS(m_Engine); + + SH_CALL(m_Engine_CC, &IVEngineServer::LogPrint)("All hooks started!\n"); + + return true; +} + +bool SamplePlugin::Unload(char *error, size_t maxlen) +{ + //IT IS CRUCIAL THAT YOU REMOVE CVARS. + //As of Metamod:Source 1.00-RC2, it will automatically remove them for you. + //But this is only if you've registered them correctly! + + //Make sure we remove any hooks we did... this may not be necessary since + //SourceHook is capable of unloading plugins' hooks itself, but just to be safe. + + SH_REMOVE_HOOK_STATICFUNC(IGameEventManager2, FireEvent, m_GameEventManager, FireEvent_Handler, false); + SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelInit, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelInit, true); + SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, m_ServerDll, &g_SamplePlugin, &SamplePlugin::ServerActivate, true); + SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, GameFrame, m_ServerDll, &g_SamplePlugin, &SamplePlugin::GameFrame, true); + SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelShutdown, false); + SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientActive, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientActive, true); + SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientDisconnect, true); + SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientPutInServer, true); + SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, m_ServerClients, &g_SamplePlugin, &SamplePlugin::SetCommandClient, true); + SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientSettingsChanged, true); + SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientConnect, false); + SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientCommand, false); + + //this, sourcehook does not keep track of. we must do this. + SH_RELEASE_CALLCLASS(m_Engine_CC); + + return true; +} + +void SamplePlugin::AllPluginsLoaded() +{ + //we don't really need this for anything other than interplugin communication + //and that's not used in this plugin. + //If we really wanted, we could override the factories so other plugins can request + // interfaces we make. In this callback, the plugin could be assured that either + // the interfaces it requires were either loaded in another plugin or not. +} + +void *MyListener::OnMetamodQuery(const char *iface, int *ret) +{ + if (strcmp(iface, "SamplePlugin")==0) + { + if (ret) + *ret = IFACE_OK; + return static_cast(&g_SamplePlugin); + } + + if (ret) + *ret = IFACE_FAILED; + + return NULL; +} diff --git a/sourcemm/sample_mm/SamplePlugin.h b/sourcemm/sample_mm/SamplePlugin.h new file mode 100644 index 0000000..74f5af1 --- /dev/null +++ b/sourcemm/sample_mm/SamplePlugin.h @@ -0,0 +1,132 @@ +/* ======== sample_mm ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_SAMPLEPLUGIN_H +#define _INCLUDE_SAMPLEPLUGIN_H + +#include +#include +#include + +#define SAMPLE_VERSION "1.10" + +class SamplePlugin : public ISmmPlugin, public IMetamodListener +{ +public: + bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late); + bool Unload(char *error, size_t maxlen); + void AllPluginsLoaded(); + bool Pause(char *error, size_t maxlen) + { + return true; + } + bool Unpause(char *error, size_t maxlen) + { + return true; + } +public: + int GetApiVersion() { return PLAPI_VERSION; } +public: + const char *GetAuthor() + { + return "BAILOPAN"; + } + const char *GetName() + { + return "Sample Plugin"; + } + const char *GetDescription() + { + return "Sample plugin that hooks basic things"; + } + const char *GetURL() + { + return "http://www.sourcemm.net/"; + } + const char *GetLicense() + { + return "zlib/libpng"; + } + const char *GetVersion() + { + return SAMPLE_VERSION; + } + const char *GetDate() + { + return __DATE__; + } + const char *GetLogTag() + { + return "SAMPLE"; + } +public: + //These functions are from IServerPluginCallbacks + //Note, the parameters might be a little different to match the actual calls! + + //Called on LevelInit. Server plugins only have pMapName + bool LevelInit(const char *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background); + + //Called on ServerActivate. Same definition as server plugins + void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); + + //Called on a game tick. Same definition as server plugins + void GameFrame(bool simulating); + + //Called on level shutdown. Same definition as server plugins + void LevelShutdown(void); + + //Client is activate (whatever that means). We get an extra parameter... + // "If bLoadGame is true, don't spawn the player because its state is already setup." + void ClientActive(edict_t *pEntity, bool bLoadGame); + + //Client disconnects - same as server plugins + void ClientDisconnect(edict_t *pEntity); + + //Client is put in server - same as server plugins + void ClientPutInServer(edict_t *pEntity, char const *playername); + + //Sets the client index - same as server plugins + void SetCommandClient(int index); + + //Called on client settings changed (duh) - same as server plugins + void ClientSettingsChanged(edict_t *pEdict); + + //Called on client connect. Unlike server plugins, we return whether the + // connection is allowed rather than set it through a pointer in the first parameter. + // You can still supercede the GameDLL through RETURN_META_VALUE(MRES_SUPERCEDE, true/false) + bool ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); + + //Called when a client uses a command. Unlike server plugins, it's void. + // You can still supercede the gamedll through RETURN_META(MRES_SUPERCEDE). + void ClientCommand(edict_t *pEntity); + + //From IMetamodListener + virtual void OnLevelShutdown(); + +private: + IGameEventManager2 *m_GameEventManager; + IVEngineServer *m_Engine; + IServerGameDLL *m_ServerDll; + IServerGameClients *m_ServerClients; + SourceHook::CallClass *m_Engine_CC; +}; + +class MyListener : public IMetamodListener +{ +public: + virtual void *OnMetamodQuery(const char *iface, int *ret); +}; + +extern SamplePlugin g_SamplePlugin; +PLUGIN_GLOBALVARS(); + +bool FireEvent_Handler(IGameEvent *event, bool bDontBroadcast); + +#endif //_INCLUDE_SAMPLEPLUGIN_H diff --git a/sourcemm/sample_mm/cvars.cpp b/sourcemm/sample_mm/cvars.cpp new file mode 100644 index 0000000..4a6c16a --- /dev/null +++ b/sourcemm/sample_mm/cvars.cpp @@ -0,0 +1,27 @@ +/* ======== sample_mm ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#include "SamplePlugin.h" +#include "cvars.h" + +SampleAccessor g_Accessor; + +ConVar g_MyConVar("sample_version", SAMPLE_VERSION, FCVAR_SPONLY, "Sample Plugin version"); + +bool SampleAccessor::RegisterConCommandBase(ConCommandBase *pVar) +{ + //this will work on any type of concmd! + return META_REGCVAR(pVar); +} + +CON_COMMAND(sample_cmd, "Sample Plugin command") +{ + META_LOG(g_PLAPI, "This sentence is in Spanish when you're not looking."); +} diff --git a/sourcemm/sample_mm/cvars.h b/sourcemm/sample_mm/cvars.h new file mode 100644 index 0000000..9bc6286 --- /dev/null +++ b/sourcemm/sample_mm/cvars.h @@ -0,0 +1,24 @@ +/* ======== sample_mm ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_CVARS_H +#define _INCLUDE_CVARS_H + +#include + +class SampleAccessor : public IConCommandBaseAccessor +{ +public: + virtual bool RegisterConCommandBase(ConCommandBase *pVar); +}; + +extern SampleAccessor g_Accessor; + +#endif //_INCLUDE_CVARS_H diff --git a/sourcemm/sample_mm/msvc7/sample_mm.sln b/sourcemm/sample_mm/msvc7/sample_mm.sln new file mode 100644 index 0000000..b885d6b --- /dev/null +++ b/sourcemm/sample_mm/msvc7/sample_mm.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_mm", "sample_mm.vcproj", "{FAFF34FB-FE14-47B5-81BD-70D237392FB2}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug.ActiveCfg = Debug|Win32 + {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug.Build.0 = Debug|Win32 + {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release.ActiveCfg = Release|Win32 + {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/sourcemm/sample_mm/msvc7/sample_mm.vcproj b/sourcemm/sample_mm/msvc7/sample_mm.vcproj new file mode 100644 index 0000000..57c68a7 --- /dev/null +++ b/sourcemm/sample_mm/msvc7/sample_mm.vcproj @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcemm/sample_mm/msvc8/sample_mm.sln b/sourcemm/sample_mm/msvc8/sample_mm.sln new file mode 100644 index 0000000..df4b2fb --- /dev/null +++ b/sourcemm/sample_mm/msvc8/sample_mm.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_mm", "sample_mm.vcproj", "{FAFF34FB-FE14-47B5-81BD-70D237392FB2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug|Win32.ActiveCfg = Debug|Win32 + {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug|Win32.Build.0 = Debug|Win32 + {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release|Win32.ActiveCfg = Release|Win32 + {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/sourcemm/sample_mm/msvc8/sample_mm.vcproj b/sourcemm/sample_mm/msvc8/sample_mm.vcproj new file mode 100644 index 0000000..9886076 --- /dev/null +++ b/sourcemm/sample_mm/msvc8/sample_mm.vcproj @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcemm/sourcemm.cpp b/sourcemm/sourcemm.cpp new file mode 100644 index 0000000..664e527 --- /dev/null +++ b/sourcemm/sourcemm.cpp @@ -0,0 +1,717 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * Contributor(s): Scott "Damaged Soul" Ehlert + * : Pavol "PM OnoTo" Marko + * ============================ + */ + +#include +#include +#include +#include "sourcemm.h" +#include "concommands.h" +#include "CSmmAPI.h" +#include "CPlugin.h" +#include "util.h" +#include "vsp_listener.h" + +using namespace SourceMM; + +/** + * @brief Implementation of main SourceMM GameDLL functionality + * @file sourcemm.cpp + */ + +#undef CommandLine +DLL_IMPORT ICommandLine *CommandLine(); + +SH_DECL_HOOK4(IServerGameDLL, DLLInit, SH_NOATTRIB, false, bool, CreateInterfaceFn, CreateInterfaceFn, CreateInterfaceFn, CGlobalVars *); +SH_DECL_HOOK0_void(IServerGameDLL, DLLShutdown, SH_NOATTRIB, false); +SH_DECL_HOOK0_void(IServerGameDLL, LevelShutdown, SH_NOATTRIB, false); +SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, false, bool, const char *, const char *, const char *, const char *, bool, bool); +SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); +SH_DECL_HOOK0(IServerGameDLL, GameInit, SH_NOATTRIB, false, bool); + +bool DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); +bool DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); +void DLLShutdown_handler(); +void LevelShutdown_handler(); +bool LevelInit_handler(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background); +bool GameInit_handler(); + +GameDllInfo g_GameDll = {false, NULL, NULL, NULL, NULL}; +EngineInfo g_Engine; +SourceHook::CSourceHookImpl g_SourceHook; +SourceHook::ISourceHook *g_SHPtr = &g_SourceHook; +SourceHook::String g_ModPath; +SourceHook::String g_BinPath; +SourceHook::String g_SmmPath; +PluginId g_PLID = Pl_Console; /* Technically, SourceMM is the "Console" plugin... :p */ +bool bInFirstLevel = true; +bool gParsedGameInfo = false; +bool bGameInit = false; +SourceHook::List gamedll_list; +SourceHook::CallClass *g_GameDllPatch; +int g_GameDllVersion = 0; +const char VSPIFACE_001[] = "ISERVERPLUGINCALLBACKS001"; +const char VSPIFACE_002[] = "ISERVERPLUGINCALLBACKS002"; +const char GAMEINFO_PATH[] = "|gameinfo_path|"; + +void ClearGamedllList(); + +/* Helper Macro */ +#define IFACE_MACRO(orig,nam) \ + CPluginManager::CPlugin *pl; \ + SourceHook::List::iterator event; \ + IMetamodListener *api; \ + int mret = 0; \ + void *val = NULL; \ + for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ + pl = (*iter); \ + for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ + api = (*event); \ + mret = IFACE_FAILED; \ + if ( (val=api->On##nam##Query(iface, &mret)) != NULL ) { \ + if (ret) *ret = mret; \ + return val; \ + } \ + } \ + } \ + return (orig)(iface, ret); + +#define ITER_EVENT(evn, args) \ + CPluginManager::CPlugin *pl; \ + SourceHook::List::iterator event; \ + IMetamodListener *api; \ + for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ + pl = (*iter); \ + for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ + api = (*event); \ + api->evn args; \ + } \ + } + +/////////////////////////////////// +// Main code for HL2 Interaction // +/////////////////////////////////// + +/* Initialize everything here */ +void InitMainStates() +{ + char full_path[PATH_SIZE] = {0}; + GetFileOfAddress((void *)g_GameDll.factory, full_path, sizeof(full_path)); + g_BinPath.assign(full_path); + + /* Like Metamod, reload plugins at the end of the map. + * This is so plugins can hook everything on load, BUT, new plugins will be reloaded + * if the server is shut down (silly, but rare case). + */ + bInFirstLevel = true; + + SH_ADD_HOOK_STATICFUNC(IServerGameDLL, DLLInit, g_GameDll.pGameDLL, DLLInit, false); + SH_ADD_HOOK_STATICFUNC(IServerGameDLL, DLLInit, g_GameDll.pGameDLL, DLLInit_Post, true); + SH_ADD_HOOK_STATICFUNC(IServerGameDLL, DLLShutdown, g_GameDll.pGameDLL, DLLShutdown_handler, false); + SH_ADD_HOOK_STATICFUNC(IServerGameDLL, LevelShutdown, g_GameDll.pGameDLL, LevelShutdown_handler, true); + SH_ADD_HOOK_STATICFUNC(IServerGameDLL, LevelInit, g_GameDll.pGameDLL, LevelInit_handler, true); + SH_ADD_HOOK_STATICFUNC(IServerGameDLL, GameInit, g_GameDll.pGameDLL, GameInit_handler, false); +} + +bool DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) +{ + g_Engine.engineFactory = engineFactory; + g_Engine.fileSystemFactory = filesystemFactory; + g_Engine.physicsFactory = physicsFactory; + g_Engine.pGlobals = pGlobals; + + g_Engine.engine = (IVEngineServer *)((engineFactory)(INTERFACEVERSION_VENGINESERVER, NULL)); + if (!g_Engine.engine) + { + Error("Could not find IVEngineServer! Metamod cannot load."); + return false; + } + g_Engine.icvar = (ICvar *)((engineFactory)(VENGINE_CVAR_INTERFACE_VERSION , NULL)); + if (!g_Engine.icvar) + { + Error("Could not find ICvar! Metamod cannot load."); + return false; + } + + g_Engine.loaded = true; + + /* Initialize our console hooks */ + ConCommandBaseMgr::OneTimeInit(static_cast(&g_SMConVarAccessor)); + + g_GameDllPatch = SH_GET_CALLCLASS(g_GameDll.pGameDLL); + + if (g_GameDll.pGameClients) + { + SH_ADD_HOOK_STATICFUNC(IServerGameClients, ClientCommand, g_GameDll.pGameClients, ClientCommand_handler, false); + } else { + /* If IServerGameClients isn't found, this really isn't a fatal error so... */ + LogMessage("[META] Warning: Could not find IServerGameClients!"); + LogMessage("[META] Warning: The 'meta' command will not be available to clients."); + } + + if (!g_SmmAPI.CacheCmds()) + { + LogMessage("[META] Warning: Failed to initialize Con_Printf. Defaulting to Msg()."); + LogMessage("[META] Warning: Console messages will not be redirected to rcon console."); + } + + if (!g_SmmAPI.CacheUserMessages()) + { + /* Don't know of a mod that has stripped out user messages completely, + * but perhaps should do something different here? + */ + LogMessage("[META] Warning: Failed to get list of user messages."); + LogMessage("[META] Warning: The 'meta game' command will not display user messages."); + } + + const char *pluginFile = g_Engine.icvar->GetCommandLineValue("mm_pluginsfile"); + if (!pluginFile) + { + pluginFile = GetPluginsFile(); + } + + char full_path[260]; + g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), pluginFile); + + LoadPluginsFromFile(full_path); + + bInFirstLevel = true; + + RETURN_META_VALUE(MRES_IGNORED, true); +} + +bool GameInit_handler() +{ + if (bGameInit) + { + return true; + } + + if (g_SmmAPI.VSPEnabled()) + { + g_SmmAPI.LoadAsVSP(); + } + + bGameInit = true; + + RETURN_META_VALUE(MRES_IGNORED, true); +} + +bool DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) +{ + g_PluginMngr.SetAllLoaded(); + RETURN_META_VALUE(MRES_IGNORED, true); +} + +/* This is where the magic happens */ +SMM_API void *CreateInterface(const char *iface, int *ret) +{ + /* Prevent loading of self as a SourceMM plugin or Valve server plugin :x */ + if (strcmp(iface, PLAPI_NAME) == 0) + { + Warning("Do not try loading Metamod:Source as a SourceMM or Valve server plugin.\n"); + + if (ret) + { + *ret = IFACE_FAILED; + } + + return NULL; + } + + /* We check these separately because we can't reply + * unless our interface version really matches. + */ + if ((strcmp(iface, VSPIFACE_002) == 0) + || strcmp(iface, VSPIFACE_001) == 0) + { + if (ret) + { + *ret = IFACE_OK; + } + return &g_VspListener; + } + + if (!gParsedGameInfo) + { + gParsedGameInfo = true; + const char *gameDir = NULL; + char gamePath[PATH_SIZE]; + char smmPath[PATH_SIZE]; + + /* Get path to SourceMM DLL */ + if (!GetFileOfAddress((void *)CreateInterface, smmPath, sizeof(smmPath))) + { + Error("GetFileOfAddress() failed! Metamod cannot load.\n"); + return NULL; + } + + g_SmmPath.assign(smmPath); + + /* Get value of -game from command line, defaulting to hl2 as engine seems to do */ + gameDir = CommandLine()->ParmValue("-game", "hl2"); + + /* Get absolute path */ + abspath(gamePath, gameDir); + g_ModPath.assign(gamePath); + + char tempPath[PATH_SIZE]; + + /* Path to gameinfo.txt */ + g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s", g_ModPath.c_str(), "gameinfo.txt"); + + FILE *fp = fopen(tempPath, "rt"); + + if (!fp) + { + Error("Unable to open gameinfo.txt! Metamod cannot load.\n"); + return NULL; + } + + char buffer[255]; + char key[128], val[128]; + size_t len = 0; + bool search = false; + bool gamebin = false; + char *ptr; + const char *lptr; + char curPath[PATH_SIZE]; + + getcwd(curPath, PATH_SIZE); + + while (!feof(fp)) + { + buffer[0] = '\0'; + fgets(buffer, sizeof(buffer), fp); + len = strlen(buffer); + if (buffer[len-1] == '\n') + buffer[--len] = '\0'; + UTIL_TrimComments(buffer); + UTIL_TrimLeft(buffer); + UTIL_TrimRight(buffer); + if (stricmp(buffer, "SearchPaths") == 0) + search = true; + if (!search) + continue; + UTIL_KeySplit(buffer, key, sizeof(key) - 1, val, sizeof(val) - 1); + if (stricmp(key, "Game") == 0 || stricmp(key, "GameBin") == 0) + { + if (stricmp(key, "Game") == 0) + gamebin = false; + else + gamebin = true; + + if (strncmp(val, GAMEINFO_PATH, sizeof(GAMEINFO_PATH) - 1) == 0) + { + ptr = &(val[sizeof(GAMEINFO_PATH) - 1]); + if (ptr[0] == '.') + ptr++; + lptr = g_ModPath.c_str(); + } else { + ptr = val; + lptr = curPath; + } + + size_t ptr_len = strlen(ptr); + if (ptr[ptr_len] == '/' || ptr[ptr_len] == '\\') + ptr[--ptr_len] = '\0'; + + /* No need to append "bin" if key is GameBin */ + if (gamebin) + { + g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s/%s", lptr, ptr, SERVER_DLL); + } else if (!ptr[0]) { + g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s/%s", lptr, "bin", SERVER_DLL); + } else { + g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s/%s/%s", lptr, ptr, "bin", SERVER_DLL); + } + + /* If not path to SourceMM... */ + if (!UTIL_PathCmp(smmPath, tempPath)) + { + FILE *fp = fopen(tempPath, "rb"); + if (!fp) + continue; + //:TODO: Optimize this a bit! + SourceHook::List::iterator iter; + GameDllInfo *pCheck; + bool found = false; + for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) + { + pCheck = (*iter); + if (GetFileOfAddress((void *)pCheck->factory, buffer, sizeof(buffer))) + { + if (UTIL_PathCmp(tempPath, buffer)) + { + found = true; + break; + } + } + } + if (found) + continue; + fclose(fp); + HINSTANCE gamedll = dlmount(tempPath); + if (gamedll == NULL) + continue; + CreateInterfaceFn fn = (CreateInterfaceFn)dlsym(gamedll, "CreateInterface"); + if (fn == NULL) + { + dlclose(gamedll); + continue; + } + GameDllInfo *pInfo = new GameDllInfo; + pInfo->factory = fn; + pInfo->lib = gamedll; + pInfo->loaded = true; + pInfo->pGameDLL = NULL; + gamedll_list.push_back(pInfo); + break; + } + } + } + fclose(fp); + } + + if (!g_GameDll.loaded) + { + const char *str = "ServerGameDLL"; + size_t len = strlen(str); + + if (strncmp(iface, str, len) == 0) + { + /* This is the interface we want! Right now we support versions 3 through 8 */ + g_GameDllVersion = atoi(&(iface[len])); + int sizeTooBig = 0; //rename this to sizeWrong in the future! + if (g_GameDllVersion < MIN_GAMEDLL_VERSION || g_GameDllVersion > MAX_GAMEDLL_VERSION) + { + /* Maybe this will get used in the future */ + sizeTooBig = g_GameDllVersion; + if (ret) + { + *ret = IFACE_FAILED; + } + } + SourceHook::List::iterator iter; + GameDllInfo *pInfo = NULL; + void *ptr; + for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) + { + pInfo = (*iter); + ptr = (pInfo->factory)(iface, ret); + if (ptr) + { + /* This is our GameDLL. Unload the others. */ + gamedll_list.erase(iter); + ClearGamedllList(); + pInfo->pGameDLL = static_cast(ptr); + g_GameDll = *pInfo; + delete pInfo; + break; + } + } + if (g_GameDll.loaded) + { + if (sizeTooBig) + { + Error("This mod version requires a SourceMM update (ServerGameDLL%03d)!\n", sizeTooBig); + if (ret) + { + *ret = IFACE_FAILED; + } + return NULL; + } else { + InitMainStates(); + } + } else { + sizeTooBig = 0; + if (ret) + *ret = IFACE_FAILED; + return NULL; + } + } else { + /* wtf do we do... */ + /* :TODO: .. something a bit more intelligent? */ + Error("Engine requested unknown interface before GameDLL was known!\n"); + return NULL; + } + } + + /* We use this interface for responding to the meta client command */ + if (strncmp(iface, "ServerGameClients", 17) == 0) + { + void *ptr = (g_GameDll.factory)(iface, ret); + g_GameDll.pGameClients = static_cast(ptr); + + return ptr; + } + + /* If we got here, there's definitely a GameDLL */ + IFACE_MACRO(g_GameDll.factory, GameDLL); +} + +void ClearGamedllList() +{ + SourceHook::List::iterator iter; + + GameDllInfo *pInfo; + for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) + { + pInfo = (*iter); + dlclose(pInfo->lib); + delete pInfo; + } + + gamedll_list.clear(); +} + +void DLLShutdown_handler() +{ + /* Unload plugins */ + g_PluginMngr.UnloadAll(); + + /* Add the FCVAR_GAMEDLL flag to our cvars so the engine removes them properly */ + g_SMConVarAccessor.MarkCommandsAsGameDLL(); + g_SMConVarAccessor.UnregisterGameDLLCommands(); + + SH_CALL(g_GameDllPatch, &IServerGameDLL::DLLShutdown)(); + + SH_RELEASE_CALLCLASS(g_GameDllPatch); + g_GameDllPatch = NULL; + + g_SourceHook.CompleteShutdown(); + + if (g_GameDll.lib && g_GameDll.loaded) + dlclose(g_GameDll.lib); + memset(&g_GameDll, 0, sizeof(GameDllInfo)); + + RETURN_META(MRES_SUPERCEDE); +} + +int LoadPluginsFromFile(const char *_file) +{ + FILE *fp; + int total = 0, skipped=0; + PluginId id; + bool already; + + fp = fopen(_file, "rt"); + if (!fp) + { + LogMessage("[META] Could not open plugins file %s\n", _file); + return -1; + } + + char buffer[255], error[255], full_path[255]; + const char *ptr, *ext, *file; + size_t length; + while (!feof(fp)) + { + buffer[0] = '\0'; + fgets(buffer, sizeof(buffer), fp); + length = strlen(buffer); + if (!length) + continue; + if (buffer[length-1] == '\n') + buffer[--length] = '\0'; + + UTIL_TrimLeft(buffer); + UTIL_TrimRight(buffer); + + if (buffer[0] == '\0' || buffer[0] == ';' || strncmp(buffer, "//", 2) == 0) + continue; + file = buffer; + if (buffer[0] == '"') + { + char *cptr = buffer; + file = ++cptr; + + while (*cptr) + { + if (*cptr == '"') + { + *cptr = '\0'; + break; + } + cptr++; + } + } else { + char *cptr = buffer; + while (*cptr) + { + if (isspace(*cptr)) + { + char *optr = cptr; + while (*cptr && isspace(*cptr)) + cptr++; + *optr = '\0'; + UTIL_TrimRight(cptr); + if (*cptr && isalpha(*cptr)) + { + g_PluginMngr.SetAlias(buffer, cptr); + file = cptr; + } + break; + } + cptr++; + } + } + if (!file[0]) + { + continue; + } + /* First find if it's an absolute path or not... */ + if (file[0] == '/' || strncmp(&(file[1]), ":\\", 2) == 0) + { + /* If we're in an absolute path, ignore our normal heuristics */ + id = g_PluginMngr.Load(file, Pl_File, already, error, sizeof(error)); + if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) + { + LogMessage("[META] Failed to load plugin %s. %s", buffer, error); + } else { + if (already) + skipped++; + else + total++; + } + } else { + /* Attempt to find a file extension */ + ptr = UTIL_GetExtension(file); + /* Add an extension if there's none there */ + if (!ptr) + { +#if defined WIN32 || defined _WIN32 + ext = ".dll"; +#else + ext = "_i486.so"; +#endif + } else { + ext = ""; + } + /* Format the new path */ + g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); + id = g_PluginMngr.Load(full_path, Pl_File, already, error, sizeof(error)); + if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) + { + LogMessage("[META] Failed to load plugin %s. %s", buffer, error); + } else { + if (already) + skipped++; + else + total++; + } + } + } + fclose(fp); + + if (skipped) + { + LogMessage("[META] Loaded %d plugins from file (%d already loaded)", total, skipped); + } else { + LogMessage("[META] Loaded %d plugins from file.", total); + } + + return total; +} + +/* Wrapper function. This is called when the GameDLL thinks it's using + * the engine's real engineFactory. + */ +void *EngineFactory(const char *iface, int *ret) +{ + IFACE_MACRO(g_Engine.engineFactory, Engine); +} + +/* Wrapper function. This is called when the GameDLL thinks it's using + * the engine's real physicsFactory. + */ +void *PhysicsFactory(const char *iface, int *ret) +{ + IFACE_MACRO(g_Engine.physicsFactory, Physics); +} + +/* Wrapper function. This is called when the GameDLL thinks it's using + * the engine's real fileSystemFactory. + */ +void *FileSystemFactory(const char *iface, int *ret) +{ + IFACE_MACRO(g_Engine.fileSystemFactory, FileSystem); +} + +void LogMessage(const char *msg, ...) +{ + va_list ap; + static char buffer[2048]; + + va_start(ap, msg); + size_t len = vsnprintf(buffer, sizeof(buffer) - 2, msg, ap); + va_end(ap); + + buffer[len++] = '\n'; + buffer[len] = '\0'; + + if (!g_Engine.engine) + { + fprintf(stdout, "%s", buffer); + } else { + g_Engine.engine->LogPrint(buffer); + } +} + +void LevelShutdown_handler(void) +{ + if (!bInFirstLevel) + { + char full_path[255]; + g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), GetPluginsFile()); + + LoadPluginsFromFile(full_path); + } else { + bInFirstLevel = false; + } + + ITER_EVENT(OnLevelShutdown, ()); + + RETURN_META(MRES_IGNORED); +} + +bool LevelInit_handler(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background) +{ + if (!g_SmmAPI.CmdCacheSuccessful()) + { + LogMessage("[META] Warning: Failed to initialize Con_Printf. Defaulting to Msg()."); + LogMessage("[META] Warning: Console messages will not be redirected to rcon console."); + } + + ITER_EVENT(OnLevelInit, (pMapName, pMapEntities, pOldLevel, pLandmarkName, loadGame, background)); + + RETURN_META_VALUE(MRES_IGNORED, false); +} + +#if defined __GNUC__ && (__GNUC__ == 3 || __GNUC__ == 4) +void * operator new(size_t size) { + return(calloc(1, size)); +} + +void * operator new[](size_t size) { + return(calloc(1, size)); +} + +void operator delete(void * ptr) { + if(ptr) + free(ptr); +} + +void operator delete[](void * ptr) { + if(ptr) + free(ptr); +} +#endif diff --git a/sourcemm/sourcemm.h b/sourcemm/sourcemm.h new file mode 100644 index 0000000..b61f9eb --- /dev/null +++ b/sourcemm/sourcemm.h @@ -0,0 +1,122 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_SOURCEMM_H +#define _INCLUDE_SOURCEMM_H + +/** + * @brief SourceMM main functionality for GameDLL interception + * @file sourcemm.h + */ + +#include +#include +#include +#include +#include +#include "ISmmAPI.h" +#include "CPlugin.h" +#include "oslink.h" +#include "util.h" +#include "svn_version.h" + +/** + * Versioning + * increase api_major when API breaks + * increase api_minor when new functions are added (non-breaking) + */ +#define SOURCEMM_VERSION SVN_FILE_VERSION_STRING +#define SOURCEMM_DATE __DATE__ +#define SM_VERS_API_MAJOR 1 //increase this on a breaking change +#define SM_VERS_API_MINOR 5 //increase this on a non-breaking API change + +//We need a good CServerGameDLL version to work properly. We support these inclusively. +#define MIN_GAMEDLL_VERSION 3 +#define MAX_GAMEDLL_VERSION 8 + +/** + * @brief Entry point for HL2 Engine + */ +SMM_API void *CreateInterface(const char *name, int *code); + +/** @brief Wrapper to catch GameDLL calls */ +void *EngineFactory(const char *name, int *code); + +/** @brief Wrapper to catch GameDLL calls */ +void *PhysicsFactory(const char *name, int *code); + +/** @brief Wrapper to catch GameDLL calls */ +void *FileSystemFactory(const char *name, int *code); + +/** @brief Loads all plugins found in a file */ +int LoadPluginsFromFile(const char *file); + +/** @brief Logs a message to the standard log file */ +void LogMessage(const char *msg, ...); + +/** @brief Stores information about the GameDLL */ +struct GameDllInfo +{ + bool loaded; + HINSTANCE lib; + CreateInterfaceFn factory; + IServerGameDLL *pGameDLL; + IServerGameClients *pGameClients; +}; + +/** @brief Stores information about the HL2 Engine pointers */ +struct EngineInfo +{ + EngineInfo() : loaded(false), + engineFactory(NULL), physicsFactory(NULL), fileSystemFactory(NULL), + pGlobals(NULL), icvar(NULL), engine(NULL) + { }; + bool loaded; + CreateInterfaceFn engineFactory; + CreateInterfaceFn physicsFactory; + CreateInterfaceFn fileSystemFactory; + CGlobalVars *pGlobals; + ICvar *icvar; + IVEngineServer *engine; +}; + +/** @brief Global variable for GameDLL info */ +extern GameDllInfo g_GameDll; + +/** @brief Global variable for Engine info */ +extern EngineInfo g_Engine; + +/** @brief Global singleton for SourceHook */ +extern SourceHook::CSourceHookImpl g_SourceHook; + +/** @brief Mod path (important!)*/ +extern SourceHook::String g_ModPath; + +/** @brief Path to server binary */ +extern SourceHook::String g_BinPath; + +/** @brief Path to SourceMM binary */ +extern SourceHook::String g_SmmPath; + +/** @brief Global variable for SourceHook macros */ +extern SourceHook::ISourceHook *g_SHPtr; + +/** @brief We have our own internal plugin id... */ +extern PluginId g_PLID; + +/** @brief ServerGameDLL version that is currently loaded */ +extern int g_GameDllVersion; + +extern bool bGameInit; + +/** @brief Global CallClass for IServerGameDLL */ +extern SourceHook::CallClass *g_GameDllPatch; + +#endif //_INCLUDE_SOURCEMM_H diff --git a/sourcemm/stub_mm/LICENSE.txt b/sourcemm/stub_mm/LICENSE.txt new file mode 100644 index 0000000..bf9f1fd --- /dev/null +++ b/sourcemm/stub_mm/LICENSE.txt @@ -0,0 +1,29 @@ +The software is Copyright (C) 2004-2007, Metamod:Source Development Team. + +Metamod:Source is distributed under the "zLib/libpng" license, which is reproduced +below: + +----------------------------------------------------------------------------- + +This software is provided "as-is", without any express or implied warranty. +In no event will the authors be held liable for any damages arising from +the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in + a product, an acknowledgment in the product documentation would be + appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +----------------------------------------------------------------------------- + +The zLib/libpng license has been approved by the "Open Source Initiative" +organization. diff --git a/sourcemm/stub_mm/Makefile b/sourcemm/stub_mm/Makefile new file mode 100644 index 0000000..eec1eb9 --- /dev/null +++ b/sourcemm/stub_mm/Makefile @@ -0,0 +1,66 @@ +#(C)2004-2007 SourceMM Development Team +# Makefile written by David "BAILOPAN" Anderson + +HL2SDK = ../../../hl2sdk +SMM_ROOT = ../.. +SRCDS = ~/srcds + +### EDIT BELOW FOR OTHER PROJECTS ### + +OPT_FLAGS = -O3 -funroll-loops -s -pipe +GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden +DEBUG_FLAGS = -g -ggdb3 +CPP = gcc-4.1 +BINARY = stub_mm_i486.so + +HL2PUB = $(HL2SDK)/public + +OBJECTS = stub_mm.cpp + +LINK = vstdlib_i486.so tier0_i486.so -static-libgcc + +INCLUDE = -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ + -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook -I$(SMM_ROOT)/sourcemm + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug + CFLAGS = $(DEBUG_FLAGS) +else + BIN_DIR = Release + CFLAGS = $(OPT_FLAGS) +endif + +GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) + +CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse + +ifeq "$(GCC_VERSION)" "4" + CFLAGS += $(GCC4_FLAGS) +endif + +OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +$(BIN_DIR)/%.o: %.cpp + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +all: + mkdir -p $(BIN_DIR) + ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so + ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so + $(MAKE) sourcemm + rm -rf $(BINARY) + ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) + +sourcemm: $(OBJ_LINUX) + $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) + +debug: + $(MAKE) all DEBUG=true + +default: all + +clean: + rm -rf Release/*.o + rm -rf Release/$(BINARY) + rm -rf Debug/*.o + rm -rf Debug/$(BINARY) diff --git a/sourcemm/stub_mm/msvc7/stub_mm.sln b/sourcemm/stub_mm/msvc7/stub_mm.sln new file mode 100644 index 0000000..0567903 --- /dev/null +++ b/sourcemm/stub_mm/msvc7/stub_mm.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stub_mm", "stub_mm.vcproj", "{836E726E-AB80-43AB-9A8F-0E6EE680B0F6}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug.ActiveCfg = Debug|Win32 + {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug.Build.0 = Debug|Win32 + {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release.ActiveCfg = Release|Win32 + {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/sourcemm/stub_mm/msvc7/stub_mm.vcproj b/sourcemm/stub_mm/msvc7/stub_mm.vcproj new file mode 100644 index 0000000..aaed89b --- /dev/null +++ b/sourcemm/stub_mm/msvc7/stub_mm.vcproj @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcemm/stub_mm/msvc8/stub_mm.sln b/sourcemm/stub_mm/msvc8/stub_mm.sln new file mode 100644 index 0000000..4e0655b --- /dev/null +++ b/sourcemm/stub_mm/msvc8/stub_mm.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stub_mm", "stub_mm.vcproj", "{836E726E-AB80-43AB-9A8F-0E6EE680B0F6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug|Win32.ActiveCfg = Debug|Win32 + {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug|Win32.Build.0 = Debug|Win32 + {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release|Win32.ActiveCfg = Release|Win32 + {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/sourcemm/stub_mm/msvc8/stub_mm.vcproj b/sourcemm/stub_mm/msvc8/stub_mm.vcproj new file mode 100644 index 0000000..6490884 --- /dev/null +++ b/sourcemm/stub_mm/msvc8/stub_mm.vcproj @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcemm/stub_mm/stub_mm.cpp b/sourcemm/stub_mm/stub_mm.cpp new file mode 100644 index 0000000..f43ed53 --- /dev/null +++ b/sourcemm/stub_mm/stub_mm.cpp @@ -0,0 +1,105 @@ +/* ======== stub_mm ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#include +#include "stub_mm.h" + +SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int); + +StubPlugin g_StubPlugin; + +PLUGIN_EXPOSE(SamplePlugin, g_StubPlugin); + +void ServerActivate_handler(edict_t *pEdictList, int edictCount, int clientMax) +{ + META_LOG(g_PLAPI, "ServerActivate() called: edictCount=%d, clientMax=%d", edictCount, clientMax); + RETURN_META(MRES_IGNORED); +} + +bool StubPlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) +{ + PLUGIN_SAVEVARS(); + + GET_V_IFACE_ANY(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); + + SH_ADD_HOOK_STATICFUNC(IServerGameDLL, ServerActivate, m_ServerDll, ServerActivate_handler, true); + + return true; +} + +bool StubPlugin::Unload(char *error, size_t maxlen) +{ + SH_REMOVE_HOOK_STATICFUNC(IServerGameDLL, ServerActivate, m_ServerDll, ServerActivate_handler, true); + + return true; +} + +bool StubPlugin::Pause(char *error, size_t maxlen) +{ + return true; +} + +bool StubPlugin::Unpause(char *error, size_t maxlen) +{ + return true; +} + +void StubPlugin::AllPluginsLoaded() +{ + //This is an example of inter-plugin communication + PluginId id; + void *ptr = g_SMAPI->MetaFactory("SamplePlugin", NULL, &id); + if (ptr) + { + META_LOG(g_PLAPI, "Found Sample Plugin[%d] at (%p)!", id, ptr); + } else { + META_LOG(g_PLAPI, "Did not find Sample Plugin!"); + } +} + +const char *StubPlugin::GetAuthor() +{ + return "AUTHOR"; +} + +const char *StubPlugin::GetName() +{ + return "Stub Plugin"; +} + +const char *StubPlugin::GetDescription() +{ + return "Stub Plugin"; +} + +const char *StubPlugin::GetURL() +{ + return "http://www.mysite.com/"; +} + +const char *StubPlugin::GetLicense() +{ + return "zlib/libpng"; +} + +const char *StubPlugin::GetVersion() +{ + return "1.00"; +} + +const char *StubPlugin::GetDate() +{ + return __DATE__; +} + +const char *StubPlugin::GetLogTag() +{ + return "STUB"; +} diff --git a/sourcemm/stub_mm/stub_mm.h b/sourcemm/stub_mm/stub_mm.h new file mode 100644 index 0000000..fec6701 --- /dev/null +++ b/sourcemm/stub_mm/stub_mm.h @@ -0,0 +1,45 @@ +/* ======== stub_mm ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_SAMPLEPLUGIN_H +#define _INCLUDE_SAMPLEPLUGIN_H + +#include + +class StubPlugin : public ISmmPlugin +{ +public: + bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late); + bool Unload(char *error, size_t maxlen); + bool Pause(char *error, size_t maxlen); + bool Unpause(char *error, size_t maxlen); + void AllPluginsLoaded(); +public: + const char *GetAuthor(); + const char *GetName(); + const char *GetDescription(); + const char *GetURL(); + const char *GetLicense(); + const char *GetVersion(); + const char *GetDate(); + const char *GetLogTag(); +private: + IServerGameDLL *m_ServerDll; + IServerGameDLL *m_ServerDll_CC; +}; + +extern StubPlugin g_StubPlugin; + +PLUGIN_GLOBALVARS(); + +//Called on ServerActivate. Same definition as server plugins +void ServerActivate_handler(edict_t *pEdictList, int edictCount, int clientMax); + +#endif //_INCLUDE_SAMPLEPLUGIN_H diff --git a/sourcemm/svn_version.h b/sourcemm/svn_version.h new file mode 100644 index 0000000..faeca49 --- /dev/null +++ b/sourcemm/svn_version.h @@ -0,0 +1,13 @@ +/** This file is autogenerated by build scripts */ + +#ifndef _INCLUDE_SVN_VERSION_H_ +#define _INCLUDE_SVN_VERSION_H_ + +#define SVN_PRODUCT_VERSION "1.4.2" + +#define SVN_REVISION 414 +#define SVN_REVISION_STRING "414" +#define SVN_FILE_VERSION 1,4,2,414 +#define SVN_FILE_VERSION_STRING "1.4.2.414" + +#endif //_INCLUDE_SVN_VERSION_H_ diff --git a/sourcemm/svn_version.tpl b/sourcemm/svn_version.tpl new file mode 100644 index 0000000..9b93d57 --- /dev/null +++ b/sourcemm/svn_version.tpl @@ -0,0 +1,13 @@ +/** This file is autogenerated by build scripts */ + +#ifndef _INCLUDE_SVN_VERSION_H_ +#define _INCLUDE_SVN_VERSION_H_ + +#define SVN_PRODUCT_VERSION "$PMAJOR$.$PMINOR$.$PREVISION$" + +#define SVN_REVISION $GLOBAL_BUILD$ +#define SVN_REVISION_STRING "$GLOBAL_BUILD$" +#define SVN_FILE_VERSION $PMAJOR$,$PMINOR$,$PREVISION$,$GLOBAL_BUILD$ +#define SVN_FILE_VERSION_STRING "$PMAJOR$.$PMINOR$.$PREVISION$.$GLOBAL_BUILD$" + +#endif //_INCLUDE_SVN_VERSION_H_ diff --git a/sourcemm/util.cpp b/sourcemm/util.cpp new file mode 100644 index 0000000..fadcf26 --- /dev/null +++ b/sourcemm/util.cpp @@ -0,0 +1,408 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#include +#include +#include +#include "util.h" +#include "oslink.h" + +/** + * @brief Utility functions + * @file util.cpp + */ + +const char *UTIL_GetExtension(const char *file) +{ + int len = strlen(file); + int i = 0; + + for (i = len - 1; i >= 0; i--) + { + if (file[i] == '/' || file[i] == '\\') + { + return NULL; + } + + if ((file[i] == '.') && (i != len - 1)) + { + return (const char *)&(file[i + 1]); + } + } + + return NULL; +} + +void UTIL_TrimLeft(char *buffer) +{ + /* Let's think of this as our iterator */ + char *i = buffer; + + /* Make sure the buffer isn't null */ + if (i && *i) + { + /* Add up number of whitespace characters */ + while(isspace((unsigned char) *i)) + { + i++; + } + + /* If whitespace chars in buffer then adjust string so first non-whitespace char is at start of buffer */ + if (i != buffer) + { + memmove(buffer, i, (strlen(i) + 1) * sizeof(char)); + } + } +} + +void UTIL_TrimRight(char *buffer) +{ + /* Make sure buffer isn't null */ + if (buffer) + { + size_t len = strlen(buffer); + + /* Loop through buffer backwards while replacing whitespace chars with null chars */ + for (size_t i = len - 1; i >= 0; i--) + { + if (isspace((unsigned char) buffer[i])) + { + buffer[i] = '\0'; + } else { + break; + } + } + } +} + +/* :TODO: this should skip string literals */ +void UTIL_TrimComments(char *buffer) +{ + int num_sc = 0; + size_t len = strlen(buffer); + if (buffer) + { + for (int i = len - 1; i >= 0; i--) + { + if (buffer[i] == '/') + { + if (++num_sc >= 2 && i==0) + { + buffer[i] = '\0'; + return; + } + } else { + if (num_sc >= 2) + { + buffer[i] = '\0'; + return; + } + num_sc = 0; + } + /* size_t won't go below 0, manually break out */ + if (i == 0) + { + break; + } + } + } +} + +void UTIL_KeySplit(const char *str, char *buf1, size_t len1, char *buf2, size_t len2) +{ + size_t start; + size_t len = strlen(str); + + for (start = 0; start < len; start++) + { + if (!isspace(str[start])) + { + break; + } + } + + size_t end; + for (end = start; end < len; end++) + { + if (isspace(str[end])) + { + break; + } + } + + size_t i, c = 0; + for (i = start; i < end; i++, c++) + { + if (c >= len1) + { + break; + } + buf1[c] = str[i]; + } + buf1[c] = '\0'; + + for (start = end; start < len; start++) + { + if (!isspace(str[start])) + { + break; + } + } + + for (c = 0; start < len; start++, c++) + { + if (c >= len2) + { + break; + } + buf2[c] = str[start]; + } + buf2[c] = '\0'; +} + +bool UTIL_PathCmp(const char *path1, const char *path2) +{ + size_t pos1 = 0, pos2 = 0; + + while (true) + { + if (path1[pos1] == '\0' || path2[pos2] == '\0') + { + return (path1[pos1] == path2[pos2]); + } + + if (path1[pos1] == PATH_SEP_CHAR) + { + if (path2[pos2] != PATH_SEP_CHAR) + { + return false; + } + + /* Look for extra path chars */ + while (path1[++pos1]) + { + if (path1[pos1] != PATH_SEP_CHAR) + { + break; + } + } + while (path2[++pos2]) + { + if (path2[pos2] != PATH_SEP_CHAR) + { + break; + } + } + continue; + } + + /* If we're at a different non-alphanumeric, the next character MUST match */ + if (!isalpha(path1[pos1]) && (path1[pos1] != path2[pos2])) + { + return false; + } + + #ifdef WIN32 + if (toupper(path1[pos1]) != toupper(path2[pos2])) + #else + if (path1[pos1] != path2[pos2]) + #endif + { + return false; + } + + pos1++; + pos2++; + } +} + +size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + size_t len = vsnprintf(buffer, maxlength, fmt, ap); + va_end(ap); + + if (len >= maxlength) + { + len = maxlength - 1; + buffer[len] = '\0'; + } + + return len; +} + +inline bool pathchar_isalpha(char a) +{ + return (((a & 1<<7) == 0) && isalpha(a)); +} + +inline bool pathchar_sep(char a) +{ +#if defined WIN32 + return (a == '/' || a == '\\'); +#elif defined __linux__ + return (a == '/'); +#endif +} + +inline bool pathstr_isabsolute(const char *str) +{ +#if defined WIN32 + return (pathchar_isalpha(str[0]) + && str[1] == ':' + && pathchar_sep(str[2])); +#elif defined __linux__ + return (str[0] == '/'); +#endif +} + +inline bool pathchar_cmp(char a, char b) +{ +#if defined WIN32 + if (pathchar_isalpha(a) && pathchar_isalpha(b)) + { + return (tolower(a) == tolower(b)); + } + /* Either path separator is acceptable */ + if (pathchar_sep(a)) + { + return pathchar_sep(b); + } +#endif + return (a == b); +} + +/** + * @brief Forms a relative path given two absolute paths. + * + * @param buffer Buffer to store relative path in. + * @param maxlength Maximum length of the output buffer. + * @param relTo Destination folder to use as a working directory. + * Final folder name should not be pathchar-terminated. + * @param relFrom Source file or folder to use as a target. + * @return True on success, false on failure. + */ +bool UTIL_Relatize(char buffer[], + size_t maxlength, + const char *relTo, + const char *relFrom) +{ + /* We don't allow relative paths in here, force + * the user to resolve these himself! + */ + if (!pathstr_isabsolute(relTo) + || !pathstr_isabsolute(relFrom)) + { + return false; + } + +#if defined WIN32 + /* Relative paths across drives are not possible */ + if (!pathchar_cmp(relTo[0], relFrom[0])) + { + return false; + } + /* Get rid of the drive and semicolon part */ + relTo = &relTo[2]; + relFrom = &relFrom[2]; +#endif + + /* Eliminate the common root between the paths */ + const char *rootTo = NULL; + const char *rootFrom = NULL; + while (*relTo != '\0' && *relFrom != '\0') + { + /* If we get to a new path sequence, start over */ + if (pathchar_sep(*relTo) + && pathchar_sep(*relFrom)) + { + rootTo = relTo; + rootFrom = relFrom; + /* If the paths don't compare, stop looking for a common root */ + } else if (!pathchar_cmp(*relTo, *relFrom)) { + break; + } + relTo++; + relFrom++; + } + + /* NULLs shouldn't happen! */ + if (rootTo == NULL + || rootFrom == NULL) + { + return false; + } + + size_t numLevels = 0; + + /* The root case is special! + * Don't count anything from it. + */ + if (*(rootTo + 1) != '\0') + { + /* Search for how many levels we need to go up. + * Since the root pointer points to a '/', we increment + * the initial pointer by one. + */ + while (*rootTo != '\0') + { + if (pathchar_sep(*rootTo)) + { + /* Check for an improper trailing slash, + * just to be nice even though the user + * should NOT have done this! + */ + if (*(rootTo + 1) == '\0') + { + break; + } + numLevels++; + } + rootTo++; + } + } + + /* Now build the new relative path. */ + size_t len, total = 0; + while (numLevels--) + { + len = _snprintf(&buffer[total], maxlength - total, ".." PATH_SEP_STR); + if (len >= maxlength - total) + { + /* Not enough space in the buffer */ + return false; + } + total += len; + } + + /* Add the absolute path. */ + len = _snprintf(&buffer[total], maxlength - total, "%s", &rootFrom[1]); + if (len >= maxlength - total) + { + return false; + } + + return true; +} + +size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params) +{ + size_t len = vsnprintf(buffer, maxlength, fmt, params); + + if (len >= maxlength) + { + len = maxlength - 1; + buffer[len] = '\0'; + } + + return len; +} diff --git a/sourcemm/util.h b/sourcemm/util.h new file mode 100644 index 0000000..ed053bd --- /dev/null +++ b/sourcemm/util.h @@ -0,0 +1,76 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_UTIL_H +#define _INCLUDE_UTIL_H + +#include + +/** + * @brief Utility functions + * @file util.h + */ + +/** + * @brief Returns a pointer to the extension in a file name. + */ +const char *UTIL_GetExtension(const char *file); + +/** + * @brief Removes C-style comments from string. + */ +void UTIL_TrimComments(char *buffer); + +/** + * @brief Removes whitespace characters from left side of string. + */ +void UTIL_TrimLeft(char *buffer); + +/** + * @brief Removes whitespace characters from right side of string. + */ +void UTIL_TrimRight(char *buffer); + +/** + * @brief Breaks a string at the first space until it reaches a non-space. + */ +void UTIL_KeySplit(const char *str, char *buf1, size_t len1, char *buf2, size_t len2); + +/** + * @brief Compares two file paths. + */ +bool UTIL_PathCmp(const char *path1, const char *path2); + +/** + * @brief Same as snprintf except that it ensures the string buffer is null terminated. + */ +size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...); + +/** + * @brief Same as vsnprintf except that it ensures the string buffer is null terminated. + */ +size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params); + +/** + * @brief Forms a relative path given two absolute paths. + * + * @param buffer Buffer to store relative path in. + * @param maxlength Maximum length of the output buffer. + * @param relTo Destination folder to use as a working directory. + * Final folder name should not be pathchar-terminated. + * @param relFrom Source file or folder to use as a target. + * @return True on success, false on failure. + */ +bool UTIL_Relatize(char buffer[], + size_t maxlength, + const char *relTo, + const char *relFrom); + +#endif //_INCLUDE_UTIL_H diff --git a/sourcemm/version.rc b/sourcemm/version.rc new file mode 100755 index 0000000..67529d4 --- /dev/null +++ b/sourcemm/version.rc @@ -0,0 +1,101 @@ +// Microsoft Visual C++ generated resource script. +// + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" +#include "svn_version.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION SVN_FILE_VERSION + PRODUCTVERSION SVN_FILE_VERSION + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "Metamod: Source" + VALUE "FileDescription", "Metamod: Source" + VALUE "FileVersion", SVN_FILE_VERSION_STRING + VALUE "InternalName", "sourcemm" + VALUE "LegalCopyright", "Copyright (c) 2004-2007, Metamod: Source Development Team" + VALUE "OriginalFilename", "server.dll" + VALUE "ProductName", "Metamod: Source" + VALUE "ProductVersion", SVN_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/sourcemm/vsp_listener.cpp b/sourcemm/vsp_listener.cpp new file mode 100644 index 0000000..c02a230 --- /dev/null +++ b/sourcemm/vsp_listener.cpp @@ -0,0 +1,152 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#include "vsp_listener.h" +#include "CPlugin.h" + +using namespace SourceMM; + +VSPListener g_VspListener; + +VSPListener::VSPListener() +{ + m_Loaded = false; + m_Loadable = false; +} + +void VSPListener::ClientActive(edict_t *pEntity) +{ +} + +PLUGIN_RESULT VSPListener::ClientCommand(edict_t *pEntity) +{ + return PLUGIN_CONTINUE; +} + +PLUGIN_RESULT VSPListener::ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) +{ + return PLUGIN_CONTINUE; +} + +void VSPListener::ClientDisconnect(edict_t *pEntity) +{ +} + +void VSPListener::ClientPutInServer(edict_t *pEntity, char const *playername) +{ +} + +void VSPListener::ClientSettingsChanged(edict_t *pEdict) +{ +} + +void VSPListener::SetCommandClient(int index) +{ +} + +void VSPListener::GameFrame(bool simulating) +{ +} + +const char *VSPListener::GetPluginDescription() +{ + return "Metamod:Source Interface v" SOURCEMM_VERSION; +} + +bool VSPListener::IsLoaded() +{ + return m_Loaded; +} + +void VSPListener::LevelInit(char const *pMapName) +{ +} + +void VSPListener::LevelShutdown() +{ +} + +PLUGIN_RESULT VSPListener::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) +{ + return PLUGIN_CONTINUE; +} + +void VSPListener::Pause() +{ +} + +void VSPListener::UnPause() +{ +} + +void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) +{ +} + +void VSPListener::Unload() +{ +} + +void VSPListener::SetLoadable(bool set) +{ + m_Loadable = set; +} + +bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) +{ + if (!g_GameDll.loaded) + { + Error("Metamod:Source is not a Valve Server Plugin\n"); + + return false; + } + + if (!m_Loadable) + { + Warning("Do not manually load Metamod:Source as a Valve Server Plugin\n"); + + return false; + } + + if (m_Loaded) + { + return false; + } + + m_Loaded = true; + SetLoadable(false); + + PluginIter iter; + CPluginManager::CPlugin *pPlugin; + SourceHook::List::iterator event; + IMetamodListener *pML; + for (iter=g_PluginMngr._begin(); iter!=g_PluginMngr._end(); iter++) + { + pPlugin = (*iter); + if (pPlugin->m_Status < Pl_Paused) + { + continue; + } + /* Only valid for plugins >= 10 (v1:5, SourceMM 1.4) */ + if (pPlugin->m_API->GetApiVersion() < 10) + { + continue; + } + for (event=pPlugin->m_Events.begin(); + event!=pPlugin->m_Events.end(); + event++) + { + pML = (*event); + pML->OnVSPListening(this); + } + } + + return true; +} diff --git a/sourcemm/vsp_listener.h b/sourcemm/vsp_listener.h new file mode 100644 index 0000000..44b7b60 --- /dev/null +++ b/sourcemm/vsp_listener.h @@ -0,0 +1,49 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_SOURCEMM_VSPLISTENER_H_ +#define _INCLUDE_SOURCEMM_VSPLISTENER_H_ + +#include "sourcemm.h" +#include "iserverplugin.h" + +class VSPListener : public IServerPluginCallbacks +{ +public: + VSPListener(); +public: + virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory); + virtual void Unload(); + virtual void Pause(); + virtual void UnPause(); + virtual const char *GetPluginDescription(); + virtual void LevelInit(char const *pMapName); + virtual void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); + virtual void GameFrame(bool simulating); + virtual void LevelShutdown(void); + virtual void ClientActive(edict_t *pEntity); + virtual void ClientDisconnect(edict_t *pEntity); + virtual void ClientPutInServer(edict_t *pEntity, char const *playername); + virtual void SetCommandClient(int index); + virtual void ClientSettingsChanged(edict_t *pEdict); + virtual PLUGIN_RESULT ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); + virtual PLUGIN_RESULT ClientCommand(edict_t *pEntity); + virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID); +public: + bool IsLoaded(); + void SetLoadable(bool loadable); +private: + bool m_Loaded; + bool m_Loadable; +}; + +extern VSPListener g_VspListener; + +#endif //_INCLUDE_SOURCEMM_VSPLISTENER_H_ diff --git a/update_tool/Makefile b/update_tool/Makefile new file mode 100644 index 0000000..02273b2 --- /dev/null +++ b/update_tool/Makefile @@ -0,0 +1,68 @@ +#(C)2004-2007 SourceMM Development Team +# Makefile written by David "BAILOPAN" Anderson + +HL2SDK = ../../hl2sdk +SMM_ROOT = .. +SRCDS = ~/srcds + +### EDIT BELOW FOR OTHER PROJECTS ### + +OPT_FLAGS = -O2 -funroll-loops -s -pipe +GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden +DEBUG_FLAGS = -g -ggdb3 +CPP = gcc-4.1 +BINARY = sourcemm_update_tool_i486.so + +HL2PUB = $(HL2SDK)/public +HL2LIB = $(HL2SDK)/linux_sdk + +OBJECTS = update_tool.cpp + +LINK = vstdlib_i486.so tier0_i486.so -static-libgcc + +INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ + -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug + CFLAGS = $(DEBUG_FLAGS) +else + BIN_DIR = Release + CFLAGS = $(OPT_FLAGS) +endif + +GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) + +CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse + +ifeq "$(GCC_VERSION)" "4" + CFLAGS += $(GCC4_FLAGS) +endif + +OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +$(BIN_DIR)/%.o: %.cpp + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +all: + mkdir -p $(BIN_DIR) + ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so + ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so + nasm api_link.asm -f elf -o $(BIN_DIR)/api_link.o -DLINUX + $(MAKE) sourcemm + rm -rf $(BINARY) + ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) + +sourcemm: $(OBJ_LINUX) + $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(BIN_DIR)/api_link.o $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) + +debug: + $(MAKE) all DEBUG=true + +default: all + +clean: + rm -rf Release/*.o + rm -rf Release/$(BINARY) + rm -rf Debug/*.o + rm -rf Debug/$(BINARY) diff --git a/update_tool/README.txt b/update_tool/README.txt new file mode 100644 index 0000000..9c974a4 --- /dev/null +++ b/update_tool/README.txt @@ -0,0 +1,90 @@ +This is the README file for sourcemm_update_tool. + +This tool will automatically correct gameinfo.txt when your server gets updated, and Valve's updater overwrites Metamod:Source's changes. This tool is experimental, and is thus a separate download for now. + +1. INSTALLATION + + a. Extract the entire package to your mod folder. The structure should look like: + + /addons/metamod/bin/sourcemm_update_tool.dll + /addons/metamod/bin/sourcemm_update_tool_i486.so + /addons/metamod/README.txt + /addons/sourcemm_update_tool.vdf + /sourcemm_updater.conf + + b. Open /sourcemm_updater.conf with your favorite text editor. Change the + "cstrike" folder to match your mod folder. + +2. CONFIGURATION + + The sourcemm_updater.conf file has two configuration options. + + mmpath - Set this to the path Metamod:Source is located in. + This defaults to addons/metamod/bin + restart - Set this to how the server should be restarted when + gameinfo.txt is patched. There are three options: + + quit - Execute "quit" in the console. Currently does not work. + never - Do not restart. + error - Generate an error message. Because of a bug in SourceDS, + this will generate a crash dump on Windows, but the server + will successfully quit. + +3. USAGE + + You do not need to do anything to use the updater tool. When your server starts, + it silently checks to see if Metamod:Source is loaded. If not, it will make sure + gameinfo.txt is correctly set. Then, depending on how it's configured, it will + kill the server. Most game server provides have auto-restart functionality on their + servers; if not, you will need to manually restart the server. + + The update tool unloads itself immediately after the server starts, so it will not + use any resources, and will not display when you type 'plugin_print'. + +4. TROUBLESHOOTING + + This tool is currently experimental. There are two possible problems. For + any issue you encounter, you should post a report here: + + http://bugs.alliedmods.net/index.php?project=4 + + a. The updater tool does not patch gameinfo.txt + + Verify that the tool is loading. You can do this by opening up the + sourcemm_update_tool.vdf file and copying its file path. Then, enter + the following command in your server console: + + plugin_load + + Example: + + plugin_load cstrike\addons\metamod\bin\sourcemm_update_tool + + If you get the following reply: + + Failed to load plugin "cstrike\addons\sourcemm_update_tool" + Unable to load plugin "cstrike\addons\sourcemm_update_tool" + + Then the tool is working, and you should post a bug report. If instead, + you get: + + Unable to load plugin "cstrike\addons\sourcemm_update_tool" + Unable to load plugin "cstrike\addons\sourcemm_update_tool" + + Then the tool is not loading properly, and the path you are trying to use + is not correct. + + b. The server always dies, and you can't start it at all + + The updater tool is either crashing or not repairing Metamod:Source + correctly. First, try changing the 'restart' line in sourcemm_updater.conf + to the following line: + + restart = never + + If that does not fix the problem, remove the .vdf file so the updater tool + will not be loaded. + + In either case, you should post a bug report containing your mod name and + your gameinfo.txt as an attachment. + \ No newline at end of file diff --git a/update_tool/api_link.asm b/update_tool/api_link.asm new file mode 100644 index 0000000..6f94053 --- /dev/null +++ b/update_tool/api_link.asm @@ -0,0 +1,138 @@ +;;;; +;; (C)2005-2007 AlliedModders LLC +;; By the Metamod:Source Development Team +;; This software is licensed under the zlib/libpng free software license. +;; +;; This assembly file is a short thunk wrapper to let us load as a VSP and exit quietly, +;; without any overhead of the rest of the interface, and also to prevent linking against +;; tierX or vstdlib +;;;; + +;;Exports: +;; void GetBaseDir(char *buffer, maxlength); +;; void *GetThisPointer(); +;;Imports: +;; void LoadFunction(); + +section .text + +global GetThisPointer, GetGameDir, ServerCommand +global _GetThisPointer, _GetGameDir, _ServerCommand +global _GetICvar, GetICvar +extern _LoadFunction + +GetICvar: +_GetICvar: + mov eax, [icvar] + ret + +GetThisPointer: +_GetThisPointer: + mov eax, GLOBAL_POINTER + ret + +GetGameDir: +_GetGameDir: + push ebp + mov ebp, esp + + mov ecx, [engine] ;get this pointer + mov edx, [ecx] ;get the vtable + push dword [ebp+12] ;push maxlenth + push dword [ebp+8] ;push buffer + %ifdef LINUX + push ecx ;push this pointer + %endif + call dword [edx+216] ;call IVEngineServer::GetGameDir + %ifdef LINUX + add esp, 12 ;correct stack + %endif + + pop ebp + ret + +ServerCommand +_ServerCommand: + push ebp + mov ebp, esp + + mov ecx, [engine] ;get this pointer + mov edx, [ecx] ;get the vtable + push dword [ebp+8] ;push string + %ifdef LINUX + push ecx ;push this pointer + %endif + call dword [edx+144] ;call IVEngineServer::ServerCommand + %ifdef LINUX + add esp, 8 ;correct stack + %endif + + pop ebp + ret + +thisLoadFunction: + push ebp + mov ebp, esp + + push edi + + ;get factory + %ifdef LINUX + mov edi, [ebp+12] + %else + mov edi, [ebp+8] + %endif + + push dword 0 ;NULL + push dword VENGINESERVER ;iface name + call edi ;call factory + add esp, 8 ;correct stack + + test eax, eax ;do we have a valid pointer? + jz .end ;no, bail out + + mov [engine], eax ;store the engine pointer + + push dword 0 ;NULL + push dword VENGINECVAR ;iface name + call edi ;call factory + add esp, 8 ;correct stack + + test eax, eax ;do we have a valid pointer? + jz .end ;no, bail out + + mov [icvar], eax ;store the icvar pointer + + call _LoadFunction + +.end: + ;We never load, never ever ever! + xor eax, eax + + pop edi + + pop ebp + %ifdef LINUX + ret + %else + retn 8 + %endif + +thisUnloadFunction: + ret + +section .data + INTERFACE_NAME DB "ISERVERPLUGINCALLBACKS001", 0 + VENGINESERVER DB "VEngineServer021", 0 + VENGINECVAR DB "VEngineCvar003", 0 + + VIRTUAL_TABLE DD thisLoadFunction + DD thisUnloadFunction + ;We don't need any more of the vtable here + + GLOBAL_POINTER DD VIRTUAL_TABLE + + temp_ret DD 0 + temp_ptr DD temp_ret + engine DD 0 + icvar DD 0 diff --git a/update_tool/msvc8/update_tool.sln b/update_tool/msvc8/update_tool.sln new file mode 100644 index 0000000..5250f8a --- /dev/null +++ b/update_tool/msvc8/update_tool.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "update_tool", "update_tool.vcproj", "{DDD1563F-7EE2-4E76-BE57-ED84A2664A51}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Debug|Win32.ActiveCfg = Debug|Win32 + {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Debug|Win32.Build.0 = Debug|Win32 + {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Release|Win32.ActiveCfg = Release|Win32 + {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/update_tool/msvc8/update_tool.vcproj b/update_tool/msvc8/update_tool.vcproj new file mode 100644 index 0000000..825e521 --- /dev/null +++ b/update_tool/msvc8/update_tool.vcproj @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/update_tool/sourcemm_update_tool.vdf b/update_tool/sourcemm_update_tool.vdf new file mode 100644 index 0000000..79a505c --- /dev/null +++ b/update_tool/sourcemm_update_tool.vdf @@ -0,0 +1,6 @@ +//This is a sample VDF file. You need to edit "cstrike" to point to the mod you use. + +"Plugin" +{ + "file" "cstrike/addons/metamod/bin/sourcemm_update_tool" +} diff --git a/update_tool/sourcemm_updater.conf b/update_tool/sourcemm_updater.conf new file mode 100644 index 0000000..bdf1eea --- /dev/null +++ b/update_tool/sourcemm_updater.conf @@ -0,0 +1,9 @@ +;Use this to configure where Metamod resides, if you have +;changed its location +;mmpath = addons/metamod/bin + +;Use this to specify how the updater tool restarts SourceDS +; never - don't restart +; error - restart by generating a fatal error message +; quit - restart by issuing a "quit" server command +restart = error diff --git a/update_tool/update_tool.cpp b/update_tool/update_tool.cpp new file mode 100644 index 0000000..ef6dbfe --- /dev/null +++ b/update_tool/update_tool.cpp @@ -0,0 +1,366 @@ +#include +#include +#include +#include + +#if defined _MSC_VER +#define SEPCHAR "\\" +#define MMPATH "addons\\metamod\\bin" +#define WINDOWS_LEAN_AND_MEAN +#include +#elif defined __linux__ +#define SEPCHAR "/" +#define MMPATH "addons/metamod/bin" +#include +#endif + +#include + +extern "C" void GetGameDir(char *buffer, int maxlength); +extern "C" void *GetThisPointer(); +extern "C" void ServerCommand(const char *command); +extern "C" ICvar *GetICvar(); + +size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...); +bool s_isspace(char c); +bool RenameFile(const char *old, const char *newf); +bool RemoveFile(const char *file); + +/* This will be called by the thunk */ +#if defined _MSC_VER +extern "C" void LoadFunction() +#elif defined __linux__ +extern "C" void _LoadFunction() +#endif +{ + ICvar *pCvar = GetICvar(); + if (pCvar->FindVar("metamod_version") != NULL) + { + /* Already exists, bail out */ + return; + } + + char gamedir[260]; + char mmpath[260]; + + enum RestartMode + { + Restart_Never, + Restart_Error, + Restart_Quit, + }; + + RestartMode mode = Restart_Error; + + GetGameDir(gamedir, sizeof(gamedir)); + + /* Defaults */ + UTIL_Format(mmpath, sizeof(mmpath), "|gameinfo_path|%s", MMPATH); + + /* Read config */ + char config[260]; + UTIL_Format(config, sizeof(config), "%s" SEPCHAR "sourcemm_updater.conf", gamedir); + FILE *fpCfg = fopen(config, "rt"); + if (fpCfg) + { + char cfgLine[512]; + while (!feof(fpCfg) && fgets(cfgLine, sizeof(cfgLine), fpCfg) != NULL) + { + char key[255]; + + size_t keyLen = 0; + + /* Strip whitespace */ + char *input = cfgLine; + while (*input != '\0' && s_isspace(*input)) + { + input++; + } + + /* Strip ending whitespace */ + size_t len = strlen(input); + for (size_t i = len - 1; + i >= 0 && i < len; + i--) + { + if (s_isspace(input[i])) + { + input[i] = '\0'; + len--; + } else { + break; + } + } + + /* Eat stuff until we find a key */ + while (*input != '\0' && !s_isspace(*input)) + { + if (keyLen < sizeof(key)) + { + key[keyLen++] = *input; + } + input++; + } + key[keyLen] = '\0'; + + /* Eat spaces until we hit an = sign */ + while (*input != '\0' && *input != '=') + { + input++; + } + + if (*input == '=') + { + input++; + } + + /* Eat spaces again */ + while (*input != '\0' && s_isspace(*input)) + { + input++; + } + + /* Ignore comments */ + if (key[0] == ';') + { + continue; + } + + /* The rest is our key */ + if (strcmp(key, "mmpath") == 0) + { + UTIL_Format(mmpath, sizeof(mmpath), "%s", input); + } else if (strcmp(key, "restart") == 0) { + if (strcmp(input, "never") == 0) + { + mode = Restart_Never; + } else if (strcmp(input, "error") == 0) { + mode = Restart_Error; + } else if (strcmp(input, "quit") == 0) { + mode = Restart_Quit; + } + } + } + fclose(fpCfg); + } + + char old_path[260]; + char new_path[260]; + + UTIL_Format(old_path, sizeof(old_path), "%s" SEPCHAR "gameinfo.txt", gamedir); + UTIL_Format(new_path, sizeof(new_path), "%s" SEPCHAR "gameinfo.new.txt", gamedir); + + FILE *fp = fopen(old_path, "rt"); + + if (!fp) + { + return; + } + + FILE *op = fopen(new_path, "wt"); + if (!op) + { + fclose(fp); + return; + } + + enum ParseState + { + Parse_None, + Parse_Root, + Parse_GameInfo, + Parse_FileSystem, + Parse_SearchPaths, + }; + + ParseState ps = Parse_Root; + + char input[1024]; + char backup[1024]; + + bool bWroteOutput = false; + + while (!feof(fp) && fgets(input, sizeof(input), fp) != NULL) + { + UTIL_Format(backup, sizeof(backup), "%s", input); + + if (ps != Parse_None) + { + char *inbuf = input; + + /* Strip beginning whitespace */ + while (*inbuf != '\0' && s_isspace(*inbuf)) + { + inbuf++; + } + + /* Strip ending whitespace */ + size_t len = strlen(inbuf); + for (size_t i = len - 1; + i >= 0 && i < len; + i--) + { + if (s_isspace(inbuf[i])) + { + inbuf[i] = '\0'; + len--; + } else { + break; + } + } + + /* Strip quotation marks */ + if (inbuf[0] == '"' + && inbuf[len-1] == '"') + { + inbuf[len - 1] = '\0'; + inbuf = &inbuf[1]; + len -= 2; + } + + /* Do tests */ + if (ps == Parse_Root && strcmp(inbuf, "GameInfo") == 0) + { + ps = Parse_GameInfo; + } else if (ps == Parse_GameInfo && strcmp(inbuf, "FileSystem") == 0) { + ps = Parse_FileSystem; + } else if (ps == Parse_FileSystem && strcmp(inbuf, "SearchPaths") == 0) { + ps = Parse_SearchPaths; + } else if (ps == Parse_SearchPaths) { + const char *game = strstr(inbuf, "Game"); + if (game) + { + if (strstr(game, "GameBin") != NULL + && strstr(game, mmpath) != NULL) + { + fclose(op); + op = NULL; + break; /* Nothing more to do! */ + } else { + fputs("\t\t\tGameBin\t\t\t", op); + fputs(mmpath, op); + fputs("\n", op); + ps = Parse_None; + bWroteOutput = true; + } + } + } + } + + fputs(backup, op); + } + + if (!op) + { + /* Well, we can't really do anything else. Give up. */ + fclose(fp); + return; + } + + /* Close all streams */ + fclose(op); + fclose(fp); + + /* If we didn't change anything, abort here */ + if (!bWroteOutput) + { + RemoveFile(new_path); + return; + } + + /* Move the old file to a backup name */ + char backup_name[260]; + UTIL_Format(backup_name, sizeof(backup_name), "%s" SEPCHAR "gameinfo.backup.txt", gamedir); + + if (!RenameFile(old_path, backup_name)) + { + /* If we can't rename, just bail out. + * We don't want to overwrite the client's default + * without backing it up first! + */ + return; + } + if (!RenameFile(new_path, old_path)) + { + /* Since this failed, we really have no choice. + * Try and rename the old back. + */ + RenameFile(backup_name, old_path); + return; + } + RemoveFile(new_path); + + if (mode == Restart_Error) + { + Error("Server is restarting to load Metamod:Source"); + } else if (mode == Restart_Quit) { + ServerCommand("quit\n"); + } +} + +bool RemoveFile(const char *file) +{ +#if defined _MSC_VER + return (_unlink(file) == 0); +#else + return (unlink(file) == 0); +#endif +} + +bool s_isspace(char c) +{ + if ((unsigned)c & 0x80) + { + return false; + } else { + return isspace(c) ? true : false; + } +} + +size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + size_t len = vsnprintf(buffer, maxlength, fmt, ap); + va_end(ap); + + if (len >= maxlength) + { + len = maxlength - 1; + buffer[len] = '\0'; + } + + return len; +} + +bool RenameFile(const char *old, const char *newf) +{ +#if defined __linux__ + return (rename(old, newf) == 0); +#elif defined WIN32 + return (MoveFileA(old, newf) != 0); +#endif +} + +#if defined _MSC_VER +extern "C" __declspec(dllexport) void *CreateInterface(const char *iface, int *ret) +#elif defined __linux__ +extern "C" __attribute__((visibility("default"))) void *CreateInterface(const char *iface, int *ret) +#endif +{ + if (strcmp(iface, "ISERVERPLUGINCALLBACKS001") == 0) + { + if (ret) + { + *ret = 0; + } + return GetThisPointer(); + } + + if (ret) + { + *ret = 1; + } + return NULL; +} From 2cf20b1d9882b33598e7e9c8cd0373b31bc4512d Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 18 Sep 2007 20:35:29 +0000 Subject: [PATCH 02/25] started merging in non-sourcehook changes from 1.5.0 --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40423 --- modules.versions | 2 +- sourcemm/CPlugin.cpp | 35 +++++++- sourcemm/CPlugin.h | 4 + sourcemm/CSmmAPI.cpp | 10 ++- sourcemm/CSmmAPI.h | 1 + sourcemm/ISmmAPI.h | 10 +++ sourcemm/ISmmPlugin.h | 12 ++- sourcemm/changelog.txt | 117 ++++++++++++++---------- sourcemm/concommands.cpp | 187 +++++++++++++++++++++++---------------- sourcemm/concommands.h | 2 +- sourcemm/sourcemm.cpp | 27 +++--- sourcemm/sourcemm.h | 5 +- sourcemm/util.cpp | 26 +++--- sourcemm/util.h | 5 ++ 14 files changed, 282 insertions(+), 161 deletions(-) diff --git a/modules.versions b/modules.versions index 912978c..bd3da7d 100644 --- a/modules.versions +++ b/modules.versions @@ -1,6 +1,6 @@ [PRODUCT] major = 1 -minor = 4 +minor = 6 revision = 2 [sourcemm] diff --git a/sourcemm/CPlugin.cpp b/sourcemm/CPlugin.cpp index 218a1ad..bb61d3c 100644 --- a/sourcemm/CPlugin.cpp +++ b/sourcemm/CPlugin.cpp @@ -302,6 +302,37 @@ CPluginManager::CPlugin *CPluginManager::FindByAPI(ISmmPlugin *api) return NULL; } +int CPluginManager::GetPluginCount() +{ + return (int)m_Plugins.size(); +} + +const char *CPluginManager::GetStatusText(CPlugin *pl) +{ + switch (pl->m_Status) + { + case Pl_NotFound: + return "NOFILE"; + case Pl_Error: + return "ERROR"; + case Pl_Refused: + return "FAILED"; + case Pl_Paused: + return "PAUSED"; + case Pl_Running: + { + if (pl->m_API && pl->m_API->QueryRunning(NULL, 0)) + { + return "STOPPED"; + } else { + return "RUNNING"; + } + } + default: + return "-"; + } +} + CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source, char *error, size_t maxlen) { FILE *fp; @@ -607,12 +638,12 @@ void CPluginManager::UnregAllConCmds(CPlugin *pl) SourceHook::List::iterator i; for (i=pl->m_Cvars.begin(); i!=pl->m_Cvars.end(); i++) - g_SMConVarAccessor.Unregister( (*i) ); + g_SMConVarAccessor.Unregister(pl->m_Id, (*i) ); pl->m_Cvars.clear(); for (i=pl->m_Cmds.begin(); i!=pl->m_Cmds.end(); i++) - g_SMConVarAccessor.Unregister( (*i) ); + g_SMConVarAccessor.Unregister(pl->m_Id, (*i) ); pl->m_Cmds.clear(); } diff --git a/sourcemm/CPlugin.h b/sourcemm/CPlugin.h index 005041f..b9b0784 100644 --- a/sourcemm/CPlugin.h +++ b/sourcemm/CPlugin.h @@ -39,6 +39,7 @@ * New ISmmAPI additions * 9: New ISmmPluginManager additions * C 10: Added VSP listen functions to ISmmAPI and IMetamodListener (2007-02-09) + * C 11: New SourceHook version V5 (May, 2007) */ #define PLAPI_MIN_VERSION 7 @@ -115,6 +116,9 @@ namespace SourceMM */ bool Retry(PluginId id, char *error, size_t len); + int GetPluginCount(); + const char *GetStatusText(CPlugin *pl); + //get alias info const char *LookupAlias(const char *alias); SourceHook::List::iterator _alias_begin(); diff --git a/sourcemm/CSmmAPI.cpp b/sourcemm/CSmmAPI.cpp index 29963a9..8f9d34d 100644 --- a/sourcemm/CSmmAPI.cpp +++ b/sourcemm/CSmmAPI.cpp @@ -118,7 +118,7 @@ void CSmmAPI::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) g_PluginMngr.RemovePluginCvar(plugin, pCommand); } - g_SMConVarAccessor.Unregister(pCommand); + g_SMConVarAccessor.Unregister(g_PluginMngr.FindByAPI(plugin)->m_Id, pCommand); } void CSmmAPI::ConPrint(const char *fmt) @@ -456,6 +456,7 @@ void CSmmAPI::LoadAsVSP() { size_t len; char engine_file[PATH_SIZE]; + char engine_path[PATH_SIZE]; char rel_path[PATH_SIZE * 2]; GetFileOfAddress(g_Engine.engine, engine_file, sizeof(engine_file)); @@ -471,9 +472,10 @@ void CSmmAPI::LoadAsVSP() break; } } + abspath(engine_path, engine_file); const char *usepath = g_SmmPath.c_str(); - if (UTIL_Relatize(rel_path, sizeof(rel_path), engine_file, g_SmmPath.c_str())) + if (UTIL_Relatize(rel_path, sizeof(rel_path), engine_path, g_SmmPath.c_str())) { usepath = rel_path; } @@ -666,3 +668,7 @@ const char *CSmmAPI::GetUserMessage(int index, int *size) return msg->name; } +int CSmmAPI::GetVSPVersion() +{ + return g_VspVersion; +} diff --git a/sourcemm/CSmmAPI.h b/sourcemm/CSmmAPI.h index 914fb7f..546b77b 100644 --- a/sourcemm/CSmmAPI.h +++ b/sourcemm/CSmmAPI.h @@ -70,6 +70,7 @@ namespace SourceMM int GetUserMessageCount(); int FindUserMessage(const char *name, int *size=NULL); const char *GetUserMessage(int index, int *size=NULL); + int GetVSPVersion(); public: bool CacheCmds(); bool CmdCacheSuccessful(); diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h index e6e90a7..d37e543 100644 --- a/sourcemm/ISmmAPI.h +++ b/sourcemm/ISmmAPI.h @@ -303,6 +303,15 @@ public: // Added in 1.4 (1:5) * @return Message name, or NULL on failure. */ virtual const char *GetUserMessage(int index, int *size=NULL) =0; +public: // Added in 1.5.0 (1:6) + /** + * @brief Returns the highest interface version of IServerPluginCallbacks that the engine supports. + * This is useful for games that run on older versions of the Source engine, such as The Ship. + * + * @return Highest interface version of IServerPluginCallbacks. + * Returns 0 if SourceMM's VSP listener isn't currently enabled. + */ + virtual int GetVSPVersion() =0; }; @@ -315,6 +324,7 @@ public: // Added in 1.4 (1:5) * 1.2.2 Added API for printing to client console (with string formatting). * 1.3 Added new interface search API. * 1.4 Added VSP listener and user message API. + * 1.5.0 Added API for getting highest supported version of IServerPluginCallbacks. */ #endif //_INCLUDE_ISMM_API_H diff --git a/sourcemm/ISmmPlugin.h b/sourcemm/ISmmPlugin.h index dea7700..7b2ea3a 100644 --- a/sourcemm/ISmmPlugin.h +++ b/sourcemm/ISmmPlugin.h @@ -20,7 +20,7 @@ #include #include "ISmmAPI.h" -#define PLAPI_VERSION 10 +#define PLAPI_VERSION 12 #define PLAPI_NAME "ISmmPlugin" class ISmmAPI; @@ -316,6 +316,16 @@ public: virtual void OnVSPListening(IServerPluginCallbacks *iface) { } + + /* @brief Called when Metamod:Source is about to remove a concommand or convar. + * This can also be called if ISmmAPI::UnregisterConCmdBase is used by a plugin. + * + * @param id Id of the plugin that created the concommand or convar. + * @param pCommand Pointer to concommand or convar that is being removed. + */ + virtual void OnUnlinkConCommandBase(PluginId id, ConCommandBase *pCommand) + { + } }; #define PL_EXPOSURE CreateInterface diff --git a/sourcemm/changelog.txt b/sourcemm/changelog.txt index 40867d6..8d4fa60 100644 --- a/sourcemm/changelog.txt +++ b/sourcemm/changelog.txt @@ -1,48 +1,64 @@ +2007/??/?? 1.6.0: + - Added API for getting highest supported IServerPluginCallbacks interface + version. + - Added OnUnlinkConCommandBase to IMetamodListner to notify when Metamod:Source + is about to remove a concommand or convar. + - The output of the "meta list" command has been reformatted in order to allow + more space for plugins' name, version, and author fields. + 2007/06/26 1.4.2: - - Fixed a bug where unloading all plugins could crash if one plugin had child plugins. + - Fixed a bug where unloading all plugins could crash if one plugin had child + plugins. 2007/05/16 1.4.1: - - The client version of the "meta" command should now work with games using the latest - Source beta (srcds0407). + - The client version of the "meta" command should now work with games using the + latest Source beta (srcds0407). - Fixed amb233 (VSP listener didn't work with Steam dedicated version). - - Fixed amb277 (failed to get user message list in Kreedz Climbing). + - Fixed amb277 (failed to get user message list in Kreedz Climbing). 2007/04/05 1.4.0: - - Added API functions for retrieving User Message info without potentially crashing. - - Added API functions for letting SourceMM plugins use Valve Server Plugin callbacks. - - Added plugin status to client version of "meta list" command. Previously, it did not - differentiate between running and paused plugins. + - Added API functions for retrieving User Message info without potentially + crashing. + - Added API functions for letting SourceMM plugins use Valve Server Plugin + callbacks. + - Added plugin status to client version of "meta list" command. Previously, it + did not differentiate between running and paused plugins. - An experimental automatic gameinfo.txt fixer is now available. - Changed version numbering to include the build number (SVN revision). - Fixed amb93 (improved mod path detection). - Fixed various rare string inconsistencies. 2006/11/29 1.3d: - - Updated Metamod:Source to recognize the latest Source Engine version (ServerGameDLL006) + - Updated Metamod:Source to recognize the latest Source Engine version + (ServerGameDLL006) 2006/09/06 1.3a: - - Fixed a building issue on Linux which caused unresolved symbol errors when trying to - load Metamod:Source on a game using an older set of engine libraries. This fix should - now allow Metamod:Source to run with The Ship on Linux. + - Fixed a building issue on Linux which caused unresolved symbol errors when + trying to load Metamod:Source on a game using an older set of engine + libraries. This fix should now allow Metamod:Source to run with The Ship on + Linux. 2006/08/16 1.3: - Added SourceHook support for functions that return references. - - Added some extra information to the "meta game" command: Description and Interface. For - example, CS:S would display "Counter-Strike: Source" and "ServerGameDLL004." + - Added some extra information to the "meta game" command: Description and + Interface. For example, CS:S would display "Counter-Strike: Source" and + "ServerGameDLL004." - Added some extra functionality to ISmmPluginManager. - - Added compiling support for MSVC 8.0 (Visual Studio 2005) and GCC 4.x - - Added another API helper function for formatting and searching for interfaces. + - Added compiling support for MSVC 8.0 (Visual Studio 2005) and GCC 4.x. + - Added another API helper function for formatting and searching for + interfaces. - Updated project files and source tree to use the latest HL2SDK. - Updated the sample plugins to be a bit cleaner and use newer API. - - Fixed bug where Metamod:Source could load the wrong GameDLL and/or load more than one - GameDLL. This issue occured in HL2 CTF, SourceForts, or any other mod that relied on - files from another mod directory. - - Fixed bug where ISmmAPI::MetaFactory() would return the wrong interface when trying to - retrieve ISmmPluginManager. - - Fixed bug where returning false in Load() after adding a Metamod event listener or - hooking a function could cause a crash instead of rejecting the plugin. - - Fixed bug where trying to load Metamod:Source a second time as a SourceMM or Valve - server plugin could cause a crash. + - Fixed bug where Metamod:Source could load the wrong GameDLL and/or load more + than one GameDLL. This issue occured in HL2 CTF, SourceForts, or any other + mod that relied on files from another mod directory. + - Fixed bug where ISmmAPI::MetaFactory() would return the wrong interface when + trying to retrieve ISmmPluginManager. + - Fixed bug where returning false in Load() after adding a Metamod event + listener or hooking a function could cause a crash instead of rejecting the + plugin. + - Fixed bug where trying to load Metamod:Source a second time as a SourceMM or + Valve server plugin could cause a crash. - Fixed a bug in FormatIface() that caused InterfaceSearch() to infinite loop. 2006/06/14 1.2.3: @@ -54,17 +70,19 @@ - Added "meta alias" command. - Added SourceHook API for manual callclasses. - Added support for the latest Source engine (ServerGameDLL005). - - Added API for printing text in a client's console with ClientConPrintf. This does the - same thing as IVEngineServer::ClientPrintf except that it allows string formatting. - - Added client version of "meta" command in order to allow clients to view version - information and a list of loaded plugins. + - Added API for printing text in a client's console with ClientConPrintf. This + does the same thing as IVEngineServer::ClientPrintf except that it allows + string formatting. + - Added client version of "meta" command in order to allow clients to view + version information and a list of loaded plugins. - Fixed a bug causing old mods on newer engines to fail loading. - Fixed issues with SourceHook's SH_CALL and reference parameters. - Fixed a bug where the mm_pluginsfile cvar was being ignored. - Fixed a memory leak when using ISmmAPI::InterfaceSearch. 2006/02/15 1.2.1: - - Fixed bug where returning newparams in a post hook would cause infinite recursion. + - Fixed bug where returning newparams in a post hook would cause infinite + recursion. - Fixed bug where "meta load" could load the same plugin multiple times. - Fixed bug where unloading a plugin could crash internal hook states. - Fixed bug where unhooking a single hook would clear the hook chain. @@ -76,8 +94,8 @@ - Added API for formatting an OS-independent path. - Added Listen Server Launcher to the graphical installer. - Fixed bug where failed plugins could crash the plugin list. - - NOTE: SourceHook changes may require plugins to be recompiled against - the new API. + - NOTE: SourceHook changes may require plugins to be recompiled against the new + API. 2005/12/06 1.1.2: - Added interface overriding/sharing examples to sample plugins. @@ -90,35 +108,38 @@ - Fixed a bug where AllPluginsLoaded() was not called after DLLInit(). 2005/10/21 1.1: - - Rewrote GameDLL loading code to be API version generic. - As such, SourceMM will now easily support new API releases without - an SDK release, such as the case with Day of Defeat:Source + - Rewrote GameDLL loading code to be API version generic. As such, SourceMM + will now easily support new API releases without an SDK release, such as the + case with Day of Defeat:Source. - Added more flexibility to plugin control by supplying an event system. - Removed dependency on libstdc++.so by supplying a small template library. - - SourceHook internal API is now interface-based, meaning that future - updates to the API will not break older plugins. This update, however, - breaks older plugins. + - SourceHook internal API is now interface-based, meaning that future updates + to the API will not break older plugins. This update, however, breaks older + plugins. - SourceHook is now re-entrant. - Added a basic automated installer (by Basic-Master). - Fixed a bug where games with changing game names would not work. - Fixed various bugs, including a cvarlist corruption bug on unloading plugins. 2005/07/07 1.00-RC2: - - Added API for dealing with ConCommandBase registration (cvars/concmds). - This is to fix the fact that Valve API provides no way to unlist a cvar/cmd. + - Added API for dealing with ConCommandBase registration (cvars/concmds). This + is to fix the fact that Valve API provides no way to unlist a cvar/cmd. - Added two new commands - "meta cmds" and "meta cvars". - - Added API calls for correctly printing to the console such that rcon - will also receive messages that a plugin prints. - This problem was mentioned on hlcoders and Valve offered no reply. + - Added API calls for correctly printing to the console such that rcon will + also receive messages that a plugin prints. This problem was mentioned on + hlcoders and Valve offered no reply. - Added event hooking and cvar samples to sample_mm. - - Added new cvar, mm_pluginsfile, which defaults to "addons/metamod/metaplugins.ini". - - Fixed a bug where multiple vtable patches on the same hook were not re-patched when removed. - This caused a crash when two hooks were declared on one function, the first was removed, and - the original function was then called. + - Added new cvar, mm_pluginsfile, which defaults to + "addons/metamod/metaplugins.ini". + - Fixed a bug where multiple vtable patches on the same hook were not + re-patched when removed. This caused a crash when two hooks were declared on + one function, the first was removed, and the original function was then + called. - Fixed "meta clear" not unloading all plugins. - Fixed Metamod:Source loading plugins with a higher current API version. - Fixed whitespace being parsed in metaplugins.ini. - - Fixed bug where SourceHook tried to patch already destroyed/unavailable memory. + - Fixed bug where SourceHook tried to patch already destroyed/unavailable + memory. - Bumped Plugin API version to 6. 2005/05/06 1.00-RC1: diff --git a/sourcemm/concommands.cpp b/sourcemm/concommands.cpp index 4a3344f..0aa0313 100644 --- a/sourcemm/concommands.cpp +++ b/sourcemm/concommands.cpp @@ -15,6 +15,9 @@ #include "sh_string.h" #include "sh_list.h" +using namespace SourceMM; +using namespace SourceHook; + /** * @brief Console Command Implementations * @file concommands.cpp @@ -50,15 +53,41 @@ bool SMConVarAccessor::Register(ConCommandBase *pCommand) void SMConVarAccessor::MarkCommandsAsGameDLL() { - for (SourceHook::List::iterator iter = m_RegisteredCommands.begin(); + for (List::iterator iter = m_RegisteredCommands.begin(); iter != m_RegisteredCommands.end(); ++iter) { (*iter)->AddFlags(FCVAR_GAMEDLL); } } -void SMConVarAccessor::Unregister(ConCommandBase *pCommand) +void SMConVarAccessor::Unregister(PluginId id, ConCommandBase *pCommand) { + /* Notify via IMetamodListener */ + PluginIter iter; + CPluginManager::CPlugin *pPlugin; + List::iterator event; + IMetamodListener *pML; + for (iter=g_PluginMngr._begin(); iter!=g_PluginMngr._end(); iter++) + { + pPlugin = (*iter); + if (pPlugin->m_Status < Pl_Paused) + { + continue; + } + /* Only valid for plugins >= 12 (v1:6, SourceMM 1.5) */ + if (pPlugin->m_API->GetApiVersion() < 12) + { + continue; + } + for (event=pPlugin->m_Events.begin(); + event!=pPlugin->m_Events.end(); + event++) + { + pML = (*event); + pML->OnUnlinkConCommandBase(id, pCommand); + } + } + ICvar *cv = g_Engine.icvar; ConCommandBase *ptr = cv->GetCommands(); @@ -154,7 +183,7 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG(" Description: %s\n", g_GameDll.pGameDLL->GetGameDescription()); CONMSG(" Mod Path: %s\n", g_ModPath.c_str()); CONMSG(" DLL Path: %s\n", g_BinPath.c_str()); - CONMSG(" Interface: ServerGameDLL%03d\n", g_GameDllVersion); + CONMSG(" Interface: ServerGameDLL%03d, ServerGameClients%03d\n", g_GameDllVersion, g_GameClientsVersion); // Display user messages if (g_SmmAPI.MsgCacheSuccessful()) @@ -191,65 +220,63 @@ CON_COMMAND(meta, "Metamod:Source Menu") return; } else if (strcmp(command, "list") == 0) { - SourceMM::CPluginManager::CPlugin *pl; + CPluginManager::CPlugin *pl; + ISmmPlugin *plapi; + const char *plname; PluginIter i; - const char *status=""; - const char *version=NULL; - const char *name=NULL; - const char *author=NULL; + char buffer[256]; + int len; + int plnum = g_PluginMngr.GetPluginCount(); - CONMSG("-Id- %-20.19s %-10.9s %-20.19s %-8.7s\n", "Name", "Version", "Author", "Status"); - for (i=g_PluginMngr._begin(); i!=g_PluginMngr._end(); i++) + if (!plnum) + { + CONMSG("No plugins loaded.\n"); + return; + } else { + CONMSG("Listing %d plugin%s:\n", plnum, (plnum > 1) ? "s" : ""); + } + + for (i = g_PluginMngr._begin(); i != g_PluginMngr._end(); i++) { pl = (*i); if (!pl) + { break; - if (pl->m_Status == Pl_Paused) - { - status = "PAUSE"; - } else if (pl->m_Status == Pl_Running) { - if (pl->m_API && pl->m_API->QueryRunning(NULL, 0)) - status = "RUN"; - else - status = "STOPPED"; - } else if (pl->m_Status == Pl_Refused) { - status = "FAIL"; - } else if (pl->m_Status == Pl_Error) { - status = "ERROR"; - } else if (pl->m_Status == Pl_NotFound) { - status = "NOFILE"; } - if (pl->m_API) + len = 0; + + if (pl->m_Status != Pl_Running) { - version = pl->m_API->GetVersion(); - author = pl->m_API->GetAuthor(); - name = pl->m_API->GetName(); + len += UTIL_Format(buffer, sizeof(buffer), " [%02d] <%s>", pl->m_Id, g_PluginMngr.GetStatusText(pl)); } else { - version = "-"; - author = "-"; - name = "-"; + len += UTIL_Format(buffer, sizeof(buffer), " [%02d]", pl->m_Id); } - if (!version) - version = "-"; - if (!author) - author = "-"; - if (!name) - name = pl->m_File.c_str(); + if ((plapi = pl->m_API)) + { + plname = IS_STR_FILLED(plapi->GetName()) ? plapi->GetName() : pl->m_File.c_str(); + len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " %s", plname); + if (IS_STR_FILLED(plapi->GetVersion())) + { + len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " (%s)", plapi->GetVersion()); + } + if (IS_STR_FILLED(plapi->GetAuthor())) + { + UTIL_Format(&buffer[len], sizeof(buffer)-len, " by %s", plapi->GetAuthor()); + } + } - CONMSG("[%02d] %-20.19s %-10.9s %-20.19s %-8.7s\n", pl->m_Id, name, version, author, status); + CONMSG("%s\n", buffer); } - //CONMSG("\n"); - return; } else if (strcmp(command, "cmds") == 0) { if (args >= 3) { int id = atoi(e->Cmd_Argv(2)); - SourceMM::CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); + CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); if (!pl) { @@ -262,7 +289,7 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG("Plugin %d is not loaded.\n", id); } else { CONMSG("Console commands for %s:\n", pl->m_API->GetName()); - SourceHook::List::iterator ci; + List::iterator ci; size_t count = 0; for (ci=pl->m_Cmds.begin(); ci!=pl->m_Cmds.end(); ci++) @@ -280,7 +307,7 @@ CON_COMMAND(meta, "Metamod:Source Menu") if (args >= 3) { int id = atoi(e->Cmd_Argv(2)); - SourceMM::CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); + CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); if (!pl) { @@ -293,7 +320,7 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG("Plugin %d is not loaded.\n", id); } else { CONMSG("Registered cvars for %s:\n", pl->m_API->GetName()); - SourceHook::List::iterator ci; + List::iterator ci; size_t count = 0; for (ci=pl->m_Cvars.begin(); ci!=pl->m_Cvars.end(); ci++) @@ -311,7 +338,7 @@ CON_COMMAND(meta, "Metamod:Source Menu") if (args >= 3) { int id = atoi(e->Cmd_Argv(2)); - SourceMM::CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); + CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); if (!pl) { CONMSG("Plugin %d not found.\n", id); @@ -420,7 +447,7 @@ CON_COMMAND(meta, "Metamod:Source Menu") char error[255]={0}; bool already; - SourceMM::CPluginManager::CPlugin *pl; + CPluginManager::CPlugin *pl; PluginId id = g_PluginMngr.Load(full_path, Pl_Console, already, error, sizeof(error)); pl = g_PluginMngr.FindById(id); @@ -467,8 +494,8 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG("Alias \"%s\" was not found.\n", alias); } } else { - SourceHook::List::iterator iter, end; - SourceMM::CNameAlias *p; + List::iterator iter, end; + CNameAlias *p; iter = g_PluginMngr._alias_begin(); end = g_PluginMngr._alias_end(); @@ -521,8 +548,8 @@ CON_COMMAND(meta, "Metamod:Source Menu") g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); } - SourceHook::List::iterator iter, end; - SourceMM::CPluginManager::CPlugin *pl; + List::iterator iter, end; + CPluginManager::CPlugin *pl; iter = g_PluginMngr._begin(); end = g_PluginMngr._end(); for (; iter!=end; iter++) @@ -703,45 +730,49 @@ void ClientCommand_handler(edict_t *client) RETURN_META(MRES_SUPERCEDE); } else if(strcmp(subcmd, "list") == 0) { - SourceMM::CPluginManager::CPlugin *pl; - Pl_Status st; + CPluginManager::CPlugin *pl; + ISmmPlugin *plapi; + const char *plname; PluginIter i; - const char *version = NULL; - const char *name = NULL; - const char *author = NULL; - const char *status = NULL; + char buffer[256]; + int len = 0; + int plnum = 0; - CLIENT_CONMSG(client, "-Id- %-20.19s %-10.9s %-20.19s %6s\n", "Name", "Version", "Author", "Status"); - - for (i=g_PluginMngr._begin(); i!=g_PluginMngr._end(); i++) + for (i = g_PluginMngr._begin(); i != g_PluginMngr._end(); i++, len=0) { pl = (*i); - if (!pl) - break; - - st = pl->m_Status; - - /* Only show plugins that are running or paused */ - if (pl->m_API && (st == Pl_Running || st == Pl_Paused)) + if (pl && pl->m_Status == Pl_Running) { - version = pl->m_API->GetVersion(); - author = pl->m_API->GetAuthor(); - name = pl->m_API->GetName(); - - if (st == Pl_Running && pl->m_API->QueryRunning(NULL, 0)) + plapi = pl->m_API; + if (!plapi || !plapi->QueryRunning(NULL, 0)) { - status = "RUN"; - } else { - status = "PAUSE"; + continue; + } + plnum++; + + len += UTIL_Format(buffer, sizeof(buffer), " [%02d]", plnum); + + plname = IS_STR_FILLED(plapi->GetName()) ? plapi->GetName() : pl->m_File.c_str(); + len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " %s", plname); + + if (IS_STR_FILLED(plapi->GetVersion())) + { + len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " (%s)", plapi->GetVersion()); + } + if (IS_STR_FILLED(plapi->GetAuthor())) + { + UTIL_Format(&buffer[len], sizeof(buffer)-len, " by %s", plapi->GetAuthor()); } - if (!version || !author || !name) - break; - - CLIENT_CONMSG(client, "[%02d] %-20.19s %-10.9s %-20.19s %6s\n", pl->m_Id, name, version, author, status); + CLIENT_CONMSG(client, "%s\n", buffer); } } + if (!plnum) + { + CLIENT_CONMSG(client, "No active plugins loaded.\n"); + } + RETURN_META(MRES_SUPERCEDE); } } diff --git a/sourcemm/concommands.h b/sourcemm/concommands.h index 56ca953..0817afb 100644 --- a/sourcemm/concommands.h +++ b/sourcemm/concommands.h @@ -29,7 +29,7 @@ public: virtual bool RegisterConCommandBase(ConCommandBase *pCommand); bool Register(ConCommandBase *pCommand); void MarkCommandsAsGameDLL(); - void Unregister(ConCommandBase *pCommand); + void Unregister(PluginId id, ConCommandBase *pCommand); void UnregisterGameDLLCommands(); }; diff --git a/sourcemm/sourcemm.cpp b/sourcemm/sourcemm.cpp index 664e527..8e08cd5 100644 --- a/sourcemm/sourcemm.cpp +++ b/sourcemm/sourcemm.cpp @@ -58,8 +58,9 @@ bool bGameInit = false; SourceHook::List gamedll_list; SourceHook::CallClass *g_GameDllPatch; int g_GameDllVersion = 0; -const char VSPIFACE_001[] = "ISERVERPLUGINCALLBACKS001"; -const char VSPIFACE_002[] = "ISERVERPLUGINCALLBACKS002"; +int g_GameClientsVersion = 0; +int g_VspVersion = 0; +const char VSPIFACE[] = "ISERVERPLUGINCALLBACKS"; const char GAMEINFO_PATH[] = "|gameinfo_path|"; void ClearGamedllList(); @@ -227,17 +228,18 @@ SMM_API void *CreateInterface(const char *iface, int *ret) return NULL; } - /* We check these separately because we can't reply - * unless our interface version really matches. - */ - if ((strcmp(iface, VSPIFACE_002) == 0) - || strcmp(iface, VSPIFACE_001) == 0) + if (strncmp(iface, VSPIFACE, 22) == 0) { - if (ret) + g_VspVersion = atoi(&(iface[22])); + + if (g_VspVersion <= MAX_VSP_VERSION) { - *ret = IFACE_OK; + if (ret) + { + *ret = IFACE_OK; + } + return &g_VspListener; } - return &g_VspListener; } if (!gParsedGameInfo) @@ -278,7 +280,6 @@ SMM_API void *CreateInterface(const char *iface, int *ret) char buffer[255]; char key[128], val[128]; - size_t len = 0; bool search = false; bool gamebin = false; char *ptr; @@ -291,9 +292,6 @@ SMM_API void *CreateInterface(const char *iface, int *ret) { buffer[0] = '\0'; fgets(buffer, sizeof(buffer), fp); - len = strlen(buffer); - if (buffer[len-1] == '\n') - buffer[--len] = '\0'; UTIL_TrimComments(buffer); UTIL_TrimLeft(buffer); UTIL_TrimRight(buffer); @@ -450,6 +448,7 @@ SMM_API void *CreateInterface(const char *iface, int *ret) { void *ptr = (g_GameDll.factory)(iface, ret); g_GameDll.pGameClients = static_cast(ptr); + g_GameClientsVersion = atoi(&iface[17]); return ptr; } diff --git a/sourcemm/sourcemm.h b/sourcemm/sourcemm.h index b61f9eb..a82fa3c 100644 --- a/sourcemm/sourcemm.h +++ b/sourcemm/sourcemm.h @@ -35,12 +35,15 @@ #define SOURCEMM_VERSION SVN_FILE_VERSION_STRING #define SOURCEMM_DATE __DATE__ #define SM_VERS_API_MAJOR 1 //increase this on a breaking change -#define SM_VERS_API_MINOR 5 //increase this on a non-breaking API change +#define SM_VERS_API_MINOR 6 //increase this on a non-breaking API change //We need a good CServerGameDLL version to work properly. We support these inclusively. #define MIN_GAMEDLL_VERSION 3 #define MAX_GAMEDLL_VERSION 8 +/* Maximum version of IServerPluginCallbacks that SourceMM supports */ +#define MAX_VSP_VERSION 2 + /** * @brief Entry point for HL2 Engine */ diff --git a/sourcemm/util.cpp b/sourcemm/util.cpp index fadcf26..3e50621 100644 --- a/sourcemm/util.cpp +++ b/sourcemm/util.cpp @@ -240,6 +240,19 @@ size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...) return len; } +size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params) +{ + size_t len = vsnprintf(buffer, maxlength, fmt, params); + + if (len >= maxlength) + { + len = maxlength - 1; + buffer[len] = '\0'; + } + + return len; +} + inline bool pathchar_isalpha(char a) { return (((a & 1<<7) == 0) && isalpha(a)); @@ -393,16 +406,3 @@ bool UTIL_Relatize(char buffer[], return true; } - -size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params) -{ - size_t len = vsnprintf(buffer, maxlength, fmt, params); - - if (len >= maxlength) - { - len = maxlength - 1; - buffer[len] = '\0'; - } - - return len; -} diff --git a/sourcemm/util.h b/sourcemm/util.h index ed053bd..d02dd40 100644 --- a/sourcemm/util.h +++ b/sourcemm/util.h @@ -18,6 +18,11 @@ * @file util.h */ +/** + * @brief Returns true is string is not blank, false otherwise. + */ +#define IS_STR_FILLED(var) (var != NULL && var[0] != '\0') + /** * @brief Returns a pointer to the extension in a file name. */ From e51368d8170991c8c68cbba36c7471aa840cc286 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 18 Sep 2007 20:40:08 +0000 Subject: [PATCH 03/25] more importing from 1.5.0 --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40424 --- modules.versions | 2 +- sourcemm/CSmmAPI.cpp | 1 + sourcemm/sourcemm.h | 6 ++++++ sourcemm/svn_version.h | 10 +++++----- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/modules.versions b/modules.versions index bd3da7d..09c1485 100644 --- a/modules.versions +++ b/modules.versions @@ -1,7 +1,7 @@ [PRODUCT] major = 1 minor = 6 -revision = 2 +revision = 0 [sourcemm] folder = sourcemm diff --git a/sourcemm/CSmmAPI.cpp b/sourcemm/CSmmAPI.cpp index 8f9d34d..0bd8dd4 100644 --- a/sourcemm/CSmmAPI.cpp +++ b/sourcemm/CSmmAPI.cpp @@ -668,6 +668,7 @@ const char *CSmmAPI::GetUserMessage(int index, int *size) return msg->name; } + int CSmmAPI::GetVSPVersion() { return g_VspVersion; diff --git a/sourcemm/sourcemm.h b/sourcemm/sourcemm.h index a82fa3c..33b0c40 100644 --- a/sourcemm/sourcemm.h +++ b/sourcemm/sourcemm.h @@ -117,6 +117,12 @@ extern PluginId g_PLID; /** @brief ServerGameDLL version that is currently loaded */ extern int g_GameDllVersion; +/** @brief Highest IServerPluginCallbacks version that is supported by engine */ +extern int g_VspVersion; + +/** @brief IServerGameClients version the mod uses */ +extern int g_GameClientsVersion; + extern bool bGameInit; /** @brief Global CallClass for IServerGameDLL */ diff --git a/sourcemm/svn_version.h b/sourcemm/svn_version.h index faeca49..2d7e2fa 100644 --- a/sourcemm/svn_version.h +++ b/sourcemm/svn_version.h @@ -3,11 +3,11 @@ #ifndef _INCLUDE_SVN_VERSION_H_ #define _INCLUDE_SVN_VERSION_H_ -#define SVN_PRODUCT_VERSION "1.4.2" +#define SVN_PRODUCT_VERSION "1.6.0" -#define SVN_REVISION 414 -#define SVN_REVISION_STRING "414" -#define SVN_FILE_VERSION 1,4,2,414 -#define SVN_FILE_VERSION_STRING "1.4.2.414" +#define SVN_REVISION 423 +#define SVN_REVISION_STRING "423" +#define SVN_FILE_VERSION 1,6,0,423 +#define SVN_FILE_VERSION_STRING "1.6.0.423" #endif //_INCLUDE_SVN_VERSION_H_ From 569b32802455334a5b17a9a72ed0687001ff3895 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 21 Sep 2007 16:54:52 +0000 Subject: [PATCH 04/25] removed msvc7 support --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40425 --- sourcemm/msvc7/sourcemm.sln | 21 -- sourcemm/msvc7/sourcemm.vcproj | 258 ---------------------- sourcemm/sample_mm/msvc7/sample_mm.sln | 21 -- sourcemm/sample_mm/msvc7/sample_mm.vcproj | 149 ------------- sourcemm/stub_mm/msvc7/stub_mm.sln | 21 -- sourcemm/stub_mm/msvc7/stub_mm.vcproj | 142 ------------ 6 files changed, 612 deletions(-) delete mode 100644 sourcemm/msvc7/sourcemm.sln delete mode 100644 sourcemm/msvc7/sourcemm.vcproj delete mode 100644 sourcemm/sample_mm/msvc7/sample_mm.sln delete mode 100644 sourcemm/sample_mm/msvc7/sample_mm.vcproj delete mode 100644 sourcemm/stub_mm/msvc7/stub_mm.sln delete mode 100644 sourcemm/stub_mm/msvc7/stub_mm.vcproj diff --git a/sourcemm/msvc7/sourcemm.sln b/sourcemm/msvc7/sourcemm.sln deleted file mode 100644 index fa8eb75..0000000 --- a/sourcemm/msvc7/sourcemm.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug.ActiveCfg = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug.Build.0 = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release.ActiveCfg = Release|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/sourcemm/msvc7/sourcemm.vcproj b/sourcemm/msvc7/sourcemm.vcproj deleted file mode 100644 index 556c859..0000000 --- a/sourcemm/msvc7/sourcemm.vcproj +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/sample_mm/msvc7/sample_mm.sln b/sourcemm/sample_mm/msvc7/sample_mm.sln deleted file mode 100644 index b885d6b..0000000 --- a/sourcemm/sample_mm/msvc7/sample_mm.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_mm", "sample_mm.vcproj", "{FAFF34FB-FE14-47B5-81BD-70D237392FB2}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug.ActiveCfg = Debug|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug.Build.0 = Debug|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release.ActiveCfg = Release|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/sourcemm/sample_mm/msvc7/sample_mm.vcproj b/sourcemm/sample_mm/msvc7/sample_mm.vcproj deleted file mode 100644 index 57c68a7..0000000 --- a/sourcemm/sample_mm/msvc7/sample_mm.vcproj +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/stub_mm/msvc7/stub_mm.sln b/sourcemm/stub_mm/msvc7/stub_mm.sln deleted file mode 100644 index 0567903..0000000 --- a/sourcemm/stub_mm/msvc7/stub_mm.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stub_mm", "stub_mm.vcproj", "{836E726E-AB80-43AB-9A8F-0E6EE680B0F6}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug.ActiveCfg = Debug|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug.Build.0 = Debug|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release.ActiveCfg = Release|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/sourcemm/stub_mm/msvc7/stub_mm.vcproj b/sourcemm/stub_mm/msvc7/stub_mm.vcproj deleted file mode 100644 index aaed89b..0000000 --- a/sourcemm/stub_mm/msvc7/stub_mm.vcproj +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From cf6dbdb1fe64283c639872f9899167231242906d Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 21 Sep 2007 18:03:57 +0000 Subject: [PATCH 05/25] - added an api call for finding source engine build - random markup/doc changes --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40426 --- sourcemm/CSmmAPI.cpp | 5 ++ sourcemm/CSmmAPI.h | 116 +++++++++++++++++++++--------------------- sourcemm/ISmmAPI.h | 73 ++++++++++++++++++-------- sourcemm/ISmmPlugin.h | 64 ++++++++++++++--------- sourcemm/sourcemm.cpp | 28 ++++------ sourcemm/sourcemm.h | 18 +++---- 6 files changed, 175 insertions(+), 129 deletions(-) diff --git a/sourcemm/CSmmAPI.cpp b/sourcemm/CSmmAPI.cpp index 0bd8dd4..459e585 100644 --- a/sourcemm/CSmmAPI.cpp +++ b/sourcemm/CSmmAPI.cpp @@ -673,3 +673,8 @@ int CSmmAPI::GetVSPVersion() { return g_VspVersion; } + +int CSmmAPI::GetSourceEngineBuild() +{ + return g_SourceEngineVersion; +} diff --git a/sourcemm/CSmmAPI.h b/sourcemm/CSmmAPI.h index 546b77b..98f9563 100644 --- a/sourcemm/CSmmAPI.h +++ b/sourcemm/CSmmAPI.h @@ -29,69 +29,67 @@ typedef CUtlDict UserMsgDict; typedef void (*CONPRINTF_FUNC)(const char *, ...); -namespace SourceMM +class CSmmAPI : public ISmmAPI { - class CSmmAPI : public ISmmAPI +public: + CSmmAPI(); + ~CSmmAPI(); +public: + void LogMsg(ISmmPlugin *pl, const char *msg, ...); +public: + CreateInterfaceFn engineFactory(bool syn=true); + CreateInterfaceFn physicsFactory(bool syn=true); + CreateInterfaceFn fileSystemFactory(bool syn=true); + CreateInterfaceFn serverFactory(bool syn=true); + CGlobalVars *pGlobals(); + void SetLastMetaReturn(META_RES res); + META_RES GetLastMetaReturn(); + IConCommandBaseAccessor *GetCvarBaseAccessor(); + bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); + void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); + void ConPrint(const char *fmt); + void ConPrintf(const char *fmt, ...); + bool RemotePrintingAvailable() { - public: - CSmmAPI(); - ~CSmmAPI(); - public: - void LogMsg(ISmmPlugin *pl, const char *msg, ...); - public: - CreateInterfaceFn engineFactory(bool syn=true); - CreateInterfaceFn physicsFactory(bool syn=true); - CreateInterfaceFn fileSystemFactory(bool syn=true); - CreateInterfaceFn serverFactory(bool syn=true); - CGlobalVars *pGlobals(); - void SetLastMetaReturn(META_RES res); - META_RES GetLastMetaReturn(); - IConCommandBaseAccessor *GetCvarBaseAccessor(); - bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); - void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); - void ConPrint(const char *fmt); - void ConPrintf(const char *fmt, ...); - bool RemotePrintingAvailable() - { - return CmdCacheSuccessful(); - } - virtual void GetApiVersions(int &major, int &minor, int &plvers, int &plmin); - virtual void GetShVersions(int &shvers, int &shimpl); - virtual void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener); - virtual void *MetaFactory(const char *iface, int *ret, PluginId *id); - virtual int FormatIface(char buffer[], unsigned int maxlength); - virtual void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret); - virtual const char *GetBaseDir(); - virtual void PathFormat(char *buffer, size_t len, const char *fmt, ...); - void ClientConPrintf(edict_t *client, const char *fmt, ...); - void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1); - void EnableVSPListener(); - int GetGameDLLVersion(); - int GetUserMessageCount(); - int FindUserMessage(const char *name, int *size=NULL); - const char *GetUserMessage(int index, int *size=NULL); - int GetVSPVersion(); - public: - bool CacheCmds(); - bool CmdCacheSuccessful(); - void LoadAsVSP(); - bool VSPEnabled() - { - return m_VSP; - } - bool CacheUserMessages(); - bool MsgCacheSuccessful(); - private: - META_RES m_Res; - CONPRINTF_FUNC m_ConPrintf; - bool m_CmdCache; - bool m_VSP; - int m_MsgCount; - UserMsgDict m_UserMessages; - }; + return CmdCacheSuccessful(); + } + virtual void GetApiVersions(int &major, int &minor, int &plvers, int &plmin); + virtual void GetShVersions(int &shvers, int &shimpl); + virtual void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener); + virtual void *MetaFactory(const char *iface, int *ret, PluginId *id); + virtual int FormatIface(char buffer[], unsigned int maxlength); + virtual void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret); + virtual const char *GetBaseDir(); + virtual void PathFormat(char *buffer, size_t len, const char *fmt, ...); + void ClientConPrintf(edict_t *client, const char *fmt, ...); + void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1); + void EnableVSPListener(); + int GetGameDLLVersion(); + int GetUserMessageCount(); + int FindUserMessage(const char *name, int *size=NULL); + const char *GetUserMessage(int index, int *size=NULL); + int GetVSPVersion(); + int GetSourceEngineBuild(); +public: + bool CacheCmds(); + bool CmdCacheSuccessful(); + void LoadAsVSP(); + bool VSPEnabled() + { + return m_VSP; + } + bool CacheUserMessages(); + bool MsgCacheSuccessful(); +private: + META_RES m_Res; + CONPRINTF_FUNC m_ConPrintf; + bool m_CmdCache; + bool m_VSP; + int m_MsgCount; + UserMsgDict m_UserMessages; }; -extern SourceMM::CSmmAPI g_SmmAPI; +extern CSmmAPI g_SmmAPI; #define CONMSG g_SmmAPI.ConPrintf #define CLIENT_CONMSG g_SmmAPI.ClientConPrintf diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h index d37e543..e6f7c70 100644 --- a/sourcemm/ISmmAPI.h +++ b/sourcemm/ISmmAPI.h @@ -33,7 +33,11 @@ class ISmmPlugin; #define MMIFACE_SOURCEHOOK "ISourceHook" /**< ISourceHook Pointer */ #define MMIFACE_PLMANAGER "IPluginManager" /**< SourceMM Plugin Functions */ -#define IFACE_MAXNUM 999 +#define IFACE_MAXNUM 999 /**< Maximum interface version */ + +#define SOURCE_ENGINE_ORIGINAL 0 /**< Original Source Engine (used by The Ship) */ +#define SOURCE_ENGINE_EPISODEONE 1 /**< Episode 1 Source Engine (second major SDK) */ +#define SOURCE_ENGINE_ORANGEBOX 2 /**< Orange Box Source Engine (third major SDK) */ class ISmmAPI { @@ -119,7 +123,7 @@ public: // Added in 1.00-RC2 (0:0) * * @param plugin Parent plugin API pointer. * @param pCommand ConCommandBase to register. - * @return True if successful, false otherwise. Does not return false yet. + * @return True if successful, false otherwise. */ virtual bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) =0; @@ -133,6 +137,7 @@ public: // Added in 1.00-RC2 (0:0) /** * @brief Prints an unformatted string to the remote server console. + * * Note: Newlines are not added automatically. * * @param str Message string. @@ -141,6 +146,7 @@ public: // Added in 1.00-RC2 (0:0) /** * @brief Prints a formatted message to the remote server console. + * * Note: Newlines are not added automatically. * * @param fmt Formatted message. @@ -207,7 +213,7 @@ public: // Added in 1.1.2 (1:1) public: // Added in 1.2 (1:2) /** - * @brief Searches for an interface for you. + * @brief Searches for an interface, eliminating the need to loop through FormatIface(). * * @param fn InterfaceFactory function. * @param iface Interface string name. @@ -219,15 +225,17 @@ public: // Added in 1.2 (1:2) /** * @brief Returns the base directory of the game/server, equivalent to - * IVEngineServer::GetGameDir(), except the path is absolute. + * IVEngineServer::GetGameDir(), except the path is absolute. * * @return Static pointer to game's absolute basedir. */ virtual const char *GetBaseDir() =0; /** - * @brief Formats a file path to the local OS. Does not include any base directories. - * Note that all slashes and black slashes are reverted to the local OS's expectancy. + * @brief Formats a file path to the local OS. + * + * Does not include any base directories. Note that all slashes and black + * slashes are reverted to the local OS's expectancy. * * @param buffer Destination buffer to store path. * @param len Maximum length of buffer, including null terminator. @@ -237,8 +245,8 @@ public: // Added in 1.2 (1:2) public: // Added in 1.2.2 (1:3) /** - * @brief Prints text in the specified client's console. Same as IVEngineServer::ClientPrintf - * except that it allows for string formatting. + * @brief Prints text in the specified client's console. Same as + * IVEngineServer::ClientPrintf except that it allows for string formatting. * * @param client Client edict pointer. * @param fmt Formatted string to print to the client. @@ -253,11 +261,13 @@ public: // Added in 1.3 (1:4) * * @param fn Interface factory function. * @param iface Interface string. - * @param min Minimum value to search from. If zero, searching begins from the - * first available version regardless of the interface. - * Note that this can return interfaces EARLIER than the version specified. - * A value of -1 (default) specifies the string version as the minimum. - * Any other value specifices the minimum value to search from. + * @param min Minimum value to search from. If zero, searching + * begins from the first available version regardless + * of the interface. Note that this can return + * interfaces EARLIER than the version specified. A + * value of -1 (default) specifies the string version + * as the minimum. Any other value specifices the + * minimum value to search from. * @return Interface pointer, or NULL if not found. */ virtual void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1) =0; @@ -266,14 +276,19 @@ public: // Added in 1.4 (1:5) /** * @brief Tells SourceMM to add VSP hooking capability to plugins. * - * Since this potentially uses more resources than it would otherwise, plugins have to - * explicitly enable the feature. Whether requested or not, if it is enabled, all plugins - * will get a pointer to the VSP listener through IMetamodListener. + * Since this potentially uses more resources than it would otherwise, + * plugins have to explicitly enable the feature. Whether requested or + * not, if it is enabled, all plugins will get a pointer to the VSP + * listener through IMetamodListener. This will not be called more than + * once for a given plugin; if it is requested more than once, each + * successive call will only give the pointer to plugins which have not + * yet received it. */ virtual void EnableVSPListener() =0; /** - * @brief Returns the interface version of the GameDLL's IServerGameDLL implementation. + * @brief Returns the interface version of the GameDLL's IServerGameDLL + * implementation. * * @return Interface version of the loaded IServerGameDLL. */ @@ -282,7 +297,8 @@ public: // Added in 1.4 (1:5) /** * @brief Returns the number of user messages in the GameDLL. * - * @return Number of user messages, or -1 if SourceMM has failed to get user message list. + * @return Number of user messages, or -1 if SourceMM has + * failed to get user message list. */ virtual int GetUserMessageCount() =0; @@ -303,15 +319,29 @@ public: // Added in 1.4 (1:5) * @return Message name, or NULL on failure. */ virtual const char *GetUserMessage(int index, int *size=NULL) =0; + public: // Added in 1.5.0 (1:6) /** - * @brief Returns the highest interface version of IServerPluginCallbacks that the engine supports. - * This is useful for games that run on older versions of the Source engine, such as The Ship. + * @brief Returns the highest interface version of IServerPluginCallbacks + * that the engine supports. This is useful for games that run on older + * versions of the Source engine, such as The Ship. * * @return Highest interface version of IServerPluginCallbacks. - * Returns 0 if SourceMM's VSP listener isn't currently enabled. + * Returns 0 if SourceMM's VSP listener isn't currently + * enabled. */ virtual int GetVSPVersion() =0; + +public: // Added in 1.6.0 (1:7) + /** + * @brief Returns the engine interface that MM:S is using as a backend. + * + * The values will be one of the SOURCE_ENGINE_* constants from the top + * of this file. + * + * @return A SOURCE_ENGINE_* constant value. + */ + virtual int GetSourceEngineBuild() =0; }; @@ -325,6 +355,7 @@ public: // Added in 1.5.0 (1:6) * 1.3 Added new interface search API. * 1.4 Added VSP listener and user message API. * 1.5.0 Added API for getting highest supported version of IServerPluginCallbacks. + * 1.6.0 Added API for Orange Box. */ #endif //_INCLUDE_ISMM_API_H diff --git a/sourcemm/ISmmPlugin.h b/sourcemm/ISmmPlugin.h index 7b2ea3a..f795e0b 100644 --- a/sourcemm/ISmmPlugin.h +++ b/sourcemm/ISmmPlugin.h @@ -33,6 +33,7 @@ public: public: /** * @brief Called on plugin load. + * * NOTE - As of API 7, this is called as DLLInit() executes - after the parameters are known, but before * the original GameDLL function is called. Therefore, you cannot hook it, but you don't need to - * Load() is basically your hook. @@ -40,22 +41,24 @@ public: * However, take care to note that if your plugin is unloaded, and the gamedll/engine have cached * an interface you've passed, something will definitely crash. Be careful. * - * @param id Internal id of plugin. Saved globally by PLUGIN_SAVEVARS() - * @param ismm External API for SourceMM. Saved globally by PLUGIN_SAVEVARS() - * @param list Contains a list of factories. Hook a factory call by setting one equal to your own function. - * @param late Set to true if your plugin was loaded late (not at server load). - * @param error Error message buffer - * @param maxlen Size of error message buffer - * @return True if successful, return false to reject the load. + * @param id Internal id of plugin. Saved globally by PLUGIN_SAVEVARS() + * @param ismm External API for SourceMM. Saved globally by PLUGIN_SAVEVARS() + * @param list Contains a list of factories. Hook a factory call by setting one equal to your own function. + * @param late Set to true if your plugin was loaded late (not at server load). + * @param error Error message buffer + * @param maxlen Size of error message buffer + * @return True if successful, return false to reject the load. */ virtual bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlength, bool late) =0; /** - * @brief Called when your plugin is "queried". This is useful for rejecting a loaded - * state. For example, if your plugin wants to stop operating, it can simply return - * false and copy an error message. This will notify other plugins or MM:S of something - * bad that happened. NOTE - MM:S will not cache the return state, so if you return false, - * your plugin will not actually be paused or unloaded. This callback will be called when: + * @brief Called when your plugin is "queried". + * + * This is useful for rejecting a loaded state. For example, if your plugin wants + * to stop operating, it can simply return false and copy an error message. This + * will notify other plugins or MM:S of something bad that happened. NOTE - MM:S + * will not cache the return state, so if you return false, your plugin will not + * actually be paused or unloaded. This callback will be called when: * - Another plugin requests it * - Someone types "meta list", it will show up as "REFUSED" * - When Metamod need to re-check the plugin's status @@ -132,10 +135,11 @@ public: virtual const char *GetLogTag() =0; public: /** - * @brief Called when all plugins have been loaded - API version 4 + * @brief Called when all plugins have been loaded. * - * This is useful for knowing when it's safe to request things another plugin might have. - * NOTE for API 7 - This is called after DLLInit(). + * This is called after DLLInit(), and thus the mod has been mostly initialized. + * It is also safe to assume that all other (automatically loaded) plugins are now + * ready to start interacting, because they are all loaded. */ virtual void AllPluginsLoaded() { @@ -148,35 +152,45 @@ public: class IMetamodListener { public: - virtual ~IMetamodListener() { } + virtual ~IMetamodListener() + { + } public: /** * @brief Called when a plugin is loaded. * * @param id Id of the plugin. */ - virtual void OnPluginLoad(PluginId id) { } + virtual void OnPluginLoad(PluginId id) + { + } /** * @brief Called when a plugin is unloaded. * * @param id Id of the plugin. */ - virtual void OnPluginUnload(PluginId id) { } + virtual void OnPluginUnload(PluginId id) + { + } /** * @brief Called when a plugin is paused. * * @param id Id of the plugin. */ - virtual void OnPluginPause(PluginId id) { } + virtual void OnPluginPause(PluginId id) + { + } /** * @brief Called when a plugin is unpaused. * * @param id Id of the plugin. */ - virtual void OnPluginUnpause(PluginId id) { } + virtual void OnPluginUnpause(PluginId id) + { + } /** * @brief Called when the level is loaded (after GameInit, before ServerActivate). @@ -195,7 +209,9 @@ public: /** * @brief Called when the level is shut down. May be called more than once. */ - virtual void OnLevelShutdown() { } + virtual void OnLevelShutdown() + { + } /** * @brief Called when engineFactory() is used through Metamod:Source's wrapper. @@ -308,7 +324,8 @@ public: * This callback is provided to all plugins regardless of which (or how many) * called EnableVSPListener(), but only if at least one did in fact enable it. * - * This callback is only available for plugins using API v1:5 (SourceMM 1.4+). + * This callback is only available for plugins using API v1:5 (Metamod:Source 1.4+). + * If a plugin loads lately, it may still call EnableVSPListener(). * * @param iface Interface pointer. If NULL, then the VSP listening construct * failed to initialize and is not available. @@ -317,7 +334,8 @@ public: { } - /* @brief Called when Metamod:Source is about to remove a concommand or convar. + /** + * @brief Called when Metamod:Source is about to remove a concommand or convar. * This can also be called if ISmmAPI::UnregisterConCmdBase is used by a plugin. * * @param id Id of the plugin that created the concommand or convar. diff --git a/sourcemm/sourcemm.cpp b/sourcemm/sourcemm.cpp index 8e08cd5..477ef17 100644 --- a/sourcemm/sourcemm.cpp +++ b/sourcemm/sourcemm.cpp @@ -60,6 +60,7 @@ SourceHook::CallClass *g_GameDllPatch; int g_GameDllVersion = 0; int g_GameClientsVersion = 0; int g_VspVersion = 0; +int g_SourceEngineVersion = SOURCE_ENGINE_ORIGINAL; const char VSPIFACE[] = "ISERVERPLUGINCALLBACKS"; const char GAMEINFO_PATH[] = "|gameinfo_path|"; @@ -218,7 +219,7 @@ SMM_API void *CreateInterface(const char *iface, int *ret) /* Prevent loading of self as a SourceMM plugin or Valve server plugin :x */ if (strcmp(iface, PLAPI_NAME) == 0) { - Warning("Do not try loading Metamod:Source as a SourceMM or Valve server plugin.\n"); + Warning("Do not try loading Metamod:Source as a plugin.\n"); if (ret) { @@ -388,16 +389,18 @@ SMM_API void *CreateInterface(const char *iface, int *ret) { /* This is the interface we want! Right now we support versions 3 through 8 */ g_GameDllVersion = atoi(&(iface[len])); - int sizeTooBig = 0; //rename this to sizeWrong in the future! - if (g_GameDllVersion < MIN_GAMEDLL_VERSION || g_GameDllVersion > MAX_GAMEDLL_VERSION) + if (g_GameDllVersion < MIN_GAMEDLL_VERSION) { - /* Maybe this will get used in the future */ - sizeTooBig = g_GameDllVersion; if (ret) { *ret = IFACE_FAILED; } } + else if (g_GameDllVersion > 3) + { + /* The engine is at least episode 1 */ + g_SourceEngineVersion = SOURCE_ENGINE_EPISODEONE; + } SourceHook::List::iterator iter; GameDllInfo *pInfo = NULL; void *ptr; @@ -418,21 +421,12 @@ SMM_API void *CreateInterface(const char *iface, int *ret) } if (g_GameDll.loaded) { - if (sizeTooBig) - { - Error("This mod version requires a SourceMM update (ServerGameDLL%03d)!\n", sizeTooBig); - if (ret) - { - *ret = IFACE_FAILED; - } - return NULL; - } else { - InitMainStates(); - } + InitMainStates(); } else { - sizeTooBig = 0; if (ret) + { *ret = IFACE_FAILED; + } return NULL; } } else { diff --git a/sourcemm/sourcemm.h b/sourcemm/sourcemm.h index 33b0c40..24bf5fd 100644 --- a/sourcemm/sourcemm.h +++ b/sourcemm/sourcemm.h @@ -32,21 +32,18 @@ * increase api_major when API breaks * increase api_minor when new functions are added (non-breaking) */ -#define SOURCEMM_VERSION SVN_FILE_VERSION_STRING -#define SOURCEMM_DATE __DATE__ -#define SM_VERS_API_MAJOR 1 //increase this on a breaking change -#define SM_VERS_API_MINOR 6 //increase this on a non-breaking API change +#define SOURCEMM_VERSION SVN_FILE_VERSION_STRING +#define SOURCEMM_DATE __DATE__ +#define SM_VERS_API_MAJOR 1 //increase this on a breaking change +#define SM_VERS_API_MINOR 7 //increase this on a non-breaking API change -//We need a good CServerGameDLL version to work properly. We support these inclusively. +/* We need a good CServerGameDLL version to work properly. We support these inclusively. */ #define MIN_GAMEDLL_VERSION 3 -#define MAX_GAMEDLL_VERSION 8 /* Maximum version of IServerPluginCallbacks that SourceMM supports */ #define MAX_VSP_VERSION 2 -/** - * @brief Entry point for HL2 Engine - */ +/** @brief Entry point for HL2 Engine */ SMM_API void *CreateInterface(const char *name, int *code); /** @brief Wrapper to catch GameDLL calls */ @@ -123,6 +120,9 @@ extern int g_VspVersion; /** @brief IServerGameClients version the mod uses */ extern int g_GameClientsVersion; +/** @brief Source Engine version */ +extern int g_SourceEngineVersion; + extern bool bGameInit; /** @brief Global CallClass for IServerGameDLL */ From c52389ea227b8071c3be795a72f89fa776063951 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 22 Sep 2007 18:08:30 +0000 Subject: [PATCH 06/25] nearly complete rewrite of Metamod:Source, API is the same but internally all engine/game functionality is abstracted. i also renamed files to make everything look a bit more conformant --HG-- branch : sourcemm-1.6.0 rename : sourcemm/sourcemm.cpp => sourcemm/metamod.cpp rename : sourcemm/sourcemm.h => sourcemm/metamod.h extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40427 --- sourcemm/CPlugin.cpp | 649 --------- sourcemm/CSmmAPI.cpp | 680 ---------- sourcemm/CSmmAPI.h | 97 -- sourcemm/ISmmAPI.h | 7 +- sourcemm/concommands.h | 53 - sourcemm/convar_smm.h | 523 -------- sourcemm/metamod.cpp | 1182 +++++++++++++++++ sourcemm/metamod.h | 88 ++ .../{concommands.cpp => metamod_console.cpp} | 545 ++++---- sourcemm/metamod_console.h | 19 + sourcemm/{CPlugin.h => metamod_plugins.h} | 5 +- sourcemm/{util.cpp => metamod_util.cpp} | 2 +- sourcemm/{util.h => metamod_util.h} | 0 sourcemm/msvc8/sourcemm.vcproj | 62 +- sourcemm/oslink.cpp | 21 + sourcemm/sample_mm/LICENSE.txt | 29 - sourcemm/sample_mm/Makefile | 67 - sourcemm/sample_mm/SamplePlugin.cpp | 237 ---- sourcemm/sample_mm/SamplePlugin.h | 132 -- sourcemm/sample_mm/cvars.cpp | 27 - sourcemm/sample_mm/cvars.h | 24 - sourcemm/sample_mm/msvc8/sample_mm.sln | 20 - sourcemm/sample_mm/msvc8/sample_mm.vcproj | 222 ---- sourcemm/sourcemm.cpp | 710 ---------- sourcemm/sourcemm.h | 131 -- sourcemm/stub_mm/LICENSE.txt | 29 - sourcemm/stub_mm/Makefile | 66 - sourcemm/stub_mm/msvc8/stub_mm.sln | 20 - sourcemm/stub_mm/msvc8/stub_mm.vcproj | 214 --- sourcemm/stub_mm/stub_mm.cpp | 105 -- sourcemm/stub_mm/stub_mm.h | 45 - sourcemm/vsp_listener.cpp | 152 --- sourcemm/vsp_listener.h | 49 - 33 files changed, 1569 insertions(+), 4643 deletions(-) delete mode 100644 sourcemm/CPlugin.cpp delete mode 100644 sourcemm/CSmmAPI.cpp delete mode 100644 sourcemm/CSmmAPI.h delete mode 100644 sourcemm/concommands.h delete mode 100644 sourcemm/convar_smm.h create mode 100644 sourcemm/metamod.cpp create mode 100644 sourcemm/metamod.h rename sourcemm/{concommands.cpp => metamod_console.cpp} (60%) create mode 100644 sourcemm/metamod_console.h rename sourcemm/{CPlugin.h => metamod_plugins.h} (98%) rename sourcemm/{util.cpp => metamod_util.cpp} (99%) rename sourcemm/{util.h => metamod_util.h} (100%) delete mode 100644 sourcemm/sample_mm/LICENSE.txt delete mode 100644 sourcemm/sample_mm/Makefile delete mode 100644 sourcemm/sample_mm/SamplePlugin.cpp delete mode 100644 sourcemm/sample_mm/SamplePlugin.h delete mode 100644 sourcemm/sample_mm/cvars.cpp delete mode 100644 sourcemm/sample_mm/cvars.h delete mode 100644 sourcemm/sample_mm/msvc8/sample_mm.sln delete mode 100644 sourcemm/sample_mm/msvc8/sample_mm.vcproj delete mode 100644 sourcemm/sourcemm.cpp delete mode 100644 sourcemm/sourcemm.h delete mode 100644 sourcemm/stub_mm/LICENSE.txt delete mode 100644 sourcemm/stub_mm/Makefile delete mode 100644 sourcemm/stub_mm/msvc8/stub_mm.sln delete mode 100644 sourcemm/stub_mm/msvc8/stub_mm.vcproj delete mode 100644 sourcemm/stub_mm/stub_mm.cpp delete mode 100644 sourcemm/stub_mm/stub_mm.h delete mode 100644 sourcemm/vsp_listener.cpp delete mode 100644 sourcemm/vsp_listener.h diff --git a/sourcemm/CPlugin.cpp b/sourcemm/CPlugin.cpp deleted file mode 100644 index bb61d3c..0000000 --- a/sourcemm/CPlugin.cpp +++ /dev/null @@ -1,649 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include "CPlugin.h" -#include "CSmmAPI.h" -#include "sourcemm.h" -#include "concommands.h" - -/** - * @brief Implements functions from CPlugin.h - * @file CPlugin.cpp - */ - -using namespace SourceMM; - -#define ITER_PLEVENT(evn, plid) \ - CPluginManager::CPlugin *_Xpl; \ - SourceHook::List::iterator event; \ - IMetamodListener *api; \ - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ - _Xpl = (*iter); \ - if (_Xpl->m_Id == plid) \ - continue; \ - for (event=_Xpl->m_Events.begin(); event!=_Xpl->m_Events.end(); event++) { \ - api = (*event); \ - api->evn(plid); \ - } \ - } - -CPluginManager g_PluginMngr; - -CPluginManager::CPluginManager() -{ - m_LastId = Pl_MinId; - m_AllLoaded = false; -} - -CPluginManager::~CPluginManager() -{ - SourceHook::List::iterator iter; - - for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++) - { - delete (*iter); - } - - m_Aliases.clear(); -} - -const char *CPluginManager::LookupAlias(const char *alias) -{ - SourceHook::List::iterator iter; - CNameAlias *p; - - for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++) - { - p = (*iter); - if (p->alias.compare(alias) == 0) - { - return p->value.c_str(); - } - } - - return NULL; -} - -SourceHook::List::iterator CPluginManager::_alias_begin() -{ - return m_Aliases.begin(); -} - -SourceHook::List::iterator CPluginManager::_alias_end() -{ - return m_Aliases.end(); -} - -void CPluginManager::SetAlias(const char *alias, const char *value) -{ - SourceHook::List::iterator iter; - CNameAlias *p; - - for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++) - { - p = (*iter); - if (p->alias.compare(alias) == 0) - { - if (value[0] == '\0') - { - iter = m_Aliases.erase(iter); - return; - } else { - p->value.assign(value); - return; - } - } - } - - if (value[0] != '\0') - { - p = new CNameAlias; - - p->alias.assign(alias); - p->value.assign(value); - - m_Aliases.push_back(p); - } -} - -CPluginManager::CPlugin::CPlugin() : m_Id(0), m_Source(0), m_API(NULL), m_Lib(NULL) -{ - -} - -PluginId CPluginManager::Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen) -{ - already = false; - //Check if we're about to reload an old plugin - PluginIter i = m_Plugins.begin(); - while (i != m_Plugins.end()) - { - if ( (*i) && UTIL_PathCmp(file, (*i)->m_File.c_str()) ) - { - if ( (*i)->m_Status < Pl_Paused ) - { - //Attempt to load the plugin again - already = true; - i = m_Plugins.erase(i); - continue; - } else { - //No need to load it - already = true; - return (*i)->m_Id; - } - } - i++; - } - - CPlugin *pl = _Load(file, source, error, maxlen); - - if (!pl) - return Pl_BadLoad; - - ITER_PLEVENT(OnPluginLoad, pl->m_Id); - - return pl->m_Id; -} - -CPluginManager::CPlugin *CPluginManager::FindById(PluginId id) -{ - PluginIter i; - - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_Id == id ) - return (*i); - } - - return NULL; -} - -void CPluginManager::SetAllLoaded() -{ - m_AllLoaded = true; - PluginIter i; - - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i) && (*i)->m_Status == Pl_Running && (*i)->m_API ) - { - //API 4 is when we added this callback - //Min version is now 5, so we ignore this check - //if ( (*i)->m_API->GetApiVersion() >= 004 ) - (*i)->m_API->AllPluginsLoaded(); - } - } -} - -bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - UTIL_Format(error, maxlen, "Plugin id not found"); - return false; - } - - bool ret; - - if ( (ret=_Pause(pl, error, maxlen)) == true ) - { - ITER_PLEVENT(OnPluginPause, pl->m_Id); - } - - return ret; -} - -bool CPluginManager::Unpause(PluginId id, char *error, size_t maxlen) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - UTIL_Format(error, maxlen, "Plugin id not found"); - return false; - } - - bool ret; - - if ( (ret=_Unpause(pl, error, maxlen)) == true ) - { - ITER_PLEVENT(OnPluginUnpause, pl->m_Id); - } - - return ret; -} - -bool CPluginManager::Unload(PluginId id, bool force, char *error, size_t maxlen) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - UTIL_Format(error, maxlen, "Plugin %d not found", id); - return false; - } - - bool ret; - PluginId old_id = pl->m_Id; - if ( (ret=_Unload(pl, force, error, maxlen)) == true ) - { - ITER_PLEVENT(OnPluginUnload, old_id); - } - - return ret; -} - -bool CPluginManager::Retry(PluginId id, char *error, size_t len) -{ - PluginIter i; - char buffer[64]; - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i) && (*i)->m_Id == id ) - { - if ( (*i)->m_Status >= Pl_Paused) - { - UTIL_Format(error, len, "Plugin %d is already running.", id); - return false; - } - CPlugin *pl = _Load((*i)->m_File.c_str(), Pl_Console, error, len); - if (!pl) - return false; - if (pl->m_Status >= Pl_Paused) - { - //Now it gets crazy... unload the original copy. - _Unload( (*i), true, buffer, sizeof(buffer)-1 ); - - //Set the new copy's id - pl->m_Id = id; - - //We just wasted an id... reclaim it - m_LastId--; - - return true; - } else { - //don't really care about the buffer here - _Unload(pl, true, buffer, sizeof(buffer)-1); - - //We just wasted an id... reclaim it - m_LastId--; - return false; - } - } - } - - UTIL_Format(error, len, "Plugin %d not found,", id); - return false; -} - -CPluginManager::CPlugin *CPluginManager::FindByAPI(ISmmPlugin *api) -{ - PluginIter i; - - //don't find bad plugins! - if (!api) - return NULL; - - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_API == api ) - return (*i); - } - - return NULL; -} - -int CPluginManager::GetPluginCount() -{ - return (int)m_Plugins.size(); -} - -const char *CPluginManager::GetStatusText(CPlugin *pl) -{ - switch (pl->m_Status) - { - case Pl_NotFound: - return "NOFILE"; - case Pl_Error: - return "ERROR"; - case Pl_Refused: - return "FAILED"; - case Pl_Paused: - return "PAUSED"; - case Pl_Running: - { - if (pl->m_API && pl->m_API->QueryRunning(NULL, 0)) - { - return "STOPPED"; - } else { - return "RUNNING"; - } - } - default: - return "-"; - } -} - -CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source, char *error, size_t maxlen) -{ - FILE *fp; - CPlugin *pl; - - pl = new CPlugin(); - *error = '\0'; - - //Add plugin to list - pl->m_Id = m_LastId; - pl->m_File.assign(file); - m_Plugins.push_back(pl); - m_LastId++; - - //Check if the file even exists - fp = fopen(file, "r"); - if (!fp) - { - if (error) - UTIL_Format(error, maxlen, "File not found: %s", file); - pl->m_Status = Pl_NotFound; - } - - if (fp) - { - fclose(fp); - fp = NULL; - - //Load the file - pl->m_Lib = dlmount(file); - if (!pl->m_Lib) - { - if (error) - UTIL_Format(error, maxlen, "%s", dlerror()); - pl->m_Status = Pl_Error; - } else { - CreateInterfaceFn pfn = (CreateInterfaceFn)(dlsym(pl->m_Lib, PL_EXPOSURE_C)); - if (!pfn) - { - if (error) - UTIL_Format(error, maxlen, "Function %s not found", PL_EXPOSURE_C); - pl->m_Status = Pl_Error; - } else { - pl->m_API = static_cast((pfn)(PLAPI_NAME, NULL)); - if (!pl->m_API) - { - if (error) - UTIL_Format(error, maxlen, "Failed to get API"); - pl->m_Status = Pl_Error; - } else { - int api = pl->m_API->GetApiVersion(); - if (api < PLAPI_MIN_VERSION) - { - if (error) - UTIL_Format(error, maxlen, "Plugin API %d is out of date with required minimum (%d)", api, PLAPI_MIN_VERSION); - pl->m_Status = Pl_Error; - } else if (api > PLAPI_VERSION) { - if (error) - UTIL_Format(error, maxlen, "Plugin API %d is newer than internal version (%d)", api, PLAPI_VERSION); - pl->m_Status = Pl_Error; - } else { - if (pl->m_API->Load(pl->m_Id, static_cast(&g_SmmAPI), error, maxlen, m_AllLoaded)) - { - pl->m_Status = Pl_Running; - if (m_AllLoaded) - { - //API 4 is when we added this callback - //Removing this code as the min version is now 5 - //if (pl->m_API->GetApiVersion() >= 4) - pl->m_API->AllPluginsLoaded(); - } - } else { - pl->m_Status = Pl_Refused; - } - } - } - } - } - } - - if (pl->m_Lib && (pl->m_Status < Pl_Paused)) - { - pl->m_Events.clear(); - g_SourceHook.UnloadPlugin(pl->m_Id); - UnregAllConCmds(pl); - - dlclose(pl->m_Lib); - pl->m_Lib = NULL; - pl->m_API = NULL; - } - - return pl; -} - -bool CPluginManager::_Unload(CPluginManager::CPlugin *pl, bool force, char *error, size_t maxlen) -{ - if (error) - *error = '\0'; - if (pl->m_API && pl->m_Lib) - { - //Note, we'll always tell the plugin it will be unloading... - if (pl->m_API->Unload(error, maxlen) || force) - { - //Make sure to detach it from sourcehook! - g_SourceHook.UnloadPlugin(pl->m_Id); - - UnregAllConCmds(pl); - - //Clean up the DLL - dlclose(pl->m_Lib); - pl->m_Lib = NULL; - pl->m_API = NULL; - - //Remove the plugin from the list - PluginIter i; - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_Id == pl->m_Id ) - { - i = m_Plugins.erase(i); - break; - } - } - //Free its memory - delete pl; - - return true; - } - } else { - //The plugin is not valid, and let's just remove it from the list anyway - PluginIter i; - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_Id == pl->m_Id ) - { - i = m_Plugins.erase(i); - break; - } - } - delete pl; - - return true; - } - - return false; -} - -bool CPluginManager::_Pause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) -{ - if (error) - *error = '\0'; - if (pl->m_Status != Pl_Running || !pl->m_API) - { - if (error) - UTIL_Format(error, maxlen, "Plugin cannot be paused"); - } else { - if (pl->m_API->Pause(error, maxlen)) - { - g_SourceHook.PausePlugin(pl->m_Id); - pl->m_Status = Pl_Paused; - - return true; - } - } - - return false; -} - -bool CPluginManager::_Unpause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) -{ - if (error) - *error = '\0'; - - if (pl->m_Status != Pl_Paused || !pl->m_API) - { - if (error) - UTIL_Format(error, maxlen, "Plugin cannot be unpaused"); - } else { - if (pl->m_API->Unpause(error, maxlen)) - { - g_SourceHook.UnpausePlugin(pl->m_Id); - pl->m_Status = Pl_Running; - - return true; - } - } - - return false; -} - -bool CPluginManager::UnloadAll() -{ - PluginIter i; - - char error[128]; - bool status = true; - - while ((i = m_Plugins.begin()) != m_Plugins.end()) - { - if ( !_Unload( (*i), true, error, sizeof(error)) ) - { - status = false; - } - } - - return status; -} - -bool CPluginManager::Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source) -{ - CPlugin *pl = FindById(id); - - if (!pl) - return false; - - file = pl->m_File.c_str(); - status = pl->m_Status; - source = pl->m_Source; - - return true; -} - -bool CPluginManager::QueryRunning(PluginId id, char *error, size_t maxlength) -{ - CPlugin *pl = FindById(id); - - if (!pl || !pl->m_API) - { - if (error) - UTIL_Format(error, maxlength, "Plugin not valid"); - return false; - } - - return pl->m_API->QueryRunning(error, maxlength); -} - -bool CPluginManager::QueryHandle(PluginId id, void *&handle) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - return false; - } - - handle = static_cast(pl->m_Lib); - - return true; -} - -PluginIter CPluginManager::_begin() -{ - return m_Plugins.begin(); -} - -PluginIter CPluginManager::_end() -{ - return m_Plugins.end(); -} - -void CPluginManager::AddPluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - return; - - pl->m_Cvars.push_back(pCvar); -} - -void CPluginManager::AddPluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - return; - - pl->m_Cmds.push_back(pCmd); -} - -void CPluginManager::RemovePluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - return; - - pl->m_Cvars.remove(pCvar); -} - -void CPluginManager::RemovePluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - return; - - pl->m_Cmds.remove(pCmd); -} - -void CPluginManager::UnregAllConCmds(CPlugin *pl) -{ - SourceHook::List::iterator i; - - for (i=pl->m_Cvars.begin(); i!=pl->m_Cvars.end(); i++) - g_SMConVarAccessor.Unregister(pl->m_Id, (*i) ); - - pl->m_Cvars.clear(); - - for (i=pl->m_Cmds.begin(); i!=pl->m_Cmds.end(); i++) - g_SMConVarAccessor.Unregister(pl->m_Id, (*i) ); - - pl->m_Cmds.clear(); -} diff --git a/sourcemm/CSmmAPI.cpp b/sourcemm/CSmmAPI.cpp deleted file mode 100644 index 459e585..0000000 --- a/sourcemm/CSmmAPI.cpp +++ /dev/null @@ -1,680 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include "convar_smm.h" -#include "CSmmAPI.h" -#include "sourcemm.h" -#include "concommands.h" -#include "CPlugin.h" -#include "vsp_listener.h" - -/** - * @brief Implementation of main API interface - * @file CSmmAPI.cpp - */ - -using namespace SourceMM; - -CSmmAPI g_SmmAPI; - -CSmmAPI::CSmmAPI() -{ - m_ConPrintf = NULL; - m_CmdCache = false; - m_MsgCount = -1; - m_VSP = false; -} - -CSmmAPI::~CSmmAPI() -{ - m_UserMessages.RemoveAll(); -} - -void CSmmAPI::LogMsg(ISmmPlugin *pl, const char *msg, ...) -{ - va_list ap; - static char buffer[2048]; - - va_start(ap, msg); - UTIL_FormatArgs(buffer, sizeof(buffer), msg, ap); - va_end(ap); - - LogMessage("[%s] %s", pl->GetLogTag(), buffer); -} - -CreateInterfaceFn CSmmAPI::engineFactory(bool syn) -{ - if (syn) - return EngineFactory; - return g_Engine.engineFactory; -} - -CreateInterfaceFn CSmmAPI::physicsFactory(bool syn) -{ - if (syn) - return PhysicsFactory; - return g_Engine.physicsFactory; -} - -CreateInterfaceFn CSmmAPI::fileSystemFactory(bool syn) -{ - if (syn) - return FileSystemFactory; - return g_Engine.fileSystemFactory; -} - -CreateInterfaceFn CSmmAPI::serverFactory(bool syn) -{ - if (syn) - return CreateInterface; - return g_GameDll.factory; -} - -CGlobalVars *CSmmAPI::pGlobals() -{ - return g_Engine.pGlobals; -} - -void CSmmAPI::SetLastMetaReturn(META_RES res) -{ - m_Res = res; -} - -META_RES CSmmAPI::GetLastMetaReturn() -{ - return m_Res; -} - -IConCommandBaseAccessor *CSmmAPI::GetCvarBaseAccessor() -{ - return static_cast(&g_SMConVarAccessor); -} - -bool CSmmAPI::RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) -{ - if (pCommand->IsCommand()) - { - g_PluginMngr.AddPluginCmd(plugin, pCommand); - } else { - g_PluginMngr.AddPluginCvar(plugin, pCommand); - } - - return g_SMConVarAccessor.Register(pCommand); -} - -void CSmmAPI::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) -{ - if (pCommand->IsCommand()) - { - g_PluginMngr.RemovePluginCmd(plugin, pCommand); - } else { - g_PluginMngr.RemovePluginCvar(plugin, pCommand); - } - - g_SMConVarAccessor.Unregister(g_PluginMngr.FindByAPI(plugin)->m_Id, pCommand); -} - -void CSmmAPI::ConPrint(const char *fmt) -{ - (m_ConPrintf)("%s", fmt); -} - -void CSmmAPI::ConPrintf(const char *fmt, ...) -{ - va_list ap; - static char buffer[4096]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - (m_ConPrintf)("%s", buffer); -} - -void CSmmAPI::AddListener(ISmmPlugin *plugin, IMetamodListener *pListener) -{ - CPluginManager::CPlugin *pl = g_PluginMngr.FindByAPI(plugin); - - pl->m_Events.push_back(pListener); -} - -void *CSmmAPI::MetaFactory(const char *iface, int *_ret, PluginId *id) -{ - if (id) - { - *id = 0; - } - - if (!iface) - { - return NULL; - } - - //first check ours... we get first chance! - if (strcmp(iface, MMIFACE_SOURCEHOOK) == 0) - { - if (_ret) - { - *_ret = IFACE_OK; - } - return static_cast(static_cast(&g_SourceHook)); - } else if (strcmp(iface, MMIFACE_PLMANAGER) == 0) { - if (_ret) - { - *_ret = IFACE_OK; - } - return static_cast(static_cast(&g_PluginMngr)); - } - - CPluginManager::CPlugin *pl; - SourceHook::List::iterator event; - IMetamodListener *api; - int ret = 0; - void *val = NULL; - - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) - { - pl = (*iter); - for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) - { - api = (*event); - ret = IFACE_FAILED; - if ( (val=api->OnMetamodQuery(iface, &ret)) != NULL ) - { - if (_ret) - *_ret = ret; - if (id) - *id = pl->m_Id; - return val; - } - } - } - - if (_ret) - *_ret = IFACE_FAILED; - - return NULL; -} - -////////////////////////////////////////////////////////////////////////// -//THERE BE HAX HERE!!!! DON'T TELL ALFRED, BUT GABE WANTED IT THAT WAY. // -// (note: you can find the offset by looking for the text // -// "Echo text to console", you'll find the callback cmd pushed on the // -// stack.) // -////////////////////////////////////////////////////////////////////////// - -#define SIGLEN 8 -#define ENGINE486_SIG "\x55\x89\xE5\x53\x83\xEC\x14\xBB" -#define ENGINE486_OFFS 40 -#define ENGINE686_SIG "\x53\x83\xEC\x08\xBB\x01\x00\x00" -#define ENGINE686_OFFS 50 -#define ENGINEAMD_SIG "\x53\x51\xBB\x01\x00\x00\x00\x51" -#define ENGINEAMD_OFFS 47 -#define ENGINEW32_SIG "\xA1\x2A\x2A\x2A\x2A\x56\xBE\x01" -#define ENGINEW32_OFFS 38 -#define IA32_CALL 0xE8 - -bool vcmp(const void *_addr1, const void *_addr2, size_t len) -{ - unsigned char *addr1 = (unsigned char *)_addr1; - unsigned char *addr2 = (unsigned char *)_addr2; - - for (size_t i=0; iGetCommands(); - unsigned char *ptr = NULL; - FnCommandCallback callback = NULL; - int offs = 0; - - while (pBase) - { - if ( strcmp(pBase->GetName(), "echo") == 0 ) - { - //callback = //*((FnCommandCallback *)((char *)pBase + offsetof(ConCommand, m_fnCommandCallback))); - callback = ((ConCommand *)pBase)->GetCallback(); - ptr = (unsigned char *)callback; - #ifdef OS_LINUX - if (vcmp(ptr, ENGINE486_SIG, SIGLEN)) - { - offs = ENGINE486_OFFS; - } - else if (vcmp(ptr, ENGINE686_SIG, SIGLEN)) - { - offs = ENGINE686_OFFS; - } - else if (vcmp(ptr, ENGINEAMD_SIG, SIGLEN)) - { - offs = ENGINEAMD_OFFS; - } - #elif defined OS_WIN32 // Only one Windows engine binary so far... - if (vcmp(ptr, ENGINEW32_SIG, SIGLEN)) - { - offs = ENGINEW32_OFFS; - } - #endif - - if (!offs || ptr[offs - 1] != IA32_CALL) - { - m_ConPrintf = (CONPRINTF_FUNC)Msg; - return false; - } - //get the relative offset - m_ConPrintf = *((CONPRINTF_FUNC *)(ptr + offs)); - //add the base offset, to the ip (which is the address+offset + 4 bytes for next instruction) - m_ConPrintf = (CONPRINTF_FUNC)((unsigned long)m_ConPrintf + (unsigned long)(ptr + offs) + 4); - - m_CmdCache = true; - - return true; - } - pBase = const_cast(pBase->GetNext()); - } - - m_ConPrintf = (CONPRINTF_FUNC)Msg; - - return false; -} - -bool CSmmAPI::CmdCacheSuccessful() -{ - return m_CmdCache; -} - -void CSmmAPI::GetApiVersions(int &major, int &minor, int &plvers, int &plmin) -{ - major = SM_VERS_API_MAJOR; - minor = SM_VERS_API_MINOR; - plvers = PLAPI_VERSION; - plmin = PLAPI_MIN_VERSION; -} - -void CSmmAPI::GetShVersions(int &shvers, int &shimpl) -{ - shvers = SH_IFACE_VERSION; - shimpl = SH_IMPL_VERSION; -} - -int CSmmAPI::FormatIface(char iface[], unsigned int maxlength) -{ - int length = (int)strlen(iface); - int i; - int num = 0; - - for (i = length - 1; i >= 0; i--) - { - if (!isdigit(iface[i])) - { - if (i != length - 1) - { - num = 1; - } - break; - } - } - - if ( (num && ((int)maxlength <= length)) || (!num && ((int)maxlength <= length + 3)) ) - { - return -1; - } - - if (i != length - 1) - num = atoi(&(iface[++i])); - - num++; - - snprintf(&(iface[i]), 4, "%03d", num); - - return num; -} - -void *CSmmAPI::InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret) -{ - char _if[256]; /* assume no interface goes beyond this */ - size_t len = strlen(iface); - int num = 0; - void *pf = NULL; - - if (max > 999) - max = 999; - - if (len + 4 > sizeof(_if)) - { - if (ret) - { - *ret = IFACE_FAILED; - } - return NULL; - } - - strcpy(_if, iface); - - do - { - if ( (pf = (fn)(_if, ret)) != NULL ) - break; - if (num > max) - break; - } while (( num = FormatIface(_if, len+1) )); - - return pf; -} - -void *CSmmAPI::VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min) -{ - char buffer[256]; /* assume no interface will go beyond this */ - size_t len = strlen(iface); - int ret; /* just in case something doesn't handle NULL properly */ - - if (len > sizeof(buffer) - 4) - { - return NULL; - } - - strcpy(buffer, iface); - - if (min != -1) - { - char *ptr = &buffer[len - 1]; - int digits = 0; - while (isdigit(*ptr) && digits <=3) - { - *ptr = '\0'; - digits++; - ptr--; - } - if (digits != 3) - { - /* for now, assume this is an error */ - strcpy(buffer, iface); - } else { - char num[4]; - min = (min == 0) ? 1 : min; - snprintf(num, sizeof(num), "%03d", min); - strcat(buffer, num); - } - } - - return InterfaceSearch(fn, buffer, IFACE_MAXNUM, &ret); -} - -const char *CSmmAPI::GetBaseDir() -{ - return g_ModPath.c_str(); -} - -void CSmmAPI::PathFormat(char *buffer, size_t len, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - size_t mylen = UTIL_FormatArgs(buffer, len, fmt, ap); - va_end(ap); - - for (size_t i = 0; i < mylen; i++) - { - if (buffer[i] == ALT_SEP_CHAR) - { - buffer[i] = PATH_SEP_CHAR; - } - } -} - -void CSmmAPI::ClientConPrintf(edict_t *client, const char *fmt, ...) -{ - va_list ap; - static char buffer[4096]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - g_Engine.engine->ClientPrintf(client, buffer); -} - -void CSmmAPI::LoadAsVSP() -{ - size_t len; - char engine_file[PATH_SIZE]; - char engine_path[PATH_SIZE]; - char rel_path[PATH_SIZE * 2]; - - GetFileOfAddress(g_Engine.engine, engine_file, sizeof(engine_file)); - - /* Chop off the "engine" file part */ - len = strlen(engine_file); - for (size_t i = len - 1; i >= 0 && i < len; i--) - { - if (engine_file[i] == '/' - || engine_file[i] == '\\') - { - engine_file[i] = '\0'; - break; - } - } - abspath(engine_path, engine_file); - - const char *usepath = g_SmmPath.c_str(); - if (UTIL_Relatize(rel_path, sizeof(rel_path), engine_path, g_SmmPath.c_str())) - { - usepath = rel_path; - } - - char command[PATH_SIZE * 2]; - g_VspListener.SetLoadable(true); - UTIL_Format(command, sizeof(command), "plugin_load \"%s\"\n", usepath); - g_Engine.engine->ServerCommand(command); -} - -void CSmmAPI::EnableVSPListener() -{ - /* If GameInit already passed and we're not already enabled or loaded, go ahead and LoadAsVSP load */ - if (bGameInit && !m_VSP && !g_VspListener.IsLoaded()) - { - LoadAsVSP(); - } - m_VSP = true; -} - -int CSmmAPI::GetGameDLLVersion() -{ - return g_GameDllVersion; -} - -////////////////////////////////////////////////////////////////////// -// EVEN MORE HACKS HERE! YOU HAVE BEEN WARNED! // -// Signatures necessary in finding the pointer to the CUtlDict that // -// stores user message information. // -// IServerGameDLL::GetUserMessageInfo() normally crashes with bad // -// message indices. This is our answer to it. Yuck! <:-( // -////////////////////////////////////////////////////////////////////// -#ifdef OS_WIN32 - /* General Windows sig */ - #define MSGCLASS_SIGLEN 7 - #define MSGCLASS_SIG "\x8B\x0D\x2A\x2A\x2A\x2A\x56" - #define MSGCLASS_OFFS 2 - - /* Dystopia Wimdows hack */ - #define MSGCLASS2_SIGLEN 16 - #define MSGCLASS2_SIG "\x56\x8B\x74\x24\x2A\x85\xF6\x7C\x2A\x3B\x35\x2A\x2A\x2A\x2A\x7D" - #define MSGCLASS2_OFFS 11 - - /* Windows frame pointer sig */ - #define MSGCLASS3_SIGLEN 18 - #define MSGCLASS3_SIG "\x55\x8B\xEC\x51\x89\x2A\x2A\x8B\x2A\x2A\x50\x8B\x0D\x2A\x2A\x2A\x2A\xE8" - #define MSGCLASS3_OFFS 13 -#elif defined OS_LINUX - /* No frame pointer sig */ - #define MSGCLASS_SIGLEN 14 - #define MSGCLASS_SIG "\x53\x83\xEC\x2A\x8B\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" - #define MSGCLASS_OFFS 9 - - /* Frame pointer sig */ - #define MSGCLASS2_SIGLEN 16 - #define MSGCLASS2_SIG "\x55\x89\xE5\x53\x83\xEC\x2A\x8B\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" - #define MSGCLASS2_OFFS 11 -#endif - -/* This is the ugliest function in all of SourceMM */ -/* :TODO: Make this prettier */ -bool CSmmAPI::CacheUserMessages() -{ - SourceHook::MemFuncInfo info = {true, -1, 0, 0}; - SourceHook::GetFuncInfo(&IServerGameDLL::GetUserMessageInfo, info); - - /* Get address of original GetUserMessageInfo() */ - char *vfunc = reinterpret_cast(g_GameDllPatch->GetOrigFunc(info.vtbloffs, info.vtblindex)); - - /* If we can't get original function, that means there's no hook */ - if (vfunc == NULL) - { - /* Get virtual function address 'manually' then */ - char *adjustedptr = reinterpret_cast(g_GameDll.pGameDLL) + info.thisptroffs + info.vtbloffs; - char **vtable = *reinterpret_cast(adjustedptr); - - vfunc = vtable[info.vtblindex]; - } - - /* Oh dear, we have a relative jump on our hands - * PVK II on Windows made me do this, but I suppose it doesn't hurt to check this on Linux too... - */ - if (*vfunc == '\xE9') - { - /* Get address from displacement... - * - * Add 5 because it's relative to next instruction: - * Opcode <1 byte> + 32-bit displacement <4 bytes> - */ - vfunc = vfunc + *reinterpret_cast(vfunc + 1) + 5; - } - - UserMsgDict *dict = NULL; - - if (vcmp(vfunc, MSGCLASS_SIG, MSGCLASS_SIGLEN)) - { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - } else if (vcmp(vfunc, MSGCLASS2_SIG, MSGCLASS2_SIGLEN)) { - #ifdef OS_WIN32 - /* If we get here, the code is possibly inlined like in Dystopia */ - - /* Get the address of the CUtlRBTree */ - char *rbtree = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* CUtlDict should be 8 bytes before the CUtlRBTree (hacktacular!) */ - dict = reinterpret_cast(rbtree - 8); - #elif defined OS_LINUX - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - #ifdef OS_WIN32 - } else if (vcmp(vfunc, MSGCLASS3_SIG, MSGCLASS3_SIGLEN)) { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS3_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - } - - if (dict) - { - m_MsgCount = dict->Count(); - - /* Ensure that count is within bounds of an unsigned byte, because that's what engine supports */ - if (m_MsgCount < 0 || m_MsgCount > 255) - { - m_MsgCount = -1; - return false; - } - - UserMessage *msg; - - /* Cache messages in our CUtlDict */ - for (int i = 0; i < m_MsgCount; i++) - { - msg = dict->Element(i); - m_UserMessages.Insert(msg->name, msg); - } - - return true; - } - - return false; -} - -bool CSmmAPI::MsgCacheSuccessful() -{ - return m_MsgCount > -1; -} - -int CSmmAPI::GetUserMessageCount() -{ - return m_MsgCount; -} - -int CSmmAPI::FindUserMessage(const char *name, int *size) -{ - int index = m_UserMessages.Find(name); - - if (size && index > -1) - { - UserMessage *msg = m_UserMessages.Element(index); - *size = msg->size; - } - - return index; -} - -const char *CSmmAPI::GetUserMessage(int index, int *size) -{ - if (m_MsgCount <= 0 || index < 0 || index >= m_MsgCount) - { - return NULL; - } - - UserMessage *msg = m_UserMessages.Element(index); - - if (size) - { - *size = msg->size; - } - - return msg->name; -} - -int CSmmAPI::GetVSPVersion() -{ - return g_VspVersion; -} - -int CSmmAPI::GetSourceEngineBuild() -{ - return g_SourceEngineVersion; -} diff --git a/sourcemm/CSmmAPI.h b/sourcemm/CSmmAPI.h deleted file mode 100644 index 98f9563..0000000 --- a/sourcemm/CSmmAPI.h +++ /dev/null @@ -1,97 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_CSMM_API_H -#define _INCLUDE_CSMM_API_H - -/** - * @brief Header for CSmmAPI implementation - * @file CSmmAPI.h - */ - -#include "ISmmAPI.h" -#include - -struct UserMessage -{ - int size; - const char *name; -}; - -typedef CUtlDict UserMsgDict; - -typedef void (*CONPRINTF_FUNC)(const char *, ...); - -class CSmmAPI : public ISmmAPI -{ -public: - CSmmAPI(); - ~CSmmAPI(); -public: - void LogMsg(ISmmPlugin *pl, const char *msg, ...); -public: - CreateInterfaceFn engineFactory(bool syn=true); - CreateInterfaceFn physicsFactory(bool syn=true); - CreateInterfaceFn fileSystemFactory(bool syn=true); - CreateInterfaceFn serverFactory(bool syn=true); - CGlobalVars *pGlobals(); - void SetLastMetaReturn(META_RES res); - META_RES GetLastMetaReturn(); - IConCommandBaseAccessor *GetCvarBaseAccessor(); - bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); - void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); - void ConPrint(const char *fmt); - void ConPrintf(const char *fmt, ...); - bool RemotePrintingAvailable() - { - return CmdCacheSuccessful(); - } - virtual void GetApiVersions(int &major, int &minor, int &plvers, int &plmin); - virtual void GetShVersions(int &shvers, int &shimpl); - virtual void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener); - virtual void *MetaFactory(const char *iface, int *ret, PluginId *id); - virtual int FormatIface(char buffer[], unsigned int maxlength); - virtual void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret); - virtual const char *GetBaseDir(); - virtual void PathFormat(char *buffer, size_t len, const char *fmt, ...); - void ClientConPrintf(edict_t *client, const char *fmt, ...); - void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1); - void EnableVSPListener(); - int GetGameDLLVersion(); - int GetUserMessageCount(); - int FindUserMessage(const char *name, int *size=NULL); - const char *GetUserMessage(int index, int *size=NULL); - int GetVSPVersion(); - int GetSourceEngineBuild(); -public: - bool CacheCmds(); - bool CmdCacheSuccessful(); - void LoadAsVSP(); - bool VSPEnabled() - { - return m_VSP; - } - bool CacheUserMessages(); - bool MsgCacheSuccessful(); -private: - META_RES m_Res; - CONPRINTF_FUNC m_ConPrintf; - bool m_CmdCache; - bool m_VSP; - int m_MsgCount; - UserMsgDict m_UserMessages; -}; - -extern CSmmAPI g_SmmAPI; - -#define CONMSG g_SmmAPI.ConPrintf -#define CLIENT_CONMSG g_SmmAPI.ClientConPrintf - -#endif //_INCLUDE_CSMM_API_H diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h index e6f7c70..d581a12 100644 --- a/sourcemm/ISmmAPI.h +++ b/sourcemm/ISmmAPI.h @@ -35,9 +35,10 @@ class ISmmPlugin; #define MMIFACE_PLMANAGER "IPluginManager" /**< SourceMM Plugin Functions */ #define IFACE_MAXNUM 999 /**< Maximum interface version */ -#define SOURCE_ENGINE_ORIGINAL 0 /**< Original Source Engine (used by The Ship) */ -#define SOURCE_ENGINE_EPISODEONE 1 /**< Episode 1 Source Engine (second major SDK) */ -#define SOURCE_ENGINE_ORANGEBOX 2 /**< Orange Box Source Engine (third major SDK) */ +#define SOURCE_ENGINE_UNKNOWN 0 /**< Could not determine the engine version */ +#define SOURCE_ENGINE_ORIGINAL 1 /**< Original Source Engine (used by The Ship) */ +#define SOURCE_ENGINE_EPISODEONE 2 /**< Episode 1 Source Engine (second major SDK) */ +#define SOURCE_ENGINE_ORANGEBOX 3 /**< Orange Box Source Engine (third major SDK) */ class ISmmAPI { diff --git a/sourcemm/concommands.h b/sourcemm/concommands.h deleted file mode 100644 index 0817afb..0000000 --- a/sourcemm/concommands.h +++ /dev/null @@ -1,53 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_CONCOMMANDS_H -#define _INCLUDE_CONCOMMANDS_H - -/** - * @brief Header for console commands - * @file concommands.h - */ - -#include -#include -#include "sourcemm.h" -#include "convar_smm.h" -#include "sh_list.h" - -class SMConVarAccessor : public IConCommandBaseAccessor -{ - SourceHook::List m_RegisteredCommands; -public: - virtual bool RegisterConCommandBase(ConCommandBase *pCommand); - bool Register(ConCommandBase *pCommand); - void MarkCommandsAsGameDLL(); - void Unregister(PluginId id, ConCommandBase *pCommand); - void UnregisterGameDLLCommands(); -}; - -class CAlwaysRegisterableCommand : public ConCommandBase -{ - ICvar *m_pICvar; -public: - CAlwaysRegisterableCommand(); - bool IsRegistered( void ) const; - // If already registered, removes us - // Then it registers us again - void BringToFront(); -}; - -void ClientCommand_handler(edict_t *client); - -const char *GetPluginsFile(); - -extern SMConVarAccessor g_SMConVarAccessor; - -#endif //_INCLUDE_CONCOMMANDS_H diff --git a/sourcemm/convar_smm.h b/sourcemm/convar_smm.h deleted file mode 100644 index 26abce9..0000000 --- a/sourcemm/convar_smm.h +++ /dev/null @@ -1,523 +0,0 @@ -//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// -// -// Purpose: -// -// $Workfile: $ -// $Date$ -// -//----------------------------------------------------------------------------- -// $NoKeywords: $ -//=============================================================================// - -#ifndef CONVAR_H -#define CONVAR_H -#if _WIN32 -#pragma once -#endif - -#include "tier0/dbg.h" - -#ifdef _WIN32 -#define FORCEINLINE_CVAR FORCEINLINE -#elif _LINUX -#define FORCEINLINE_CVAR __inline__ FORCEINLINE -#else -#error "implement me" -#endif - -// The default, no flags at all -#define FCVAR_NONE 0 - -// Command to ConVars and ConCommands -// ConVar Systems -#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. -#define FCVAR_LAUNCHER (1<<1) // defined by launcher -#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL -#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL -#define FCVAR_MATERIAL_SYSTEM (1<<4) // Defined by the material system. -#define FCVAR_DATACACHE (1<<19) // Defined by the datacache system. -#define FCVAR_STUDIORENDER (1<<15) // Defined by the studiorender system. -#define FCVAR_FILESYSTEM (1<<21) // Defined by the file system. -#define FCVAR_PLUGIN (1<<18) // Defined by a 3rd party plugin. -#define FCVAR_TOOLSYSTEM (1<<20) // Defined by an IToolSystem library -#define FCVAR_SOUNDSYSTEM (1<<23) // Defined by the soundsystem library -#define FCVAR_INPUTSYSTEM (1<<25) // Defined by the inputsystem dll -#define FCVAR_NETWORKSYSTEM (1<<26) // Defined by the network system -// NOTE!! if you add a cvar system, add it here too!!!! -// the engine lacks a cvar flag, but needs it for xbox -// an engine cvar is thus a cvar not marked with any other system -#define FCVAR_NON_ENGINE ((FCVAR_LAUNCHER|FCVAR_GAMEDLL|FCVAR_CLIENTDLL|FCVAR_MATERIAL_SYSTEM|FCVAR_DATACACHE|FCVAR_STUDIORENDER|FCVAR_FILESYSTEM|FCVAR_PLUGIN|FCVAR_TOOLSYSTEM|FCVAR_SOUNDSYSTEM|FCVAR_INPUTSYSTEM|FCVAR_NETWORKSYSTEM)) - -// ConVar only -#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value -#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. -#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc -#define FCVAR_NOTIFY (1<<8) // notifies players when changed -#define FCVAR_USERINFO (1<<9) // changes the client's info string -#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats - -#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). -#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log -#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar - -// It's a ConVar that's shared between the client and the server. -// At signon, the values of all such ConVars are sent from the server to the client (skipped for local -// client, of course ) -// If a change is requested it must come from the console (i.e., no remote client changes) -// If a value is changed while a server is active, it's replicated to all connected clients -#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time -#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file -#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles - -#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server - -#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox - - -// #define FCVAR_AVAILABLE (1<<27) -// #define FCVAR_AVAILABLE (1<<28) -// #define FCVAR_AVAILABLE (1<<29) -// #define FCVAR_AVAILABLE (1<<30) -// #define FCVAR_AVAILABLE (1<<31) - - -class ConVar; -class ConCommand; -class ConCommandBase; - -// Any executable that wants to use ConVars need to implement one of -// these to hook up access to console variables. -class IConCommandBaseAccessor -{ -public: - // Flags is a combination of FCVAR flags in cvar.h. - // hOut is filled in with a handle to the variable. - virtual bool RegisterConCommandBase( ConCommandBase *pVar )=0; -}; - - -// You don't have to instantiate one of these, just call its -// OneTimeInit function when your executable is initializing. -class ConCommandBaseMgr -{ -public: - // Call this ONCE when the executable starts up. - static void OneTimeInit( IConCommandBaseAccessor *pAccessor ); -#ifdef _XBOX - static bool Fixup( ConCommandBase* pConCommandBase ); -#ifndef _RETAIL - static void PublishCommands( bool bForce ); -#endif -#endif -}; - -// Called when a ConVar changes value -typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString ); - -// Called when a ConCommand needs to execute -typedef void ( *FnCommandCallback )( void ); - -#define COMMAND_COMPLETION_MAXITEMS 64 -#define COMMAND_COMPLETION_ITEM_LENGTH 64 - -// Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings -typedef int ( *FnCommandCompletionCallback )( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); - -//----------------------------------------------------------------------------- -// Purpose: The base console invoked command/cvar interface -//----------------------------------------------------------------------------- -class ConCommandBase -{ - friend class ConCommandBaseMgr; - friend class CCvar; - friend class ConVar; - friend class ConCommand; - -public: - ConCommandBase( void ); - ConCommandBase( char const *pName, char const *pHelpString = 0, - int flags = 0 ); - - virtual ~ConCommandBase( void ); - - virtual bool IsCommand( void ) const; - - // Check flag - virtual bool IsBitSet( int flag ) const; - // Set flag - virtual void AddFlags( int flags ); - - // Return name of cvar - virtual char const *GetName( void ) const; - - // Return help text for cvar - virtual char const *GetHelpText( void ) const; - - // Deal with next pointer - const ConCommandBase *GetNext( void ) const; - void SetNext( ConCommandBase *next ); - - virtual bool IsRegistered( void ) const; - - // Global methods - static ConCommandBase const *GetCommands( void ); - static void AddToList( ConCommandBase *var ); - static void RemoveFlaggedCommands( int flag ); - static void RevertFlaggedCvars( int flag ); - static ConCommandBase const *FindCommand( char const *name ); - -protected: - virtual void Create( char const *pName, char const *pHelpString = 0, - int flags = 0 ); - - // Used internally by OneTimeInit to initialize. - virtual void Init(); - - // Internal copy routine ( uses new operator from correct module ) - char *CopyString( char const *from ); - - // Next ConVar in chain - ConCommandBase *m_pNext; - -private: - // Has the cvar been added to the global list? - bool m_bRegistered; - - // Static data - char const *m_pszName; - char const *m_pszHelpString; - - // ConVar flags - int m_nFlags; - -protected: - - // ConVars add themselves to this list for the executable. Then ConVarMgr::Init() runs through - // all the console variables and registers them. - static ConCommandBase *s_pConCommandBases; - - // ConVars in this executable use this 'global' to access values. - static IConCommandBaseAccessor *s_pAccessor; -}; - -//----------------------------------------------------------------------------- -// Purpose: The console invoked command -//----------------------------------------------------------------------------- -class ConCommand : public ConCommandBase -{ -friend class ConCommandBaseMgr; -friend class CCvar; -#ifdef _STATIC_LINKED -friend class G_ConCommand; -friend class C_ConCommand; -friend class M_ConCommand; -friend class S_ConCommand; -friend class D_ConCommand; -#endif - -public: - typedef ConCommandBase BaseClass; - - ConCommand( void ); - ConCommand( char const *pName, FnCommandCallback callback, - char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); - - virtual ~ConCommand( void ); - - virtual bool IsCommand( void ) const; - - virtual int AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); - - virtual bool CanAutoComplete( void ); - - // Invoke the function - virtual void Dispatch( void ); -private: - virtual void Create( char const *pName, FnCommandCallback callback, - char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); - - // Call this function when executing the command - FnCommandCallback m_fnCommandCallback; - - FnCommandCompletionCallback m_fnCompletionCallback; - bool m_bHasCompletionCallback; -public: - FnCommandCallback GetCallback() { return m_fnCommandCallback; } -}; - -//----------------------------------------------------------------------------- -// Purpose: A console variable -//----------------------------------------------------------------------------- -class ConVar : public ConCommandBase -{ -friend class ConCommandBaseMgr; -friend class CCvar; -friend class CDefaultCvar; -#ifdef _STATIC_LINKED -friend class G_ConVar; -friend class C_ConVar; -friend class M_ConVar; -friend class S_ConVar; -friend class D_ConVar; -#endif - -public: - typedef ConCommandBase BaseClass; - - ConVar( char const *pName, char const *pDefaultValue, int flags = 0); - - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, FnChangeCallback callback ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, - FnChangeCallback callback ); - - virtual ~ConVar( void ); - - virtual bool IsBitSet( int flag ) const; - virtual char const* GetHelpText( void ) const; - virtual bool IsRegistered( void ) const; - virtual char const *GetName( void ) const; - virtual void AddFlags( int flags ); - virtual bool IsCommand( void ) const; - - // Install a change callback (there shouldn't already be one....) - void InstallChangeCallback( FnChangeCallback callback ); - - // Retrieve value - FORCEINLINE_CVAR float GetFloat( void ) const; - FORCEINLINE_CVAR int GetInt( void ) const; - FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } - FORCEINLINE_CVAR char const *GetString( void ) const; - - // Any function that allocates/frees memory needs to be virtual or else you'll have crashes - // from alloc/free across dll/exe boundaries. - - // These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue). - virtual void SetValue( char const *value ); - virtual void SetValue( float value ); - virtual void SetValue( int value ); - - // Reset to default value - void Revert( void ); - - // True if it has a min/max setting - bool GetMin( float& minVal ) const; - bool GetMax( float& maxVal ) const; - char const *GetDefault( void ) const; - - static void RevertAll( void ); -private: - // Called by CCvar when the value of a var is changing. - virtual void InternalSetValue(char const *value); - // For CVARs marked FCVAR_NEVER_AS_STRING - virtual void InternalSetFloatValue( float fNewValue ); - virtual void InternalSetIntValue( int nValue ); - - virtual bool ClampValue( float& value ); - virtual void ChangeStringValue( char const *tempVal ); - - virtual void Create( char const *pName, char const *pDefaultValue, int flags = 0, - char const *pHelpString = 0, bool bMin = false, float fMin = 0.0, - bool bMax = false, float fMax = false, FnChangeCallback callback = 0 ); - - // Used internally by OneTimeInit to initialize. - virtual void Init(); - -private: - - // This either points to "this" or it points to the original declaration of a ConVar. - // This allows ConVars to exist in separate modules, and they all use the first one to be declared. - // m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar). - ConVar *m_pParent; - - // Static data - char const *m_pszDefaultValue; - - // Value - // Dynamically allocated - char *m_pszString; - int m_StringLength; - - // Values - float m_fValue; - int m_nValue; - - // Min/Max values - bool m_bHasMin; - float m_fMinVal; - bool m_bHasMax; - float m_fMaxVal; - - // Call this function when ConVar changes - FnChangeCallback m_fnChangeCallback; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as a float -// Output : float -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR float ConVar::GetFloat( void ) const -{ - return m_pParent->m_fValue; -} - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as an int -// Output : int -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR int ConVar::GetInt( void ) const -{ - return m_pParent->m_nValue; -} - - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. -// Output : char const * -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR char const *ConVar::GetString( void ) const -{ - if ( m_nFlags & FCVAR_NEVER_AS_STRING ) - { - return "FCVAR_NEVER_AS_STRING"; - } - - return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : ""; -} - - -#ifdef _STATIC_LINKED -// identifies subsystem via piggybacking constructors with flags -class G_ConCommand : public ConCommand -{ -public: - G_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_GAMEDLL, completionFunc) {} -}; - -class C_ConCommand : public ConCommand -{ -public: - C_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_CLIENTDLL, completionFunc) {} -}; - -class M_ConCommand : public ConCommand -{ -public: - M_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_MATERIAL_SYSTEM, completionFunc) {} -}; - -class S_ConCommand : public ConCommand -{ -public: - S_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_STUDIORENDER, completionFunc) {} -}; - -class D_ConCommand : public ConCommand -{ -public: - D_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_DATACACHE, completionFunc) {} -}; - -typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString ); -typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString ); -typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString ); -typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString ); -typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString ); - -class G_ConVar : public ConVar -{ -public: - G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, (FnChangeCallback)callback ) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class C_ConVar : public ConVar -{ -public: - C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, (FnChangeCallback)callback ) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class M_ConVar : public ConVar -{ -public: - M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, (FnChangeCallback)callback ) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class S_ConVar : public ConVar -{ -public: - S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, (FnChangeCallback)callback ) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, S_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class D_ConVar : public ConVar -{ -public: - D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, (FnChangeCallback)callback ) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, D_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -// redirect these declarations to their specific subsystem -#ifdef GAME_DLL -#define ConCommand G_ConCommand -#define ConVar G_ConVar -#endif -#ifdef CLIENT_DLL -#define ConCommand C_ConCommand -#define ConVar C_ConVar -#endif -#ifdef MATERIALSYSTEM_DLL -#define ConCommand M_ConCommand -#define ConVar M_ConVar -#endif -#ifdef STUDIORENDER_DLL -#define ConCommand S_ConCommand -#define ConVar S_ConVar -#endif -#ifdef DATACACHE_DLL -#define ConCommand D_ConCommand -#define ConVar D_ConVar -#endif -#endif // _STATIC_LINKED - -//----------------------------------------------------------------------------- -// Purpose: Utility to quicky generate a simple console command -//----------------------------------------------------------------------------- -#define CON_COMMAND( name, description ) \ - static void name(); \ - static ConCommand name##_command( #name, name, description ); \ - static void name() - -//----------------------------------------------------------------------------- -// Purpose: Utility to quicky generate a simple console command -//----------------------------------------------------------------------------- -#define CON_COMMAND_F( name, description, flags ) \ - static void name(); \ - static ConCommand name##_command( #name, name, description, flags ); \ - static void name() - - -#endif // CONVAR_H diff --git a/sourcemm/metamod.cpp b/sourcemm/metamod.cpp new file mode 100644 index 0000000..82081d4 --- /dev/null +++ b/sourcemm/metamod.cpp @@ -0,0 +1,1182 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * Contributor(s): Scott "Damaged Soul" Ehlert + * : Pavol "PM OnoTo" Marko + * ============================ + */ + +#if defined _DEBUG +#define DEBUG2 +#undef _DEBUG +#endif +#include +#include +#include "metamod.h" +#include "metamod_provider.h" +#include "metamod_plugins.h" +#include "metamod_util.h" +#include "metamod_console.h" +#if defined DEBUG2 +#undef DEBUG2 +#define _DEBUG +#endif + +using namespace SourceMM; +using namespace SourceHook; + +/** + * @brief Implementation of main SourceMM GameDLL functionality + * @file sourcemm.cpp + */ +IMetamodSourceProvider *provider = NULL; + +SH_DECL_MANUALHOOK4(SGD_DLLInit, 0, 0, 0, bool, CreateInterfaceFn, CreateInterfaceFn, CreateInterfaceFn, CGlobalVars *); +SH_DECL_MANUALHOOK0(SGD_GameInit, 0, 0, 0, bool); +SH_DECL_MANUALHOOK6(SGD_LevelInit, 0, 0, 0, bool, const char *, const char *, const char *, const char *, bool, bool); +SH_DECL_MANUALHOOK0_void(SGD_LevelShutdown, 0, 0, 0); +SH_DECL_MANUALHOOK0_void(SGD_DLLShutdown, 0, 0, 0); + +bool Handler_DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); +bool Handler_DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); +void Handler_DLLShutdown(); +void Handler_LevelShutdown(); +bool Handler_LevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background); +bool Handler_GameInit(); +void InitializeVSP(); + +struct game_dll_t +{ + HINSTANCE lib; + CreateInterfaceFn factory; +}; + +SourceHook::CallClass *g_GameDllPatch; +String mod_path; +String metamod_path; +String full_bin_path; +bool parsed_game_info = false; +int vsp_version = 0; +int gamedll_version = 0; +int engine_build = SOURCE_ENGINE_UNKNOWN; +List gamedll_list; +bool is_gamedll_loaded = false; +bool in_first_level = true; +bool is_game_init = false; +bool vsp_load_attempted = false; +bool vsp_load_requested = false; +bool vsp_loaded = false; +game_dll_t gamedll_info; +ConVar *metamod_version = NULL; +ConVar *mm_pluginsfile = NULL; +IServerGameDLL *server = NULL; +CreateInterfaceFn engine_factory = NULL; +CreateInterfaceFn physics_factory = NULL; +CreateInterfaceFn filesystem_factory = NULL; +CGlobalVars *gpGlobals = NULL; +SourceHook::CSourceHookImpl g_SourceHook; +SourceHook::ISourceHook *g_SHPtr = &g_SourceHook; +PluginId g_PLID = Pl_Console; +META_RES last_meta_res; + +MetamodSource g_Metamod; + +void ClearGamedllList(); + +/* Helper Macro */ +#define IFACE_MACRO(orig,nam) \ + CPluginManager::CPlugin *pl; \ + SourceHook::List::iterator event; \ + IMetamodListener *api; \ + int mret = 0; \ + void *val = NULL; \ + for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ + pl = (*iter); \ + for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ + api = (*event); \ + mret = IFACE_FAILED; \ + if ( (val=api->On##nam##Query(iface, &mret)) != NULL ) { \ + if (ret) *ret = mret; \ + return val; \ + } \ + } \ + } \ + return (orig)(iface, ret); + +#define ITER_EVENT(evn, args) \ + CPluginManager::CPlugin *pl; \ + SourceHook::List::iterator event; \ + IMetamodListener *api; \ + for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ + pl = (*iter); \ + for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ + api = (*event); \ + api->evn args; \ + } \ + } + +/* Initialize everything here */ +void InitMainStates() +{ + char full_path[PATH_SIZE] = {0}; + GetFileOfAddress((void *)gamedll_info.factory, full_path, sizeof(full_path)); + full_bin_path.assign(full_path); + + /* Like Metamod, reload plugins at the end of the map. + * This is so plugins can hook everything on load, BUT, new plugins will be reloaded + * if the server is shut down (silly, but rare case). + */ + in_first_level = true; + + SourceHook::MemFuncInfo info; + + if (!provider->GetHookInfo(ProvidedHook_DLLInit, &info)) + { + provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::DLLInit"); + } + SH_MANUALHOOK_RECONFIGURE(SGD_DLLInit, info.vtblindex, info.vtbloffs, info.thisptroffs); + SH_ADD_MANUALHOOK_STATICFUNC(SGD_DLLInit, server, Handler_DLLInit, false); + SH_ADD_MANUALHOOK_STATICFUNC(SGD_DLLInit, server, Handler_DLLInit_Post, true); + + if (!provider->GetHookInfo(ProvidedHook_GameInit, &info)) + { + provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::GameInit"); + } + SH_MANUALHOOK_RECONFIGURE(SGD_GameInit, info.vtblindex, info.vtbloffs, info.thisptroffs); + SH_ADD_MANUALHOOK_STATICFUNC(SGD_GameInit, server, Handler_GameInit, false); + + if (!provider->GetHookInfo(ProvidedHook_LevelInit, &info)) + { + provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::LevelInit"); + } + SH_MANUALHOOK_RECONFIGURE(SGD_LevelInit, info.vtblindex, info.vtbloffs, info.thisptroffs); + SH_ADD_MANUALHOOK_STATICFUNC(SGD_LevelInit, server, Handler_LevelInit, true); + + if (!provider->GetHookInfo(ProvidedHook_LevelShutdown, &info)) + { + provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::LevelShutdown"); + } + SH_MANUALHOOK_RECONFIGURE(SGD_LevelShutdown, info.vtblindex, info.vtbloffs, info.thisptroffs); + SH_ADD_MANUALHOOK_STATICFUNC(SGD_LevelShutdown, server, Handler_LevelShutdown, true); + + if (!provider->GetHookInfo(ProvidedHook_DLLShutdown, &info)) + { + provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::DLLShutdown"); + } + SH_MANUALHOOK_RECONFIGURE(SGD_DLLShutdown, info.vtblindex, info.vtbloffs, info.thisptroffs); + SH_ADD_MANUALHOOK_STATICFUNC(SGD_DLLShutdown, server, Handler_DLLShutdown, false); +} + +/* This is where the magic happens */ +SMM_API void *CreateInterface(const char *iface, int *ret) +{ + /* Prevent loading of self as a SourceMM plugin or Valve server plugin :x */ + if (strcmp(iface, PLAPI_NAME) == 0) + { + provider->DisplayWarning("Do not try loading Metamod:Source as a plugin.\n"); + + if (ret) + { + *ret = IFACE_FAILED; + } + + return NULL; + } + + if (strncmp(iface, "ISERVERPLUGINCALLBACKS", 22) == 0) + { + IServerPluginCallbacks *pCallbacks = provider->GetVSPCallbacks(iface); + + if (pCallbacks && vsp_version == 0) + { + vsp_version = atoi(&iface[22]); + } + + if (pCallbacks && ret) + { + *ret = pCallbacks ? IFACE_OK : IFACE_FAILED; + } + + return pCallbacks; + } + + if (!parsed_game_info) + { + parsed_game_info = true; + const char *game_dir = NULL; + char game_path[PATH_SIZE]; + char mm_path[PATH_SIZE]; + + /* Get path to SourceMM DLL */ + if (!GetFileOfAddress((void *)CreateInterface, mm_path, sizeof(mm_path))) + { + provider->DisplayError("GetFileOfAddress() failed! Metamod cannot load.\n"); + return NULL; + } + + metamod_path.assign(mm_path); + + /* Get value of -game from command line, defaulting to hl2 as engine seems to do */ + game_dir = provider->GetCommandLineValue("-game", "hl2"); + + /* Get absolute path */ + abspath(game_path, game_dir); + mod_path.assign(game_path); + + char temp_path[PATH_SIZE]; + + /* Path to gameinfo.txt */ + g_Metamod.PathFormat(temp_path, PATH_SIZE, "%s/%s", mod_path.c_str(), "gameinfo.txt"); + + FILE *fp = fopen(temp_path, "rt"); + + if (!fp) + { + provider->DisplayError("Unable to open gameinfo.txt! Metamod cannot load.\n"); + return NULL; + } + + char buffer[255]; + char key[128], val[128]; + bool search = false; + bool gamebin = false; + char *ptr; + const char *lptr; + char cur_path[PATH_SIZE]; + + getcwd(cur_path, PATH_SIZE); + + while (!feof(fp) && fgets(buffer, sizeof(buffer), fp) != NULL) + { + UTIL_TrimComments(buffer); + UTIL_TrimLeft(buffer); + UTIL_TrimRight(buffer); + + if (stricmp(buffer, "SearchPaths") == 0) + { + search = true; + } + + if (!search) + { + continue; + } + + UTIL_KeySplit(buffer, key, sizeof(key) - 1, val, sizeof(val) - 1); + if (stricmp(key, "Game") == 0 || stricmp(key, "GameBin") == 0) + { + if (stricmp(key, "Game") == 0) + { + gamebin = false; + } + else + { + gamebin = true; + } + + if (strncmp(val, "|gameinfo_path|", sizeof("|gameinfo_path|") - 1) == 0) + { + ptr = &(val[sizeof("|gameinfo_path|") - 1]); + if (ptr[0] == '.') + { + ptr++; + } + lptr = mod_path.c_str(); + } else { + ptr = val; + lptr = cur_path; + } + + size_t ptr_len = strlen(ptr); + if (ptr[ptr_len] == '/' || ptr[ptr_len] == '\\') + { + ptr[--ptr_len] = '\0'; + } + + /* No need to append "bin" if key is GameBin */ + if (gamebin) + { + g_Metamod.PathFormat(temp_path, PATH_SIZE, "%s/%s/%s", lptr, ptr, SERVER_DLL); + } + else if (!ptr[0]) + { + g_Metamod.PathFormat(temp_path, PATH_SIZE, "%s/%s/%s", lptr, "bin", SERVER_DLL); + } + else + { + g_Metamod.PathFormat(temp_path, PATH_SIZE, "%s/%s/%s/%s", lptr, ptr, "bin", SERVER_DLL); + } + + /* If not path to SourceMM... */ + if (!UTIL_PathCmp(mm_path, temp_path)) + { + FILE *temp_fp = fopen(temp_path, "rb"); + if (!temp_fp) + { + continue; + } + fclose(temp_fp); + + /* Search for a matching game dll */ + List::iterator iter; + game_dll_t *pCheck; + bool found = false; + for (iter = gamedll_list.begin(); iter != gamedll_list.end(); iter++) + { + pCheck = (*iter); + if (GetFileOfAddress((void *)pCheck->factory, buffer, sizeof(buffer))) + { + if (UTIL_PathCmp(temp_path, buffer)) + { + found = true; + break; + } + } + } + + if (found) + { + continue; + } + + HINSTANCE gamedll = dlmount(temp_path); + if (gamedll == NULL) + { + continue; + } + + CreateInterfaceFn fn = (CreateInterfaceFn)dlsym(gamedll, "CreateInterface"); + if (fn == NULL) + { + dlclose(gamedll); + continue; + } + + game_dll_t *pInfo = new game_dll_t; + pInfo->factory = fn; + pInfo->lib = gamedll; + gamedll_list.push_back(pInfo); + break; + } + } + } + fclose(fp); + } + + if (!is_gamedll_loaded) + { + if (strncmp(iface, "ServerGameDLL", 13) == 0) + { + List::iterator iter; + game_dll_t *pInfo; + for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) + { + pInfo = (*iter); + if ((server = (IServerGameDLL *)((pInfo->factory)(iface, ret))) != NULL) + { + if ((gamedll_version = provider->TryServerGameDLL(iface)) != 0) + { + /* We have a match. Erase us from the list and save our info. */ + gamedll_list.erase(iter); + gamedll_info = *pInfo; + delete pInfo; + is_gamedll_loaded = true; + break; + } + /* :TODO: error otherwise? */ + } + } + + if (is_gamedll_loaded) + { + ClearGamedllList(); + InitMainStates(); + } + else + { + if (ret) + { + *ret = IFACE_FAILED; + } + return NULL; + } + } + else + { + /* wtf do we do... */ + /* :TODO: .. something a bit more intelligent? */ + provider->DisplayError("Engine requested unknown interface before GameDLL was known!\n"); + return NULL; + } + } + + /* If we got here, there's definitely a GameDLL */ + IFACE_MACRO(gamedll_info.factory, GameDLL); +} + +void ClearGamedllList() +{ + List::iterator iter; + + game_dll_t *pInfo; + for (iter = gamedll_list.begin(); iter != gamedll_list.end(); iter++) + { + pInfo = (*iter); + dlclose(pInfo->lib); + delete pInfo; + } + + gamedll_list.clear(); +} + +int LoadPluginsFromFile(const char *_file) +{ + FILE *fp; + int total = 0, skipped=0; + PluginId id; + bool already; + + fp = fopen(_file, "rt"); + if (!fp) + { + LogMessage("[META] Could not open plugins file %s\n", _file); + return -1; + } + + char buffer[255], error[255], full_path[255]; + const char *ptr, *ext, *file; + size_t length; + while (!feof(fp) && fgets(buffer, sizeof(buffer), fp) != NULL) + { + UTIL_TrimLeft(buffer); + UTIL_TrimRight(buffer); + + length = strlen(buffer); + if (!length) + { + continue; + } + + if (buffer[0] == '\0' || buffer[0] == ';' || strncmp(buffer, "//", 2) == 0) + { + continue; + } + + file = buffer; + if (buffer[0] == '"') + { + char *cptr = buffer; + file = ++cptr; + + while (*cptr) + { + if (*cptr == '"') + { + *cptr = '\0'; + break; + } + cptr++; + } + } + else + { + char *cptr = buffer; + while (*cptr) + { + if (isspace(*cptr)) + { + char *optr = cptr; + while (*cptr && isspace(*cptr)) + { + cptr++; + } + *optr = '\0'; + UTIL_TrimRight(cptr); + if (*cptr && isalpha(*cptr)) + { + g_PluginMngr.SetAlias(buffer, cptr); + file = cptr; + } + break; + } + cptr++; + } + } + if (!file[0]) + { + continue; + } + /* First find if it's an absolute path or not... */ + if (file[0] == '/' || strncmp(&(file[1]), ":\\", 2) == 0) + { + /* If we're in an absolute path, ignore our normal heuristics */ + id = g_PluginMngr.Load(file, Pl_File, already, error, sizeof(error)); + if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) + { + LogMessage("[META] Failed to load plugin %s. %s", buffer, error); + } + else + { + if (already) + { + skipped++; + } + else + { + total++; + } + } + } + else + { + /* Attempt to find a file extension */ + ptr = UTIL_GetExtension(file); + /* Add an extension if there's none there */ + if (!ptr) + { +#if defined WIN32 || defined _WIN32 + ext = ".dll"; +#else + ext = "_i486.so"; +#endif + } + else + { + ext = ""; + } + /* Format the new path */ + g_Metamod.PathFormat(full_path, sizeof(full_path), "%s/%s%s", mod_path.c_str(), file, ext); + id = g_PluginMngr.Load(full_path, Pl_File, already, error, sizeof(error)); + if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) + { + LogMessage("[META] Failed to load plugin %s. %s", buffer, error); + } + else + { + if (already) + { + skipped++; + } + else + { + total++; + } + } + } + } + fclose(fp); + + if (skipped) + { + LogMessage("[META] Loaded %d plugins from file (%d already loaded)", total, skipped); + } + else + { + LogMessage("[META] Loaded %d plugins from file.", total); + } + + return total; +} + +void InitializeVSP() +{ + size_t len; + char engine_file[PATH_SIZE]; + char engine_path[PATH_SIZE]; + char rel_path[PATH_SIZE * 2]; + + GetFileOfAddress(engine_factory, engine_file, sizeof(engine_file)); + + /* Chop off the "engine" file part */ + len = strlen(engine_file); + for (size_t i = len - 1; i >= 0 && i < len; i--) + { + if (engine_file[i] == '/' || engine_file[i] == '\\') + { + engine_file[i] = '\0'; + break; + } + } + abspath(engine_path, engine_file); + + const char *usepath = metamod_path.c_str(); + if (UTIL_Relatize(rel_path, sizeof(rel_path), engine_path, metamod_path.c_str())) + { + usepath = rel_path; + } + + char command[PATH_SIZE * 2]; + UTIL_Format(command, sizeof(command), "plugin_load \"%s\"\n", usepath); + provider->ServerCommand(command); +} + +/* Wrapper function. This is called when the GameDLL thinks it's using + * the engine's real engineFactory. + */ +void *EngineFactory(const char *iface, int *ret) +{ + IFACE_MACRO(engine_factory, Engine); +} + +/* Wrapper function. This is called when the GameDLL thinks it's using + * the engine's real physicsFactory. + */ +void *PhysicsFactory(const char *iface, int *ret) +{ + IFACE_MACRO(physics_factory, Physics); +} + +/* Wrapper function. This is called when the GameDLL thinks it's using + * the engine's real fileSystemFactory. + */ +void *FileSystemFactory(const char *iface, int *ret) +{ + IFACE_MACRO(filesystem_factory, FileSystem); +} + +void LogMessage(const char *msg, ...) +{ + va_list ap; + static char buffer[2048]; + + va_start(ap, msg); + size_t len = vsnprintf(buffer, sizeof(buffer) - 2, msg, ap); + va_end(ap); + + buffer[len++] = '\n'; + buffer[len] = '\0'; + + if (!provider->LogMessage(buffer)) + { + fprintf(stdout, "%s", buffer); + } +} + +bool Handler_DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) +{ + engine_factory = engineFactory; + filesystem_factory = filesystemFactory; + physics_factory = physicsFactory; + gpGlobals = pGlobals; + + g_GameDllPatch = SH_GET_CALLCLASS(server); + + provider->Notify_DLLInit_Pre(); + + metamod_version = provider->CreateConVar("metamod_version", + SOURCEMM_VERSION, + "Metamod:Source Version", + ConVarFlag_Notify|ConVarFlag_Replicated|ConVarFlag_SpOnly); + + mm_pluginsfile = provider->CreateConVar("mm_pluginsfile", +#if defined WIN32 || defined _WIN32 + "addons\\metamod\\metaplugins.ini", +#else + "addons/metamod/metaplugins.ini", +#endif + "Metamod:Source Plugins File", + ConVarFlag_SpOnly); + + provider->CreateCommand("meta", Command_Meta, "Metamod:Source Menu"); + provider->SetClientCommandHandler(Command_ClientMeta); + + const char *pluginFile = provider->GetCommandLineValue("mm_pluginsfile", NULL); + if (!pluginFile) + { + pluginFile = provider->GetConVarString(mm_pluginsfile); + } + + char full_path[260]; + g_Metamod.PathFormat(full_path, sizeof(full_path), "%s/%s", mod_path.c_str(), pluginFile); + + LoadPluginsFromFile(full_path); + + in_first_level = true; + + RETURN_META_VALUE(MRES_IGNORED, true); +} + +bool Handler_GameInit() +{ + if (is_game_init) + { + return true; + } + + if (vsp_load_requested) + { + InitializeVSP(); + } + + is_game_init = true; + + RETURN_META_VALUE(MRES_IGNORED, true); +} + +bool Handler_DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) +{ + g_PluginMngr.SetAllLoaded(); + RETURN_META_VALUE(MRES_IGNORED, true); +} + +void Handler_DLLShutdown() +{ + /* Unload plugins */ + g_PluginMngr.UnloadAll(); + + SH_CALL(g_GameDllPatch, &IServerGameDLL::DLLShutdown)(); + + SH_RELEASE_CALLCLASS(g_GameDllPatch); + g_GameDllPatch = NULL; + + g_SourceHook.CompleteShutdown(); + + if (is_gamedll_loaded && gamedll_info.lib) + { + dlclose(gamedll_info.lib); + is_gamedll_loaded = false; + } + + RETURN_META(MRES_SUPERCEDE); +} + +void Handler_LevelShutdown(void) +{ + if (!in_first_level) + { + char full_path[255]; + g_Metamod.PathFormat(full_path, + sizeof(full_path), + "%s/%s", + mod_path.c_str(), + provider->GetConVarString(mm_pluginsfile)); + + LoadPluginsFromFile(full_path); + } + else + { + in_first_level = false; + } + + ITER_EVENT(OnLevelShutdown, ()); + + RETURN_META(MRES_IGNORED); +} + +bool Handler_LevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background) +{ + ITER_EVENT(OnLevelInit, (pMapName, pMapEntities, pOldLevel, pLandmarkName, loadGame, background)); + + RETURN_META_VALUE(MRES_IGNORED, false); +} + +void MetamodSource::LogMsg(ISmmPlugin *pl, const char *msg, ...) +{ + va_list ap; + char buffer[2048]; + + va_start(ap, msg); + UTIL_FormatArgs(buffer, sizeof(buffer), msg, ap); + va_end(ap); + + LogMessage("[%s] %s", pl->GetLogTag(), buffer); +} + +CreateInterfaceFn MetamodSource::engineFactory(bool syn/* =true */) +{ + if (syn) + { + return EngineFactory; + } + + return engine_factory; +} + +CreateInterfaceFn MetamodSource::physicsFactory(bool syn/* =true */) +{ + if (syn) + { + return PhysicsFactory; + } + + return physics_factory; +} + +CreateInterfaceFn MetamodSource::fileSystemFactory(bool syn/* =true */) +{ + if (syn) + { + return FileSystemFactory; + } + + return filesystem_factory; +} + +CreateInterfaceFn MetamodSource::serverFactory(bool syn/* =true */) +{ + if (syn) + { + return CreateInterface; + } + + return gamedll_info.factory; +} + +CGlobalVars *MetamodSource::pGlobals() +{ + return gpGlobals; +} + +void MetamodSource::SetLastMetaReturn(META_RES res) +{ + last_meta_res = res; +} + +META_RES MetamodSource::GetLastMetaReturn() +{ + return last_meta_res; +} + +void MetamodSource::ConPrint(const char *str) +{ + provider->ConsolePrint(str); +} + +void MetamodSource::ConPrintf(const char *fmt, ...) +{ + va_list ap; + char buffer[2048]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + provider->ConsolePrint(buffer); +} + +void MetamodSource::GetApiVersions(int &major, int &minor, int &plvers, int &plmin) +{ + major = SM_VERS_API_MAJOR; + minor = SM_VERS_API_MINOR; + plvers = PLAPI_VERSION; + plmin = PLAPI_MIN_VERSION; +} + +void MetamodSource::GetShVersions(int &shvers, int &shimpl) +{ + shvers = SH_IFACE_VERSION; + shimpl = SH_IMPL_VERSION; +} + +int MetamodSource::FormatIface(char iface[], unsigned int maxlength) +{ + int length = (int)strlen(iface); + int i; + int num = 0; + + for (i = length - 1; i >= 0; i--) + { + if (!isdigit(iface[i])) + { + if (i != length - 1) + { + num = 1; + } + break; + } + } + + if ( (num && ((int)maxlength <= length)) || (!num && ((int)maxlength <= length + 3)) ) + { + return -1; + } + + if (i != length - 1) + { + num = atoi(&(iface[++i])); + } + + num++; + + snprintf(&(iface[i]), 4, "%03d", num); + + return num; +} + +void *MetamodSource::InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret) +{ + char _if[256]; /* assume no interface goes beyond this */ + size_t len = strlen(iface); + int num = 0; + void *pf = NULL; + + if (max > 999) + { + max = 999; + } + + if (len + 4 > sizeof(_if)) + { + if (ret) + { + *ret = IFACE_FAILED; + } + return NULL; + } + + strcpy(_if, iface); + + do + { + if ((pf = (fn)(_if, ret)) != NULL) + { + break; + } + if (num > max) + { + break; + } + } while ((num = FormatIface(_if, len+1))); + + return pf; +} + +void *MetamodSource::VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min) +{ + char buffer[256]; /* assume no interface will go beyond this */ + size_t len = strlen(iface); + int ret; /* just in case something doesn't handle NULL properly */ + + if (len > sizeof(buffer) - 4) + { + return NULL; + } + + strcpy(buffer, iface); + + if (min != -1) + { + char *ptr = &buffer[len - 1]; + int digits = 0; + while (isdigit(*ptr) && digits <=3) + { + *ptr = '\0'; + digits++; + ptr--; + } + if (digits != 3) + { + /* for now, assume this is an error */ + strcpy(buffer, iface); + } + else + { + char num[4]; + min = (min == 0) ? 1 : min; + snprintf(num, sizeof(num), "%03d", min); + strcat(buffer, num); + } + } + + return InterfaceSearch(fn, buffer, IFACE_MAXNUM, &ret); +} + +const char *MetamodSource::GetBaseDir() +{ + return mod_path.c_str(); +} + +void MetamodSource::PathFormat(char *buffer, size_t len, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + size_t mylen = UTIL_FormatArgs(buffer, len, fmt, ap); + va_end(ap); + + for (size_t i = 0; i < mylen; i++) + { + if (buffer[i] == ALT_SEP_CHAR) + { + buffer[i] = PATH_SEP_CHAR; + } + } +} + +void MetamodSource::ClientConPrintf(edict_t *client, const char *fmt, ...) +{ + va_list ap; + char buffer[2048]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + provider->ClientConsolePrint(client, buffer); +} + +void MetamodSource::EnableVSPListener() +{ + if (is_game_init && !vsp_load_requested && !vsp_loaded) + { + InitializeVSP(); + } + + vsp_load_requested = true; +} + +int MetamodSource::GetVSPVersion() +{ + return vsp_version; +} + +int MetamodSource::GetGameDLLVersion() +{ + return gamedll_version; +} + +bool MetamodSource::RemotePrintingAvailable() +{ + return provider->IsRemotePrintingAvailable(); +} + +void *MetamodSource::MetaFactory(const char *iface, int *ret, PluginId *id) +{ + if (id) + { + *id = 0; + } + + if (!iface) + { + return NULL; + } + + /* First check ours... we get first chance! */ + if (strcmp(iface, MMIFACE_SOURCEHOOK) == 0) + { + if (ret) + { + *ret = IFACE_OK; + } + return static_cast(static_cast(&g_SourceHook)); + } + else if (strcmp(iface, MMIFACE_PLMANAGER) == 0) + { + if (ret) + { + *ret = IFACE_OK; + } + return static_cast(static_cast(&g_PluginMngr)); + } + + CPluginManager::CPlugin *pl; + List::iterator event; + IMetamodListener *api; + void *value; + + int subret = 0; + for (PluginIter iter = g_PluginMngr._begin(); + iter != g_PluginMngr._end(); + iter++) + { + pl = (*iter); + for (event = pl->m_Events.begin(); event != pl->m_Events.end(); event++) + { + api = (*event); + subret = IFACE_FAILED; + if ((value = api->OnMetamodQuery(iface, &subret)) != NULL) + { + if (ret) + { + *ret = subret; + } + if (id) + { + *id = pl->m_Id; + } + return value; + } + } + } + + if (ret) + { + *ret = IFACE_FAILED; + } + + return NULL; +} + +void MetamodSource::AddListener(ISmmPlugin *plugin, IMetamodListener *pListener) +{ + CPluginManager::CPlugin *pl = g_PluginMngr.FindByAPI(plugin); + + pl->m_Events.push_back(pListener); +} + +const char *MetamodSource::GetGameBinaryPath() +{ + return full_bin_path.c_str(); +} + +const char *MetamodSource::GetPluginsFile() +{ + return provider->GetConVarString(mm_pluginsfile); +} + +IConCommandBaseAccessor *MetamodSource::GetCvarBaseAccessor() +{ + return provider->GetConCommandBaseAccessor(); +} + +bool MetamodSource::RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) +{ + if (provider->IsConCommandBaseACommand(pCommand)) + { + g_PluginMngr.AddPluginCmd(plugin, pCommand); + } + else + { + g_PluginMngr.AddPluginCvar(plugin, pCommand); + } + + return provider->RegisterConCommandBase(pCommand); +} + +void MetamodSource::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) +{ + if (provider->IsConCommandBaseACommand(pCommand)) + { + g_PluginMngr.AddPluginCmd(plugin, pCommand); + } + else + { + g_PluginMngr.AddPluginCvar(plugin, pCommand); + } + + return provider->UnregisterConCommandBase(pCommand); +} + +int MetamodSource::GetUserMessageCount() +{ + return provider->GetUserMessageCount(); +} + +int MetamodSource::FindUserMessage(const char *name, int *size/* =NULL */) +{ + return provider->FindUserMessage(name, size); +} + +const char *MetamodSource::GetUserMessage(int index, int *size/* =NULL */) +{ + return provider->GetUserMessage(index, size); +} + +int MetamodSource::GetSourceEngineBuild() +{ + return engine_build; +} diff --git a/sourcemm/metamod.h b/sourcemm/metamod.h new file mode 100644 index 0000000..5f21669 --- /dev/null +++ b/sourcemm/metamod.h @@ -0,0 +1,88 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_SOURCEMM_H +#define _INCLUDE_SOURCEMM_H + +/** + * @brief SourceMM main functionality for GameDLL interception + * @file sourcemm.h + */ + +#include +#include +#include +#include +#include +#include "ISmmAPI.h" +#include "metamod_provider.h" +#include "svn_version.h" + +using namespace SourceMM; + +/** + * Versioning + * increase api_major when API breaks + * increase api_minor when new functions are added (non-breaking) + */ +#define SOURCEMM_VERSION SVN_FILE_VERSION_STRING +#define SOURCEMM_DATE __DATE__ +#define SM_VERS_API_MAJOR 1 //increase this on a breaking change +#define SM_VERS_API_MINOR 7 //increase this on a non-breaking API change + +class MetamodSource : public ISmmAPI +{ +public: + void LogMsg(ISmmPlugin *pl, const char *msg, ...); + CreateInterfaceFn engineFactory(bool syn=true); + CreateInterfaceFn physicsFactory(bool syn=true); + CreateInterfaceFn fileSystemFactory(bool syn=true); + CreateInterfaceFn serverFactory(bool syn=true); + CGlobalVars *pGlobals(); + void SetLastMetaReturn(META_RES res); + META_RES GetLastMetaReturn(); + IConCommandBaseAccessor *GetCvarBaseAccessor(); + bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); + void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); + void ConPrint(const char *str); + void ConPrintf(const char *fmt, ...); + bool RemotePrintingAvailable(); + void GetApiVersions(int &major, int &minor, int &plvers, int &plmin); + void GetShVersions(int &shvers, int &shimpl); + void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener); + void *MetaFactory(const char *iface, int *ret, PluginId *id); + int FormatIface(char iface[], unsigned int maxlength); + void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret); + const char *GetBaseDir(); + void PathFormat(char *buffer, size_t len, const char *fmt, ...); + void ClientConPrintf(edict_t *client, const char *fmt, ...); + void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1); + void EnableVSPListener(); + int GetGameDLLVersion(); + int GetUserMessageCount(); + int FindUserMessage(const char *name, int *size=NULL); + const char *GetUserMessage(int index, int *size=NULL); + int GetVSPVersion(); + int GetSourceEngineBuild(); +public: + const char *GetGameBinaryPath(); + const char *GetPluginsFile(); +}; + +void LogMessage(const char *msg, ...); +int LoadPluginsFromFile(const char *_file); + +extern PluginId g_PLID; +extern SourceHook::ISourceHook *g_SHPtr; +extern SourceHook::CSourceHookImpl g_SourceHook; +extern MetamodSource g_Metamod; +extern IMetamodSourceProvider *provider; + +#endif //_INCLUDE_SOURCEMM_H diff --git a/sourcemm/concommands.cpp b/sourcemm/metamod_console.cpp similarity index 60% rename from sourcemm/concommands.cpp rename to sourcemm/metamod_console.cpp index 0aa0313..1621e62 100644 --- a/sourcemm/concommands.cpp +++ b/sourcemm/metamod_console.cpp @@ -8,12 +8,19 @@ * ============================ */ +#if defined _DEBUG +#define DEBUG2 +#undef _DEBUG +#endif #include -#include "CSmmAPI.h" -#include "concommands.h" -#include "CPlugin.h" -#include "sh_string.h" -#include "sh_list.h" +#include "metamod.h" +#include "metamod_util.h" +#include "metamod_console.h" +#include "metamod_plugins.h" +#if defined DEBUG2 +#undef DEBUG2 +#define _DEBUG +#endif using namespace SourceMM; using namespace SourceHook; @@ -23,143 +30,16 @@ using namespace SourceHook; * @file concommands.cpp */ -CAlwaysRegisterableCommand g_EternalCommand; -SMConVarAccessor g_SMConVarAccessor; +#define CONMSG g_Metamod.ConPrintf +#define CLIENT_CONMSG g_Metamod.ClientConPrintf -bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) +bool Command_Meta(edict_t *pEdict, IMetamodSourceCommandInfo *info) { - // Add the FCVAR_GAMEDLL flag - // => No crash on exit! - // UPDATE: Do _not_ add the FCVAR_GAMEDLL flag here, as it - // causes the command to be unusable on listenservers until you load a map - // We will set the FCVAR_GAMEDLL flag on all commands we have registered once we are being unloaded - //pCommand->AddFlags(FCVAR_GAMEDLL); - m_RegisteredCommands.push_back(pCommand); + unsigned int args = info->GetArgCount(); - pCommand->SetNext( NULL ); - g_Engine.icvar->RegisterConCommandBase(pCommand); - - return true; -} - -bool SMConVarAccessor::Register(ConCommandBase *pCommand) -{ - //simple, don't mark as part of sourcemm! - pCommand->SetNext( NULL ); - g_Engine.icvar->RegisterConCommandBase(pCommand); - - return true; -} - -void SMConVarAccessor::MarkCommandsAsGameDLL() -{ - for (List::iterator iter = m_RegisteredCommands.begin(); - iter != m_RegisteredCommands.end(); ++iter) + if (args >= 1) { - (*iter)->AddFlags(FCVAR_GAMEDLL); - } -} - -void SMConVarAccessor::Unregister(PluginId id, ConCommandBase *pCommand) -{ - /* Notify via IMetamodListener */ - PluginIter iter; - CPluginManager::CPlugin *pPlugin; - List::iterator event; - IMetamodListener *pML; - for (iter=g_PluginMngr._begin(); iter!=g_PluginMngr._end(); iter++) - { - pPlugin = (*iter); - if (pPlugin->m_Status < Pl_Paused) - { - continue; - } - /* Only valid for plugins >= 12 (v1:6, SourceMM 1.5) */ - if (pPlugin->m_API->GetApiVersion() < 12) - { - continue; - } - for (event=pPlugin->m_Events.begin(); - event!=pPlugin->m_Events.end(); - event++) - { - pML = (*event); - pML->OnUnlinkConCommandBase(id, pCommand); - } - } - - ICvar *cv = g_Engine.icvar; - ConCommandBase *ptr = cv->GetCommands(); - - if (ptr == pCommand) - { - //first in list - g_EternalCommand.BringToFront(); - g_EternalCommand.SetNext(const_cast(pCommand->GetNext())); - } else { - //find us and unregister us - ConCommandBase *pPrev = NULL; - while (ptr) - { - if (ptr == pCommand) - break; - pPrev = ptr; - ptr = const_cast(ptr->GetNext()); - } - if (pPrev && ptr == pCommand) - { - pPrev->SetNext(const_cast(pCommand->GetNext())); - } - } -} - -void SMConVarAccessor::UnregisterGameDLLCommands() -{ - ConCommandBase *begin = g_Engine.icvar->GetCommands(); - ConCommandBase *iter = begin; - ConCommandBase *prev = NULL; - while (iter) - { - // watch out for the ETERNAL COMMAND! - if (iter != &g_EternalCommand && iter->IsBitSet(FCVAR_GAMEDLL)) - { - // Remove it! - if (iter == begin) - { - g_EternalCommand.BringToFront(); - iter = const_cast(iter->GetNext()); - g_EternalCommand.SetNext(iter); - prev = &g_EternalCommand; - continue; - } - else - { - iter = const_cast(iter->GetNext()); - prev->SetNext(iter); - continue; - } - } - prev = iter; - iter = const_cast(iter->GetNext()); - } -} - -ConVar metamod_version("metamod_version", SOURCEMM_VERSION, FCVAR_REPLICATED | FCVAR_SPONLY | FCVAR_NOTIFY, "Metamod:Source Version"); -#if defined WIN32 || defined _WIN32 -ConVar mm_pluginsfile("mm_pluginsfile", "addons\\metamod\\metaplugins.ini", FCVAR_SPONLY, "Metamod:Source Plugins File"); -#else -ConVar mm_pluginsfile("mm_pluginsfile", "addons/metamod/metaplugins.ini", FCVAR_SPONLY, "Metamod:Source Plugins File"); -#endif - -CON_COMMAND(meta, "Metamod:Source Menu") -{ - IVEngineServer *e = g_Engine.engine; - - int args = e->Cmd_Argc(); - - if (args >= 2) - { - const char *command = e->Cmd_Argv(1); + const char *command = info->GetArg(1); if (strcmp(command, "credits") == 0) { CONMSG("Metamod:Source was developed by:\n"); @@ -169,57 +49,73 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG("For more information, see the official website\n"); CONMSG("http://www.sourcemm.net/\n"); - return; - } else if (strcmp(command, "version") == 0) { + return true; + } + else if (strcmp(command, "version") == 0) + { CONMSG("Metamod:Source version %s\n", SOURCEMM_VERSION); CONMSG("Compiled on: %s\n", SOURCEMM_DATE); CONMSG("Plugin interface version: %d:%d\n", PLAPI_VERSION, PLAPI_MIN_VERSION); CONMSG("SourceHook version: %d:%d\n", g_SourceHook.GetIfaceVersion(), g_SourceHook.GetImplVersion()); CONMSG("http://www.sourcemm.net/\n"); - return; - } else if (strcmp(command, "game") == 0) { + return true; + } + else if (strcmp(command, "game") == 0) + { CONMSG("GameDLL Information\n"); - CONMSG(" Description: %s\n", g_GameDll.pGameDLL->GetGameDescription()); - CONMSG(" Mod Path: %s\n", g_ModPath.c_str()); - CONMSG(" DLL Path: %s\n", g_BinPath.c_str()); - CONMSG(" Interface: ServerGameDLL%03d, ServerGameClients%03d\n", g_GameDllVersion, g_GameClientsVersion); + CONMSG(" Description: %s\n", provider->GetGameDescription()); + CONMSG(" Mod Path: %s\n", g_Metamod.GetBaseDir()); + CONMSG(" DLL Path: %s\n", g_Metamod.GetGameBinaryPath()); + CONMSG(" Interface: ServerGameDLL%03d\n", g_Metamod.GetGameDLLVersion()); // Display user messages - if (g_SmmAPI.MsgCacheSuccessful()) + int messages = g_Metamod.GetUserMessageCount(); + if (messages == -1) { const char *msgname; int msgsize; - int msgcount = g_SmmAPI.GetUserMessageCount(); - if (msgcount > 0) + if (messages > 0) { CONMSG(" User Messages: %-32.31s %-5s %-5s\n", "Name", "Index", "Size"); - for (int i = 0; i < msgcount; i++) + for (int i = 0; i < messages; i++) { - msgname = g_SmmAPI.GetUserMessage(i, &msgsize); + msgname = g_Metamod.GetUserMessage(i, &msgsize); CONMSG(" %-32.31s %-5d %-5d\n", msgname, i, msgsize); } - CONMSG(" %d user message%s in total\n", msgcount, (msgcount > 1) ? "s" : ""); - } else { + CONMSG(" %d user message%s in total\n", messages, (messages > 1) ? "s" : ""); + } + else + { CONMSG(" User Messages: None\n"); } - } else { + } + else + { CONMSG(" User Messages: Failed to get list of user messages\n"); } - return; - } else if (strcmp(command, "refresh") == 0) { + return true; + } + else if (strcmp(command, "refresh") == 0) + { char full_path[255]; - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), GetPluginsFile()); + g_Metamod.PathFormat(full_path, + sizeof(full_path), + "%s/%s", + g_Metamod.GetBaseDir(), + g_Metamod.GetPluginsFile()); LoadPluginsFromFile(full_path); - return; - } else if (strcmp(command, "list") == 0) { + return true; + } + else if (strcmp(command, "list") == 0) + { CPluginManager::CPlugin *pl; ISmmPlugin *plapi; const char *plname; @@ -231,7 +127,7 @@ CON_COMMAND(meta, "Metamod:Source Menu") if (!plnum) { CONMSG("No plugins loaded.\n"); - return; + return true; } else { CONMSG("Listing %d plugin%s:\n", plnum, (plnum > 1) ? "s" : ""); } @@ -271,23 +167,27 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG("%s\n", buffer); } - return; - } else if (strcmp(command, "cmds") == 0) { - if (args >= 3) + return true; + } + else if (strcmp(command, "cmds") == 0) + { + if (args >= 2) { - int id = atoi(e->Cmd_Argv(2)); + int id = atoi(info->GetArg(2)); CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); if (!pl) { CONMSG("Plugin %d not found.\n", id); - return; + return true; } if (!pl->m_API) { CONMSG("Plugin %d is not loaded.\n", id); - } else { + } + else + { CONMSG("Console commands for %s:\n", pl->m_API->GetName()); List::iterator ci; size_t count = 0; @@ -298,27 +198,33 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG(" [%5d] %-s\n", count, (*ci)->GetName()); } } - } else { + } + else + { CONMSG("Usage: meta cmds \n"); } - return; - } else if (strcmp(command, "cvars") == 0) { - if (args >= 3) + return true; + } + else if (strcmp(command, "cvars") == 0) + { + if (args >= 2) { - int id = atoi(e->Cmd_Argv(2)); + int id = atoi(info->GetArg(2)); CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); if (!pl) { CONMSG("Plugin %d not found.\n", id); - return; + return true; } if (!pl->m_API) { CONMSG("Plugin %d is not loaded.\n", id); - } else { + } + else + { CONMSG("Registered cvars for %s:\n", pl->m_API->GetName()); List::iterator ci; size_t count = 0; @@ -329,38 +235,50 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG(" [%5d] %-s\n", count, (*ci)->GetName()); } } - } else { + } + else + { CONMSG("Usage: meta cvars \n"); } - return; - } else if (strcmp(command, "info") == 0) { - if (args >= 3) + return true; + } + else if (strcmp(command, "info") == 0) + { + if (args >= 2) { - int id = atoi(e->Cmd_Argv(2)); + int id = atoi(info->GetArg(2)); CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); if (!pl) { CONMSG("Plugin %d not found.\n", id); - return; + return true; } if (!pl->m_API) { CONMSG("Plugin %d is not loaded.\n", id); - } else { + } + else + { if (pl->m_Status == Pl_Paused) { CONMSG("Plugin %d is paused.\n", id); - } else if (pl->m_Status == Pl_Running) { + } + else if (pl->m_Status == Pl_Running) + { char run_msg[255]; bool run = false; if (pl->m_API && pl->m_API->QueryRunning(run_msg, sizeof(run_msg)-1)) + { run = true; + } if (run) { CONMSG("Plugin %d is running.\n", id); - } else { + } + else + { CONMSG("Plugin %d is stopped: %s\n", id, run_msg); } } @@ -373,57 +291,69 @@ CON_COMMAND(meta, "Metamod:Source Menu") } CONMSG("File: %s\n\n", pl->m_File.c_str()); - return; - } else { + return true; + } + else + { CONMSG("Usage: meta info \n"); - return; + return true; } - } else if (strcmp(command, "pause") == 0) { - if (args >= 3) + } + else if (strcmp(command, "pause") == 0) + { + if (args >= 2) { - int id = atoi(e->Cmd_Argv(2)); + int id = atoi(info->GetArg(2)); char error[255]; if (!g_PluginMngr.Pause(id, error, sizeof(error))) { CONMSG("Pause failed: %s\n", error); - return; + return true; } CONMSG("Plugin %d has been paused.\n", id); - return; - } else { + return true; + } + else + { CONMSG("Usage: meta pause \n"); - return; + return true; } - } else if (strcmp(command, "unpause") == 0) { - if (args >= 3) + } + else if (strcmp(command, "unpause") == 0) + { + if (args >= 2) { - int id = atoi(e->Cmd_Argv(2)); + int id = atoi(info->GetArg(2)); char error[255]; if (!g_PluginMngr.Unpause(id, error, sizeof(error))) { CONMSG("Unpause failed: %s\n", error); - return; + return true; } CONMSG("Plugin %d has been unpaused.\n", id); - return; - } else { + return true; + } + else + { CONMSG("Usage: meta unpause \n"); - return; + return true; } - } else if (strcmp(command, "load") == 0) { - if (args >= 3) + } + else if (strcmp(command, "load") == 0) + { + if (args >= 2) { - const char *file = e->Cmd_Argv(2); + const char *file = info->GetArg(2); char full_path[255]; const char *alias = g_PluginMngr.LookupAlias(file); @@ -434,15 +364,22 @@ CON_COMMAND(meta, "Metamod:Source Menu") if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0) { - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s", file); - } else { + g_Metamod.PathFormat(full_path, sizeof(full_path), "%s", file); + } + else + { const char *ext = UTIL_GetExtension(file); #if defined WIN32 || defined _WIN32 ext = ext ? "" : ".dll"; #else ext = ext ? "" : "_i486.so"; #endif - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); + g_Metamod.PathFormat(full_path, + sizeof(full_path), + "%s/%s%s", + g_Metamod.GetBaseDir(), + file, + ext); } char error[255]={0}; @@ -454,7 +391,7 @@ CON_COMMAND(meta, "Metamod:Source Menu") if (!pl || id < Pl_MinId || (pl->m_Status < Pl_Paused)) { CONMSG("Failed to load plugin %s (%s).\n", file, error); - return; + return true; } if (!already) @@ -464,28 +401,34 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG("Plugin \"%s\" is already loaded as %d.\n", pl->m_API->GetName(), pl->m_Id); } - return; - } else { + return true; + } + else + { CONMSG("Usage: meta load \n"); - return; + return true; } - } else if ( (strcmp(command, "alias") == 0) || - (strcmp(command, "aliases") == 0) ) { - if (args >= 4) + } + else if ( (strcmp(command, "alias") == 0) || + (strcmp(command, "aliases") == 0) ) + { + if (args >= 3) { - const char *alias = e->Cmd_Argv(2); - const char *value = e->Cmd_Argv(3); + const char *alias = info->GetArg(2); + const char *value = info->GetArg(3); g_PluginMngr.SetAlias(alias, value); - if (value[0] == '\0') + if (value == NULL || value[0] == '\0') { CONMSG("Deleted alias: %s.\n", alias); } else { CONMSG("Set alias \"%s\" to: %s\n", alias, value); } - } else if (args >= 3) { - const char *alias = e->Cmd_Argv(2); + } + else if (args >= 2) + { + const char *alias = info->GetArg(2); const char *value = g_PluginMngr.LookupAlias(alias); if (value) { @@ -493,7 +436,9 @@ CON_COMMAND(meta, "Metamod:Source Menu") } else { CONMSG("Alias \"%s\" was not found.\n", alias); } - } else { + } + else + { List::iterator iter, end; CNameAlias *p; @@ -512,15 +457,19 @@ CON_COMMAND(meta, "Metamod:Source Menu") } CONMSG(" --- \n"); CONMSG("%d aliases total.\n", total); - } else { + } + else + { CONMSG("No aliases found.\n"); } } - return; - } else if (strcmp(command, "unload") == 0) { - if (args >= 3) + return true; + } + else if (strcmp(command, "unload") == 0) + { + if (args >= 2) { - const char *file = e->Cmd_Argv(2); + const char *file = info->GetArg(2); int id = atoi(file); char error[255]={0}; @@ -537,15 +486,22 @@ CON_COMMAND(meta, "Metamod:Source Menu") /* first check if it's a known filename */ if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0) { - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s", file); - } else { + g_Metamod.PathFormat(full_path, sizeof(full_path), "%s", file); + } + else + { const char *ext = UTIL_GetExtension(file); #if defined WIN32 || defined _WIN32 ext = ext ? "" : ".dll"; #else ext = ext ? "" : "_i486.so"; #endif - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); + g_Metamod.PathFormat(full_path, + sizeof(full_path), + "%s/%s%s", + g_Metamod.GetBaseDir(), + file, + ext); } List::iterator iter, end; @@ -564,70 +520,82 @@ CON_COMMAND(meta, "Metamod:Source Menu") if (id == 0) { CONMSG("Plugin \"%s\" not found.\n", full_path); - return; + return true; } } if (!g_PluginMngr.Unload(id, false, error, sizeof(error))) { CONMSG("Unload failed: %s\n", error); - return; + return true; } CONMSG("Plugin %d unloaded.\n", id); - } else { + } + else + { CONMSG("Usage: meta unload \n"); } - return; - } else if (strcmp(command, "force_unload") == 0) { - if (args >= 3) + return true; + } + else if (strcmp(command, "force_unload") == 0) + { + if (args >= 2) { - int id = atoi(e->Cmd_Argv(2)); + int id = atoi(info->GetArg(2)); char error[255]={0}; if (!g_PluginMngr.Unload(id, false, error, sizeof(error))) { CONMSG("Force unload failed: %s\n", error); - return; + return true; } CONMSG("Plugin %d force unloaded.\n", id); - return; - } else { + return true; + } + else + { CONMSG("Usage: meta force_unload \n"); - return; + return true; } - } else if (strcmp(command, "clear") == 0) { + } + else if (strcmp(command, "clear") == 0) + { if (!g_PluginMngr.UnloadAll()) { CONMSG("One or more plugins resisted removal (cleaned anyway).\n"); - return; + return true; } CONMSG("All plugins unloaded.\n"); - return; - } else if (strcmp(command, "retry") == 0) { - if (args >= 3) + return true; + } + else if (strcmp(command, "retry") == 0) + { + if (args >= 2) { - int id = atoi(e->Cmd_Argv(2)); + int id = atoi(info->GetArg(2)); char error[255]; if (!g_PluginMngr.Retry(id, error, sizeof(error))) { CONMSG("Error reloading plugin: %s\n", error); - return; + return true; } CONMSG("Plugin %d successfully reloaded.\n", id); - return; - } else { + return true; + } + else + { CONMSG("Usage: meta retry \n"); - return; + return true; } } } @@ -650,66 +618,20 @@ CON_COMMAND(meta, "Metamod:Source Menu") CONMSG(" unload - Unload a loaded plugin\n"); CONMSG(" unpause - Unpause a paused plugin\n"); CONMSG(" version - Version information\n"); + + return true; } -CAlwaysRegisterableCommand::CAlwaysRegisterableCommand() +bool Command_ClientMeta(edict_t *client, IMetamodSourceCommandInfo *info) { - Create("", NULL, FCVAR_UNREGISTERED|FCVAR_GAMEDLL); - m_pICvar = NULL; -} - -bool CAlwaysRegisterableCommand::IsRegistered( void ) const -{ - return false; -} - -void CAlwaysRegisterableCommand::BringToFront() -{ - if (!m_pICvar) - m_pICvar = g_Engine.icvar; - - // First, let's try to find us! - ConCommandBase *pPtr = m_pICvar->GetCommands(); - - if (pPtr == this) - { - // We are already at the beginning; Nothing to do - return; - } - - while (pPtr) - { - if (pPtr == this && pPtr->IsCommand() && stricmp(GetName(), pPtr->GetName()) == 0) - break; - ConCommandBase *pPrev = NULL; - while (pPtr) - { - if (pPtr == this) - break; - pPrev = pPtr; - pPtr = const_cast(pPtr->GetNext()); - } - if (pPrev && pPtr == this) - { - pPrev->SetNext(m_pNext); // Remove us from the list - } - // Now, register us - SetNext(NULL); - m_pICvar->RegisterConCommandBase(this); - } -} - -void ClientCommand_handler(edict_t *client) -{ - IVEngineServer *e = g_Engine.engine; - const char *cmd = e->Cmd_Argv(0); + const char *cmd = info->GetArg(0); if (strcmp(cmd, "meta") == 0) { - int args = e->Cmd_Argc(); - if (args == 2) + unsigned int args = info->GetArgCount(); + if (args == 1) { - const char *subcmd = e->Cmd_Argv(1); + const char *subcmd = info->GetArg(1); if (strcmp(subcmd, "credits") == 0) { @@ -720,16 +642,20 @@ void ClientCommand_handler(edict_t *client) CLIENT_CONMSG(client, "For more information, see the official website\n"); CLIENT_CONMSG(client, "http://www.sourcemm.net/\n"); - RETURN_META(MRES_SUPERCEDE); - } else if(strcmp(subcmd, "version") == 0) { + return true; + } + else if(strcmp(subcmd, "version") == 0) + { CLIENT_CONMSG(client, "Metamod:Source version %s\n", SOURCEMM_VERSION); CLIENT_CONMSG(client, "Compiled on: %s\n", SOURCEMM_DATE); CLIENT_CONMSG(client, "Plugin interface version: %d:%d\n", PLAPI_VERSION, PLAPI_MIN_VERSION); CLIENT_CONMSG(client, "SourceHook version: %d:%d\n", g_SourceHook.GetIfaceVersion(), g_SourceHook.GetImplVersion()); CLIENT_CONMSG(client, "http://www.sourcemm.net/\n"); - RETURN_META(MRES_SUPERCEDE); - } else if(strcmp(subcmd, "list") == 0) { + return true; + } + else if(strcmp(subcmd, "list") == 0) + { CPluginManager::CPlugin *pl; ISmmPlugin *plapi; const char *plname; @@ -773,7 +699,7 @@ void ClientCommand_handler(edict_t *client) CLIENT_CONMSG(client, "No active plugins loaded.\n"); } - RETURN_META(MRES_SUPERCEDE); + return true; } } @@ -783,13 +709,8 @@ void ClientCommand_handler(edict_t *client) CLIENT_CONMSG(client, " list - List plugins\n"); CLIENT_CONMSG(client, " version - Version information\n"); - RETURN_META(MRES_SUPERCEDE); + return true; } - RETURN_META(MRES_IGNORED); -} - -const char *GetPluginsFile() -{ - return mm_pluginsfile.GetString(); + return false; } diff --git a/sourcemm/metamod_console.h b/sourcemm/metamod_console.h new file mode 100644 index 0000000..4410bfd --- /dev/null +++ b/sourcemm/metamod_console.h @@ -0,0 +1,19 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#ifndef _INCLUDE_CONCOMMANDS_H +#define _INCLUDE_CONCOMMANDS_H + +#include "metamod_provider.h" + +bool Command_Meta(edict_t *pEdict, IMetamodSourceCommandInfo *info); +bool Command_ClientMeta(edict_t *client, IMetamodSourceCommandInfo *info); + +#endif //_INCLUDE_CONCOMMANDS_H diff --git a/sourcemm/CPlugin.h b/sourcemm/metamod_plugins.h similarity index 98% rename from sourcemm/CPlugin.h rename to sourcemm/metamod_plugins.h index b9b0784..aaec549 100644 --- a/sourcemm/CPlugin.h +++ b/sourcemm/metamod_plugins.h @@ -18,11 +18,10 @@ #include #include -#include "convar_smm.h" +#include +#include #include "IPluginManager.h" #include "oslink.h" -#include "sh_list.h" -#include "sh_string.h" /** * History of plugin versions: (M=min, C=current) diff --git a/sourcemm/util.cpp b/sourcemm/metamod_util.cpp similarity index 99% rename from sourcemm/util.cpp rename to sourcemm/metamod_util.cpp index 3e50621..f9ca9ad 100644 --- a/sourcemm/util.cpp +++ b/sourcemm/metamod_util.cpp @@ -11,7 +11,7 @@ #include #include #include -#include "util.h" +#include "metamod_util.h" #include "oslink.h" /** diff --git a/sourcemm/util.h b/sourcemm/metamod_util.h similarity index 100% rename from sourcemm/util.h rename to sourcemm/metamod_util.h diff --git a/sourcemm/msvc8/sourcemm.vcproj b/sourcemm/msvc8/sourcemm.vcproj index 615c8d1..750ab85 100644 --- a/sourcemm/msvc8/sourcemm.vcproj +++ b/sourcemm/msvc8/sourcemm.vcproj @@ -41,6 +41,7 @@ + + - - - - - - - - - + + - - - - - - - - + + &1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - $(MAKE) sourcemm - rm -rf $(BINARY) - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - -sourcemm: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true - -default: all - -clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/sourcemm/sample_mm/SamplePlugin.cpp b/sourcemm/sample_mm/SamplePlugin.cpp deleted file mode 100644 index 62c874e..0000000 --- a/sourcemm/sample_mm/SamplePlugin.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* ======== sample_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include -#include "SamplePlugin.h" -#include "cvars.h" - -//Declare the hooks we will be using in this file. Hooking will not compile without these. -//The macro naming scheme is SH_DECL_HOOKn[_void]. -//If you have 5 parameters, it would be HOOK5. If the function is void, add _void. -//It stands for "SourceHook, Declare Hook". -SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, 0, bool, char const *, char const *, char const *, char const *, bool, bool); -SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int); -SH_DECL_HOOK1_void(IServerGameDLL, GameFrame, SH_NOATTRIB, 0, bool); -SH_DECL_HOOK0_void(IServerGameDLL, LevelShutdown, SH_NOATTRIB, 0); -SH_DECL_HOOK2_void(IServerGameClients, ClientActive, SH_NOATTRIB, 0, edict_t *, bool); -SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *); -SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, char const *); -SH_DECL_HOOK1_void(IServerGameClients, SetCommandClient, SH_NOATTRIB, 0, int); -SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *); -SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char*, const char *, char *, int); -SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); -SH_DECL_HOOK2(IGameEventManager2, FireEvent, SH_NOATTRIB, 0, bool, IGameEvent *, bool); - -SamplePlugin g_SamplePlugin; -MyListener g_Listener; - -PLUGIN_EXPOSE(SamplePlugin, g_SamplePlugin); - -bool SamplePlugin::LevelInit(const char *pMapName, const char *pMapEntities, const char *pOldLevel, const char *pLandmarkName, bool loadGame, bool background) -{ - META_LOG(g_PLAPI, "LevelInit() called: pMapName=%s", pMapName); - RETURN_META_VALUE(MRES_IGNORED, true); -} - -void SamplePlugin::OnLevelShutdown() -{ - META_LOG(g_PLAPI, "OnLevelShutdown() called from listener"); -} - -void SamplePlugin::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) -{ - META_LOG(g_PLAPI, "ServerActivate() called: edictCount=%d, clientMax=%d", edictCount, clientMax); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::GameFrame(bool simulating) -{ - //don't log this, it just pumps stuff to the screen ;] - //META_LOG(g_PLAPI, "GameFrame() called: simulating=%d", simulating); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::LevelShutdown( void ) -{ - META_LOG(g_PLAPI, "LevelShutdown() called"); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::ClientActive(edict_t *pEntity, bool bLoadGame) -{ - META_LOG(g_PLAPI, "ClientActive called: pEntity=%d", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::ClientDisconnect(edict_t *pEntity) -{ - META_LOG(g_PLAPI, "ClientDisconnect called: pEntity=%d", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::ClientPutInServer(edict_t *pEntity, char const *playername) -{ - META_LOG(g_PLAPI, "ClientPutInServer called: pEntity=%d, playername=%s", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0, playername); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::SetCommandClient(int index) -{ - META_LOG(g_PLAPI, "SetCommandClient() called: index=%d", index); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::ClientSettingsChanged(edict_t *pEdict) -{ - META_LOG(g_PLAPI, "ClientSettingsChanged called: pEdict=%d", pEdict ? m_Engine->IndexOfEdict(pEdict) : 0); - RETURN_META(MRES_IGNORED); -} - -bool SamplePlugin::ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) -{ - META_LOG(g_PLAPI, "ClientConnect called: pEntity=%d, pszName=%s, pszAddress=%s", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0, pszName, pszAddress); - RETURN_META_VALUE(MRES_IGNORED, true); -} - -void SamplePlugin::ClientCommand(edict_t *pEntity) -{ - META_LOG(g_PLAPI, "ClientCommand called: pEntity=%d (commandString=%s)", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0, m_Engine->Cmd_Args() ? m_Engine->Cmd_Args() : ""); - RETURN_META(MRES_IGNORED); -} - -bool FireEvent_Handler(IGameEvent *event, bool bDontBroadcast) -{ - if (!event || !event->GetName()) - RETURN_META_VALUE(MRES_IGNORED, false); - - /** - * Note that this will only fire on game events that are already being listened to. - * For events that are not firing (such as item_pickup), you must actually - * register an event listener in the event manager. This hook is provided - * as an example for non-eiface hooks only. - */ - - const char *name = event->GetName(); - - META_LOG(g_PLAPI, "FireGameEvent called: name=%s", name); - - RETURN_META_VALUE(MRES_IGNORED, true); -} - -bool SamplePlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) -{ - PLUGIN_SAVEVARS(); - - GET_V_IFACE_ANY(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); - GET_V_IFACE_CURRENT(engineFactory, m_Engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); - GET_V_IFACE_ANY(serverFactory, m_ServerClients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS); - GET_V_IFACE_CURRENT(engineFactory, m_GameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2); - - META_LOG(g_PLAPI, "Starting plugin.\n"); - - ismm->AddListener(this, &g_Listener); - - //Init our cvars/concmds - ConCommandBaseMgr::OneTimeInit(&g_Accessor); - - //We're hooking the following things as POST, in order to seem like Server Plugins. - //However, I don't actually know if Valve has done server plugins as POST or not. - //Change the last parameter to 'false' in order to change this to PRE. - //SH_ADD_HOOK_MEMFUNC means "SourceHook, Add Hook, Member Function". - - //Hook LevelInit to our function - SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelInit, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelInit, true); - //Hook ServerActivate to our function - SH_ADD_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, m_ServerDll, &g_SamplePlugin, &SamplePlugin::ServerActivate, true); - //Hook GameFrame to our function - SH_ADD_HOOK_MEMFUNC(IServerGameDLL, GameFrame, m_ServerDll, &g_SamplePlugin, &SamplePlugin::GameFrame, true); - //Hook LevelShutdown to our function -- this makes more sense as pre I guess - SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelShutdown, false); - //Hook ClientActivate to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientActive, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientActive, true); - //Hook ClientDisconnect to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientDisconnect, true); - //Hook ClientPutInServer to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientPutInServer, true); - //Hook SetCommandClient to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, m_ServerClients, &g_SamplePlugin, &SamplePlugin::SetCommandClient, true); - //Hook ClientSettingsChanged to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientSettingsChanged, true); - - //The following functions are pre handled, because that's how they are in IServerPluginCallbacks - - //Hook ClientConnect to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientConnect, false); - //Hook ClientCommand to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientCommand, false); - - //This hook is a static hook, no member function - SH_ADD_HOOK_STATICFUNC(IGameEventManager2, FireEvent, m_GameEventManager, FireEvent_Handler, false); - - //Get the call class for IVServerEngine so we can safely call functions without - // invoking their hooks (when needed). - m_Engine_CC = SH_GET_CALLCLASS(m_Engine); - - SH_CALL(m_Engine_CC, &IVEngineServer::LogPrint)("All hooks started!\n"); - - return true; -} - -bool SamplePlugin::Unload(char *error, size_t maxlen) -{ - //IT IS CRUCIAL THAT YOU REMOVE CVARS. - //As of Metamod:Source 1.00-RC2, it will automatically remove them for you. - //But this is only if you've registered them correctly! - - //Make sure we remove any hooks we did... this may not be necessary since - //SourceHook is capable of unloading plugins' hooks itself, but just to be safe. - - SH_REMOVE_HOOK_STATICFUNC(IGameEventManager2, FireEvent, m_GameEventManager, FireEvent_Handler, false); - SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelInit, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelInit, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, m_ServerDll, &g_SamplePlugin, &SamplePlugin::ServerActivate, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, GameFrame, m_ServerDll, &g_SamplePlugin, &SamplePlugin::GameFrame, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelShutdown, false); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientActive, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientActive, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientDisconnect, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientPutInServer, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, m_ServerClients, &g_SamplePlugin, &SamplePlugin::SetCommandClient, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientSettingsChanged, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientConnect, false); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientCommand, false); - - //this, sourcehook does not keep track of. we must do this. - SH_RELEASE_CALLCLASS(m_Engine_CC); - - return true; -} - -void SamplePlugin::AllPluginsLoaded() -{ - //we don't really need this for anything other than interplugin communication - //and that's not used in this plugin. - //If we really wanted, we could override the factories so other plugins can request - // interfaces we make. In this callback, the plugin could be assured that either - // the interfaces it requires were either loaded in another plugin or not. -} - -void *MyListener::OnMetamodQuery(const char *iface, int *ret) -{ - if (strcmp(iface, "SamplePlugin")==0) - { - if (ret) - *ret = IFACE_OK; - return static_cast(&g_SamplePlugin); - } - - if (ret) - *ret = IFACE_FAILED; - - return NULL; -} diff --git a/sourcemm/sample_mm/SamplePlugin.h b/sourcemm/sample_mm/SamplePlugin.h deleted file mode 100644 index 74f5af1..0000000 --- a/sourcemm/sample_mm/SamplePlugin.h +++ /dev/null @@ -1,132 +0,0 @@ -/* ======== sample_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_SAMPLEPLUGIN_H -#define _INCLUDE_SAMPLEPLUGIN_H - -#include -#include -#include - -#define SAMPLE_VERSION "1.10" - -class SamplePlugin : public ISmmPlugin, public IMetamodListener -{ -public: - bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late); - bool Unload(char *error, size_t maxlen); - void AllPluginsLoaded(); - bool Pause(char *error, size_t maxlen) - { - return true; - } - bool Unpause(char *error, size_t maxlen) - { - return true; - } -public: - int GetApiVersion() { return PLAPI_VERSION; } -public: - const char *GetAuthor() - { - return "BAILOPAN"; - } - const char *GetName() - { - return "Sample Plugin"; - } - const char *GetDescription() - { - return "Sample plugin that hooks basic things"; - } - const char *GetURL() - { - return "http://www.sourcemm.net/"; - } - const char *GetLicense() - { - return "zlib/libpng"; - } - const char *GetVersion() - { - return SAMPLE_VERSION; - } - const char *GetDate() - { - return __DATE__; - } - const char *GetLogTag() - { - return "SAMPLE"; - } -public: - //These functions are from IServerPluginCallbacks - //Note, the parameters might be a little different to match the actual calls! - - //Called on LevelInit. Server plugins only have pMapName - bool LevelInit(const char *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background); - - //Called on ServerActivate. Same definition as server plugins - void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); - - //Called on a game tick. Same definition as server plugins - void GameFrame(bool simulating); - - //Called on level shutdown. Same definition as server plugins - void LevelShutdown(void); - - //Client is activate (whatever that means). We get an extra parameter... - // "If bLoadGame is true, don't spawn the player because its state is already setup." - void ClientActive(edict_t *pEntity, bool bLoadGame); - - //Client disconnects - same as server plugins - void ClientDisconnect(edict_t *pEntity); - - //Client is put in server - same as server plugins - void ClientPutInServer(edict_t *pEntity, char const *playername); - - //Sets the client index - same as server plugins - void SetCommandClient(int index); - - //Called on client settings changed (duh) - same as server plugins - void ClientSettingsChanged(edict_t *pEdict); - - //Called on client connect. Unlike server plugins, we return whether the - // connection is allowed rather than set it through a pointer in the first parameter. - // You can still supercede the GameDLL through RETURN_META_VALUE(MRES_SUPERCEDE, true/false) - bool ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); - - //Called when a client uses a command. Unlike server plugins, it's void. - // You can still supercede the gamedll through RETURN_META(MRES_SUPERCEDE). - void ClientCommand(edict_t *pEntity); - - //From IMetamodListener - virtual void OnLevelShutdown(); - -private: - IGameEventManager2 *m_GameEventManager; - IVEngineServer *m_Engine; - IServerGameDLL *m_ServerDll; - IServerGameClients *m_ServerClients; - SourceHook::CallClass *m_Engine_CC; -}; - -class MyListener : public IMetamodListener -{ -public: - virtual void *OnMetamodQuery(const char *iface, int *ret); -}; - -extern SamplePlugin g_SamplePlugin; -PLUGIN_GLOBALVARS(); - -bool FireEvent_Handler(IGameEvent *event, bool bDontBroadcast); - -#endif //_INCLUDE_SAMPLEPLUGIN_H diff --git a/sourcemm/sample_mm/cvars.cpp b/sourcemm/sample_mm/cvars.cpp deleted file mode 100644 index 4a6c16a..0000000 --- a/sourcemm/sample_mm/cvars.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* ======== sample_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include "SamplePlugin.h" -#include "cvars.h" - -SampleAccessor g_Accessor; - -ConVar g_MyConVar("sample_version", SAMPLE_VERSION, FCVAR_SPONLY, "Sample Plugin version"); - -bool SampleAccessor::RegisterConCommandBase(ConCommandBase *pVar) -{ - //this will work on any type of concmd! - return META_REGCVAR(pVar); -} - -CON_COMMAND(sample_cmd, "Sample Plugin command") -{ - META_LOG(g_PLAPI, "This sentence is in Spanish when you're not looking."); -} diff --git a/sourcemm/sample_mm/cvars.h b/sourcemm/sample_mm/cvars.h deleted file mode 100644 index 9bc6286..0000000 --- a/sourcemm/sample_mm/cvars.h +++ /dev/null @@ -1,24 +0,0 @@ -/* ======== sample_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_CVARS_H -#define _INCLUDE_CVARS_H - -#include - -class SampleAccessor : public IConCommandBaseAccessor -{ -public: - virtual bool RegisterConCommandBase(ConCommandBase *pVar); -}; - -extern SampleAccessor g_Accessor; - -#endif //_INCLUDE_CVARS_H diff --git a/sourcemm/sample_mm/msvc8/sample_mm.sln b/sourcemm/sample_mm/msvc8/sample_mm.sln deleted file mode 100644 index df4b2fb..0000000 --- a/sourcemm/sample_mm/msvc8/sample_mm.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_mm", "sample_mm.vcproj", "{FAFF34FB-FE14-47B5-81BD-70D237392FB2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug|Win32.ActiveCfg = Debug|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug|Win32.Build.0 = Debug|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release|Win32.ActiveCfg = Release|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/sourcemm/sample_mm/msvc8/sample_mm.vcproj b/sourcemm/sample_mm/msvc8/sample_mm.vcproj deleted file mode 100644 index 9886076..0000000 --- a/sourcemm/sample_mm/msvc8/sample_mm.vcproj +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/sourcemm.cpp b/sourcemm/sourcemm.cpp deleted file mode 100644 index 477ef17..0000000 --- a/sourcemm/sourcemm.cpp +++ /dev/null @@ -1,710 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * Contributor(s): Scott "Damaged Soul" Ehlert - * : Pavol "PM OnoTo" Marko - * ============================ - */ - -#include -#include -#include -#include "sourcemm.h" -#include "concommands.h" -#include "CSmmAPI.h" -#include "CPlugin.h" -#include "util.h" -#include "vsp_listener.h" - -using namespace SourceMM; - -/** - * @brief Implementation of main SourceMM GameDLL functionality - * @file sourcemm.cpp - */ - -#undef CommandLine -DLL_IMPORT ICommandLine *CommandLine(); - -SH_DECL_HOOK4(IServerGameDLL, DLLInit, SH_NOATTRIB, false, bool, CreateInterfaceFn, CreateInterfaceFn, CreateInterfaceFn, CGlobalVars *); -SH_DECL_HOOK0_void(IServerGameDLL, DLLShutdown, SH_NOATTRIB, false); -SH_DECL_HOOK0_void(IServerGameDLL, LevelShutdown, SH_NOATTRIB, false); -SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, false, bool, const char *, const char *, const char *, const char *, bool, bool); -SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); -SH_DECL_HOOK0(IServerGameDLL, GameInit, SH_NOATTRIB, false, bool); - -bool DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); -bool DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); -void DLLShutdown_handler(); -void LevelShutdown_handler(); -bool LevelInit_handler(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background); -bool GameInit_handler(); - -GameDllInfo g_GameDll = {false, NULL, NULL, NULL, NULL}; -EngineInfo g_Engine; -SourceHook::CSourceHookImpl g_SourceHook; -SourceHook::ISourceHook *g_SHPtr = &g_SourceHook; -SourceHook::String g_ModPath; -SourceHook::String g_BinPath; -SourceHook::String g_SmmPath; -PluginId g_PLID = Pl_Console; /* Technically, SourceMM is the "Console" plugin... :p */ -bool bInFirstLevel = true; -bool gParsedGameInfo = false; -bool bGameInit = false; -SourceHook::List gamedll_list; -SourceHook::CallClass *g_GameDllPatch; -int g_GameDllVersion = 0; -int g_GameClientsVersion = 0; -int g_VspVersion = 0; -int g_SourceEngineVersion = SOURCE_ENGINE_ORIGINAL; -const char VSPIFACE[] = "ISERVERPLUGINCALLBACKS"; -const char GAMEINFO_PATH[] = "|gameinfo_path|"; - -void ClearGamedllList(); - -/* Helper Macro */ -#define IFACE_MACRO(orig,nam) \ - CPluginManager::CPlugin *pl; \ - SourceHook::List::iterator event; \ - IMetamodListener *api; \ - int mret = 0; \ - void *val = NULL; \ - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ - pl = (*iter); \ - for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ - api = (*event); \ - mret = IFACE_FAILED; \ - if ( (val=api->On##nam##Query(iface, &mret)) != NULL ) { \ - if (ret) *ret = mret; \ - return val; \ - } \ - } \ - } \ - return (orig)(iface, ret); - -#define ITER_EVENT(evn, args) \ - CPluginManager::CPlugin *pl; \ - SourceHook::List::iterator event; \ - IMetamodListener *api; \ - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ - pl = (*iter); \ - for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ - api = (*event); \ - api->evn args; \ - } \ - } - -/////////////////////////////////// -// Main code for HL2 Interaction // -/////////////////////////////////// - -/* Initialize everything here */ -void InitMainStates() -{ - char full_path[PATH_SIZE] = {0}; - GetFileOfAddress((void *)g_GameDll.factory, full_path, sizeof(full_path)); - g_BinPath.assign(full_path); - - /* Like Metamod, reload plugins at the end of the map. - * This is so plugins can hook everything on load, BUT, new plugins will be reloaded - * if the server is shut down (silly, but rare case). - */ - bInFirstLevel = true; - - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, DLLInit, g_GameDll.pGameDLL, DLLInit, false); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, DLLInit, g_GameDll.pGameDLL, DLLInit_Post, true); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, DLLShutdown, g_GameDll.pGameDLL, DLLShutdown_handler, false); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, LevelShutdown, g_GameDll.pGameDLL, LevelShutdown_handler, true); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, LevelInit, g_GameDll.pGameDLL, LevelInit_handler, true); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, GameInit, g_GameDll.pGameDLL, GameInit_handler, false); -} - -bool DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) -{ - g_Engine.engineFactory = engineFactory; - g_Engine.fileSystemFactory = filesystemFactory; - g_Engine.physicsFactory = physicsFactory; - g_Engine.pGlobals = pGlobals; - - g_Engine.engine = (IVEngineServer *)((engineFactory)(INTERFACEVERSION_VENGINESERVER, NULL)); - if (!g_Engine.engine) - { - Error("Could not find IVEngineServer! Metamod cannot load."); - return false; - } - g_Engine.icvar = (ICvar *)((engineFactory)(VENGINE_CVAR_INTERFACE_VERSION , NULL)); - if (!g_Engine.icvar) - { - Error("Could not find ICvar! Metamod cannot load."); - return false; - } - - g_Engine.loaded = true; - - /* Initialize our console hooks */ - ConCommandBaseMgr::OneTimeInit(static_cast(&g_SMConVarAccessor)); - - g_GameDllPatch = SH_GET_CALLCLASS(g_GameDll.pGameDLL); - - if (g_GameDll.pGameClients) - { - SH_ADD_HOOK_STATICFUNC(IServerGameClients, ClientCommand, g_GameDll.pGameClients, ClientCommand_handler, false); - } else { - /* If IServerGameClients isn't found, this really isn't a fatal error so... */ - LogMessage("[META] Warning: Could not find IServerGameClients!"); - LogMessage("[META] Warning: The 'meta' command will not be available to clients."); - } - - if (!g_SmmAPI.CacheCmds()) - { - LogMessage("[META] Warning: Failed to initialize Con_Printf. Defaulting to Msg()."); - LogMessage("[META] Warning: Console messages will not be redirected to rcon console."); - } - - if (!g_SmmAPI.CacheUserMessages()) - { - /* Don't know of a mod that has stripped out user messages completely, - * but perhaps should do something different here? - */ - LogMessage("[META] Warning: Failed to get list of user messages."); - LogMessage("[META] Warning: The 'meta game' command will not display user messages."); - } - - const char *pluginFile = g_Engine.icvar->GetCommandLineValue("mm_pluginsfile"); - if (!pluginFile) - { - pluginFile = GetPluginsFile(); - } - - char full_path[260]; - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), pluginFile); - - LoadPluginsFromFile(full_path); - - bInFirstLevel = true; - - RETURN_META_VALUE(MRES_IGNORED, true); -} - -bool GameInit_handler() -{ - if (bGameInit) - { - return true; - } - - if (g_SmmAPI.VSPEnabled()) - { - g_SmmAPI.LoadAsVSP(); - } - - bGameInit = true; - - RETURN_META_VALUE(MRES_IGNORED, true); -} - -bool DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) -{ - g_PluginMngr.SetAllLoaded(); - RETURN_META_VALUE(MRES_IGNORED, true); -} - -/* This is where the magic happens */ -SMM_API void *CreateInterface(const char *iface, int *ret) -{ - /* Prevent loading of self as a SourceMM plugin or Valve server plugin :x */ - if (strcmp(iface, PLAPI_NAME) == 0) - { - Warning("Do not try loading Metamod:Source as a plugin.\n"); - - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - if (strncmp(iface, VSPIFACE, 22) == 0) - { - g_VspVersion = atoi(&(iface[22])); - - if (g_VspVersion <= MAX_VSP_VERSION) - { - if (ret) - { - *ret = IFACE_OK; - } - return &g_VspListener; - } - } - - if (!gParsedGameInfo) - { - gParsedGameInfo = true; - const char *gameDir = NULL; - char gamePath[PATH_SIZE]; - char smmPath[PATH_SIZE]; - - /* Get path to SourceMM DLL */ - if (!GetFileOfAddress((void *)CreateInterface, smmPath, sizeof(smmPath))) - { - Error("GetFileOfAddress() failed! Metamod cannot load.\n"); - return NULL; - } - - g_SmmPath.assign(smmPath); - - /* Get value of -game from command line, defaulting to hl2 as engine seems to do */ - gameDir = CommandLine()->ParmValue("-game", "hl2"); - - /* Get absolute path */ - abspath(gamePath, gameDir); - g_ModPath.assign(gamePath); - - char tempPath[PATH_SIZE]; - - /* Path to gameinfo.txt */ - g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s", g_ModPath.c_str(), "gameinfo.txt"); - - FILE *fp = fopen(tempPath, "rt"); - - if (!fp) - { - Error("Unable to open gameinfo.txt! Metamod cannot load.\n"); - return NULL; - } - - char buffer[255]; - char key[128], val[128]; - bool search = false; - bool gamebin = false; - char *ptr; - const char *lptr; - char curPath[PATH_SIZE]; - - getcwd(curPath, PATH_SIZE); - - while (!feof(fp)) - { - buffer[0] = '\0'; - fgets(buffer, sizeof(buffer), fp); - UTIL_TrimComments(buffer); - UTIL_TrimLeft(buffer); - UTIL_TrimRight(buffer); - if (stricmp(buffer, "SearchPaths") == 0) - search = true; - if (!search) - continue; - UTIL_KeySplit(buffer, key, sizeof(key) - 1, val, sizeof(val) - 1); - if (stricmp(key, "Game") == 0 || stricmp(key, "GameBin") == 0) - { - if (stricmp(key, "Game") == 0) - gamebin = false; - else - gamebin = true; - - if (strncmp(val, GAMEINFO_PATH, sizeof(GAMEINFO_PATH) - 1) == 0) - { - ptr = &(val[sizeof(GAMEINFO_PATH) - 1]); - if (ptr[0] == '.') - ptr++; - lptr = g_ModPath.c_str(); - } else { - ptr = val; - lptr = curPath; - } - - size_t ptr_len = strlen(ptr); - if (ptr[ptr_len] == '/' || ptr[ptr_len] == '\\') - ptr[--ptr_len] = '\0'; - - /* No need to append "bin" if key is GameBin */ - if (gamebin) - { - g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s/%s", lptr, ptr, SERVER_DLL); - } else if (!ptr[0]) { - g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s/%s", lptr, "bin", SERVER_DLL); - } else { - g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s/%s/%s", lptr, ptr, "bin", SERVER_DLL); - } - - /* If not path to SourceMM... */ - if (!UTIL_PathCmp(smmPath, tempPath)) - { - FILE *fp = fopen(tempPath, "rb"); - if (!fp) - continue; - //:TODO: Optimize this a bit! - SourceHook::List::iterator iter; - GameDllInfo *pCheck; - bool found = false; - for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) - { - pCheck = (*iter); - if (GetFileOfAddress((void *)pCheck->factory, buffer, sizeof(buffer))) - { - if (UTIL_PathCmp(tempPath, buffer)) - { - found = true; - break; - } - } - } - if (found) - continue; - fclose(fp); - HINSTANCE gamedll = dlmount(tempPath); - if (gamedll == NULL) - continue; - CreateInterfaceFn fn = (CreateInterfaceFn)dlsym(gamedll, "CreateInterface"); - if (fn == NULL) - { - dlclose(gamedll); - continue; - } - GameDllInfo *pInfo = new GameDllInfo; - pInfo->factory = fn; - pInfo->lib = gamedll; - pInfo->loaded = true; - pInfo->pGameDLL = NULL; - gamedll_list.push_back(pInfo); - break; - } - } - } - fclose(fp); - } - - if (!g_GameDll.loaded) - { - const char *str = "ServerGameDLL"; - size_t len = strlen(str); - - if (strncmp(iface, str, len) == 0) - { - /* This is the interface we want! Right now we support versions 3 through 8 */ - g_GameDllVersion = atoi(&(iface[len])); - if (g_GameDllVersion < MIN_GAMEDLL_VERSION) - { - if (ret) - { - *ret = IFACE_FAILED; - } - } - else if (g_GameDllVersion > 3) - { - /* The engine is at least episode 1 */ - g_SourceEngineVersion = SOURCE_ENGINE_EPISODEONE; - } - SourceHook::List::iterator iter; - GameDllInfo *pInfo = NULL; - void *ptr; - for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) - { - pInfo = (*iter); - ptr = (pInfo->factory)(iface, ret); - if (ptr) - { - /* This is our GameDLL. Unload the others. */ - gamedll_list.erase(iter); - ClearGamedllList(); - pInfo->pGameDLL = static_cast(ptr); - g_GameDll = *pInfo; - delete pInfo; - break; - } - } - if (g_GameDll.loaded) - { - InitMainStates(); - } else { - if (ret) - { - *ret = IFACE_FAILED; - } - return NULL; - } - } else { - /* wtf do we do... */ - /* :TODO: .. something a bit more intelligent? */ - Error("Engine requested unknown interface before GameDLL was known!\n"); - return NULL; - } - } - - /* We use this interface for responding to the meta client command */ - if (strncmp(iface, "ServerGameClients", 17) == 0) - { - void *ptr = (g_GameDll.factory)(iface, ret); - g_GameDll.pGameClients = static_cast(ptr); - g_GameClientsVersion = atoi(&iface[17]); - - return ptr; - } - - /* If we got here, there's definitely a GameDLL */ - IFACE_MACRO(g_GameDll.factory, GameDLL); -} - -void ClearGamedllList() -{ - SourceHook::List::iterator iter; - - GameDllInfo *pInfo; - for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) - { - pInfo = (*iter); - dlclose(pInfo->lib); - delete pInfo; - } - - gamedll_list.clear(); -} - -void DLLShutdown_handler() -{ - /* Unload plugins */ - g_PluginMngr.UnloadAll(); - - /* Add the FCVAR_GAMEDLL flag to our cvars so the engine removes them properly */ - g_SMConVarAccessor.MarkCommandsAsGameDLL(); - g_SMConVarAccessor.UnregisterGameDLLCommands(); - - SH_CALL(g_GameDllPatch, &IServerGameDLL::DLLShutdown)(); - - SH_RELEASE_CALLCLASS(g_GameDllPatch); - g_GameDllPatch = NULL; - - g_SourceHook.CompleteShutdown(); - - if (g_GameDll.lib && g_GameDll.loaded) - dlclose(g_GameDll.lib); - memset(&g_GameDll, 0, sizeof(GameDllInfo)); - - RETURN_META(MRES_SUPERCEDE); -} - -int LoadPluginsFromFile(const char *_file) -{ - FILE *fp; - int total = 0, skipped=0; - PluginId id; - bool already; - - fp = fopen(_file, "rt"); - if (!fp) - { - LogMessage("[META] Could not open plugins file %s\n", _file); - return -1; - } - - char buffer[255], error[255], full_path[255]; - const char *ptr, *ext, *file; - size_t length; - while (!feof(fp)) - { - buffer[0] = '\0'; - fgets(buffer, sizeof(buffer), fp); - length = strlen(buffer); - if (!length) - continue; - if (buffer[length-1] == '\n') - buffer[--length] = '\0'; - - UTIL_TrimLeft(buffer); - UTIL_TrimRight(buffer); - - if (buffer[0] == '\0' || buffer[0] == ';' || strncmp(buffer, "//", 2) == 0) - continue; - file = buffer; - if (buffer[0] == '"') - { - char *cptr = buffer; - file = ++cptr; - - while (*cptr) - { - if (*cptr == '"') - { - *cptr = '\0'; - break; - } - cptr++; - } - } else { - char *cptr = buffer; - while (*cptr) - { - if (isspace(*cptr)) - { - char *optr = cptr; - while (*cptr && isspace(*cptr)) - cptr++; - *optr = '\0'; - UTIL_TrimRight(cptr); - if (*cptr && isalpha(*cptr)) - { - g_PluginMngr.SetAlias(buffer, cptr); - file = cptr; - } - break; - } - cptr++; - } - } - if (!file[0]) - { - continue; - } - /* First find if it's an absolute path or not... */ - if (file[0] == '/' || strncmp(&(file[1]), ":\\", 2) == 0) - { - /* If we're in an absolute path, ignore our normal heuristics */ - id = g_PluginMngr.Load(file, Pl_File, already, error, sizeof(error)); - if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) - { - LogMessage("[META] Failed to load plugin %s. %s", buffer, error); - } else { - if (already) - skipped++; - else - total++; - } - } else { - /* Attempt to find a file extension */ - ptr = UTIL_GetExtension(file); - /* Add an extension if there's none there */ - if (!ptr) - { -#if defined WIN32 || defined _WIN32 - ext = ".dll"; -#else - ext = "_i486.so"; -#endif - } else { - ext = ""; - } - /* Format the new path */ - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); - id = g_PluginMngr.Load(full_path, Pl_File, already, error, sizeof(error)); - if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) - { - LogMessage("[META] Failed to load plugin %s. %s", buffer, error); - } else { - if (already) - skipped++; - else - total++; - } - } - } - fclose(fp); - - if (skipped) - { - LogMessage("[META] Loaded %d plugins from file (%d already loaded)", total, skipped); - } else { - LogMessage("[META] Loaded %d plugins from file.", total); - } - - return total; -} - -/* Wrapper function. This is called when the GameDLL thinks it's using - * the engine's real engineFactory. - */ -void *EngineFactory(const char *iface, int *ret) -{ - IFACE_MACRO(g_Engine.engineFactory, Engine); -} - -/* Wrapper function. This is called when the GameDLL thinks it's using - * the engine's real physicsFactory. - */ -void *PhysicsFactory(const char *iface, int *ret) -{ - IFACE_MACRO(g_Engine.physicsFactory, Physics); -} - -/* Wrapper function. This is called when the GameDLL thinks it's using - * the engine's real fileSystemFactory. - */ -void *FileSystemFactory(const char *iface, int *ret) -{ - IFACE_MACRO(g_Engine.fileSystemFactory, FileSystem); -} - -void LogMessage(const char *msg, ...) -{ - va_list ap; - static char buffer[2048]; - - va_start(ap, msg); - size_t len = vsnprintf(buffer, sizeof(buffer) - 2, msg, ap); - va_end(ap); - - buffer[len++] = '\n'; - buffer[len] = '\0'; - - if (!g_Engine.engine) - { - fprintf(stdout, "%s", buffer); - } else { - g_Engine.engine->LogPrint(buffer); - } -} - -void LevelShutdown_handler(void) -{ - if (!bInFirstLevel) - { - char full_path[255]; - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), GetPluginsFile()); - - LoadPluginsFromFile(full_path); - } else { - bInFirstLevel = false; - } - - ITER_EVENT(OnLevelShutdown, ()); - - RETURN_META(MRES_IGNORED); -} - -bool LevelInit_handler(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background) -{ - if (!g_SmmAPI.CmdCacheSuccessful()) - { - LogMessage("[META] Warning: Failed to initialize Con_Printf. Defaulting to Msg()."); - LogMessage("[META] Warning: Console messages will not be redirected to rcon console."); - } - - ITER_EVENT(OnLevelInit, (pMapName, pMapEntities, pOldLevel, pLandmarkName, loadGame, background)); - - RETURN_META_VALUE(MRES_IGNORED, false); -} - -#if defined __GNUC__ && (__GNUC__ == 3 || __GNUC__ == 4) -void * operator new(size_t size) { - return(calloc(1, size)); -} - -void * operator new[](size_t size) { - return(calloc(1, size)); -} - -void operator delete(void * ptr) { - if(ptr) - free(ptr); -} - -void operator delete[](void * ptr) { - if(ptr) - free(ptr); -} -#endif diff --git a/sourcemm/sourcemm.h b/sourcemm/sourcemm.h deleted file mode 100644 index 24bf5fd..0000000 --- a/sourcemm/sourcemm.h +++ /dev/null @@ -1,131 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_SOURCEMM_H -#define _INCLUDE_SOURCEMM_H - -/** - * @brief SourceMM main functionality for GameDLL interception - * @file sourcemm.h - */ - -#include -#include -#include -#include -#include -#include "ISmmAPI.h" -#include "CPlugin.h" -#include "oslink.h" -#include "util.h" -#include "svn_version.h" - -/** - * Versioning - * increase api_major when API breaks - * increase api_minor when new functions are added (non-breaking) - */ -#define SOURCEMM_VERSION SVN_FILE_VERSION_STRING -#define SOURCEMM_DATE __DATE__ -#define SM_VERS_API_MAJOR 1 //increase this on a breaking change -#define SM_VERS_API_MINOR 7 //increase this on a non-breaking API change - -/* We need a good CServerGameDLL version to work properly. We support these inclusively. */ -#define MIN_GAMEDLL_VERSION 3 - -/* Maximum version of IServerPluginCallbacks that SourceMM supports */ -#define MAX_VSP_VERSION 2 - -/** @brief Entry point for HL2 Engine */ -SMM_API void *CreateInterface(const char *name, int *code); - -/** @brief Wrapper to catch GameDLL calls */ -void *EngineFactory(const char *name, int *code); - -/** @brief Wrapper to catch GameDLL calls */ -void *PhysicsFactory(const char *name, int *code); - -/** @brief Wrapper to catch GameDLL calls */ -void *FileSystemFactory(const char *name, int *code); - -/** @brief Loads all plugins found in a file */ -int LoadPluginsFromFile(const char *file); - -/** @brief Logs a message to the standard log file */ -void LogMessage(const char *msg, ...); - -/** @brief Stores information about the GameDLL */ -struct GameDllInfo -{ - bool loaded; - HINSTANCE lib; - CreateInterfaceFn factory; - IServerGameDLL *pGameDLL; - IServerGameClients *pGameClients; -}; - -/** @brief Stores information about the HL2 Engine pointers */ -struct EngineInfo -{ - EngineInfo() : loaded(false), - engineFactory(NULL), physicsFactory(NULL), fileSystemFactory(NULL), - pGlobals(NULL), icvar(NULL), engine(NULL) - { }; - bool loaded; - CreateInterfaceFn engineFactory; - CreateInterfaceFn physicsFactory; - CreateInterfaceFn fileSystemFactory; - CGlobalVars *pGlobals; - ICvar *icvar; - IVEngineServer *engine; -}; - -/** @brief Global variable for GameDLL info */ -extern GameDllInfo g_GameDll; - -/** @brief Global variable for Engine info */ -extern EngineInfo g_Engine; - -/** @brief Global singleton for SourceHook */ -extern SourceHook::CSourceHookImpl g_SourceHook; - -/** @brief Mod path (important!)*/ -extern SourceHook::String g_ModPath; - -/** @brief Path to server binary */ -extern SourceHook::String g_BinPath; - -/** @brief Path to SourceMM binary */ -extern SourceHook::String g_SmmPath; - -/** @brief Global variable for SourceHook macros */ -extern SourceHook::ISourceHook *g_SHPtr; - -/** @brief We have our own internal plugin id... */ -extern PluginId g_PLID; - -/** @brief ServerGameDLL version that is currently loaded */ -extern int g_GameDllVersion; - -/** @brief Highest IServerPluginCallbacks version that is supported by engine */ -extern int g_VspVersion; - -/** @brief IServerGameClients version the mod uses */ -extern int g_GameClientsVersion; - -/** @brief Source Engine version */ -extern int g_SourceEngineVersion; - -extern bool bGameInit; - -/** @brief Global CallClass for IServerGameDLL */ -extern SourceHook::CallClass *g_GameDllPatch; - -#endif //_INCLUDE_SOURCEMM_H diff --git a/sourcemm/stub_mm/LICENSE.txt b/sourcemm/stub_mm/LICENSE.txt deleted file mode 100644 index bf9f1fd..0000000 --- a/sourcemm/stub_mm/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -The software is Copyright (C) 2004-2007, Metamod:Source Development Team. - -Metamod:Source is distributed under the "zLib/libpng" license, which is reproduced -below: - ------------------------------------------------------------------------------ - -This software is provided "as-is", without any express or implied warranty. -In no event will the authors be held liable for any damages arising from -the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software in - a product, an acknowledgment in the product documentation would be - appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not - be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. - ------------------------------------------------------------------------------ - -The zLib/libpng license has been approved by the "Open Source Initiative" -organization. diff --git a/sourcemm/stub_mm/Makefile b/sourcemm/stub_mm/Makefile deleted file mode 100644 index eec1eb9..0000000 --- a/sourcemm/stub_mm/Makefile +++ /dev/null @@ -1,66 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson - -HL2SDK = ../../../hl2sdk -SMM_ROOT = ../.. -SRCDS = ~/srcds - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O3 -funroll-loops -s -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = stub_mm_i486.so - -HL2PUB = $(HL2SDK)/public - -OBJECTS = stub_mm.cpp - -LINK = vstdlib_i486.so tier0_i486.so -static-libgcc - -INCLUDE = -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ - -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook -I$(SMM_ROOT)/sourcemm - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - $(MAKE) sourcemm - rm -rf $(BINARY) - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - -sourcemm: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true - -default: all - -clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/sourcemm/stub_mm/msvc8/stub_mm.sln b/sourcemm/stub_mm/msvc8/stub_mm.sln deleted file mode 100644 index 4e0655b..0000000 --- a/sourcemm/stub_mm/msvc8/stub_mm.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stub_mm", "stub_mm.vcproj", "{836E726E-AB80-43AB-9A8F-0E6EE680B0F6}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug|Win32.ActiveCfg = Debug|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug|Win32.Build.0 = Debug|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release|Win32.ActiveCfg = Release|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/sourcemm/stub_mm/msvc8/stub_mm.vcproj b/sourcemm/stub_mm/msvc8/stub_mm.vcproj deleted file mode 100644 index 6490884..0000000 --- a/sourcemm/stub_mm/msvc8/stub_mm.vcproj +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/stub_mm/stub_mm.cpp b/sourcemm/stub_mm/stub_mm.cpp deleted file mode 100644 index f43ed53..0000000 --- a/sourcemm/stub_mm/stub_mm.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* ======== stub_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include -#include "stub_mm.h" - -SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int); - -StubPlugin g_StubPlugin; - -PLUGIN_EXPOSE(SamplePlugin, g_StubPlugin); - -void ServerActivate_handler(edict_t *pEdictList, int edictCount, int clientMax) -{ - META_LOG(g_PLAPI, "ServerActivate() called: edictCount=%d, clientMax=%d", edictCount, clientMax); - RETURN_META(MRES_IGNORED); -} - -bool StubPlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) -{ - PLUGIN_SAVEVARS(); - - GET_V_IFACE_ANY(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); - - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, ServerActivate, m_ServerDll, ServerActivate_handler, true); - - return true; -} - -bool StubPlugin::Unload(char *error, size_t maxlen) -{ - SH_REMOVE_HOOK_STATICFUNC(IServerGameDLL, ServerActivate, m_ServerDll, ServerActivate_handler, true); - - return true; -} - -bool StubPlugin::Pause(char *error, size_t maxlen) -{ - return true; -} - -bool StubPlugin::Unpause(char *error, size_t maxlen) -{ - return true; -} - -void StubPlugin::AllPluginsLoaded() -{ - //This is an example of inter-plugin communication - PluginId id; - void *ptr = g_SMAPI->MetaFactory("SamplePlugin", NULL, &id); - if (ptr) - { - META_LOG(g_PLAPI, "Found Sample Plugin[%d] at (%p)!", id, ptr); - } else { - META_LOG(g_PLAPI, "Did not find Sample Plugin!"); - } -} - -const char *StubPlugin::GetAuthor() -{ - return "AUTHOR"; -} - -const char *StubPlugin::GetName() -{ - return "Stub Plugin"; -} - -const char *StubPlugin::GetDescription() -{ - return "Stub Plugin"; -} - -const char *StubPlugin::GetURL() -{ - return "http://www.mysite.com/"; -} - -const char *StubPlugin::GetLicense() -{ - return "zlib/libpng"; -} - -const char *StubPlugin::GetVersion() -{ - return "1.00"; -} - -const char *StubPlugin::GetDate() -{ - return __DATE__; -} - -const char *StubPlugin::GetLogTag() -{ - return "STUB"; -} diff --git a/sourcemm/stub_mm/stub_mm.h b/sourcemm/stub_mm/stub_mm.h deleted file mode 100644 index fec6701..0000000 --- a/sourcemm/stub_mm/stub_mm.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ======== stub_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_SAMPLEPLUGIN_H -#define _INCLUDE_SAMPLEPLUGIN_H - -#include - -class StubPlugin : public ISmmPlugin -{ -public: - bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late); - bool Unload(char *error, size_t maxlen); - bool Pause(char *error, size_t maxlen); - bool Unpause(char *error, size_t maxlen); - void AllPluginsLoaded(); -public: - const char *GetAuthor(); - const char *GetName(); - const char *GetDescription(); - const char *GetURL(); - const char *GetLicense(); - const char *GetVersion(); - const char *GetDate(); - const char *GetLogTag(); -private: - IServerGameDLL *m_ServerDll; - IServerGameDLL *m_ServerDll_CC; -}; - -extern StubPlugin g_StubPlugin; - -PLUGIN_GLOBALVARS(); - -//Called on ServerActivate. Same definition as server plugins -void ServerActivate_handler(edict_t *pEdictList, int edictCount, int clientMax); - -#endif //_INCLUDE_SAMPLEPLUGIN_H diff --git a/sourcemm/vsp_listener.cpp b/sourcemm/vsp_listener.cpp deleted file mode 100644 index c02a230..0000000 --- a/sourcemm/vsp_listener.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include "vsp_listener.h" -#include "CPlugin.h" - -using namespace SourceMM; - -VSPListener g_VspListener; - -VSPListener::VSPListener() -{ - m_Loaded = false; - m_Loadable = false; -} - -void VSPListener::ClientActive(edict_t *pEntity) -{ -} - -PLUGIN_RESULT VSPListener::ClientCommand(edict_t *pEntity) -{ - return PLUGIN_CONTINUE; -} - -PLUGIN_RESULT VSPListener::ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::ClientDisconnect(edict_t *pEntity) -{ -} - -void VSPListener::ClientPutInServer(edict_t *pEntity, char const *playername) -{ -} - -void VSPListener::ClientSettingsChanged(edict_t *pEdict) -{ -} - -void VSPListener::SetCommandClient(int index) -{ -} - -void VSPListener::GameFrame(bool simulating) -{ -} - -const char *VSPListener::GetPluginDescription() -{ - return "Metamod:Source Interface v" SOURCEMM_VERSION; -} - -bool VSPListener::IsLoaded() -{ - return m_Loaded; -} - -void VSPListener::LevelInit(char const *pMapName) -{ -} - -void VSPListener::LevelShutdown() -{ -} - -PLUGIN_RESULT VSPListener::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::Pause() -{ -} - -void VSPListener::UnPause() -{ -} - -void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) -{ -} - -void VSPListener::Unload() -{ -} - -void VSPListener::SetLoadable(bool set) -{ - m_Loadable = set; -} - -bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) -{ - if (!g_GameDll.loaded) - { - Error("Metamod:Source is not a Valve Server Plugin\n"); - - return false; - } - - if (!m_Loadable) - { - Warning("Do not manually load Metamod:Source as a Valve Server Plugin\n"); - - return false; - } - - if (m_Loaded) - { - return false; - } - - m_Loaded = true; - SetLoadable(false); - - PluginIter iter; - CPluginManager::CPlugin *pPlugin; - SourceHook::List::iterator event; - IMetamodListener *pML; - for (iter=g_PluginMngr._begin(); iter!=g_PluginMngr._end(); iter++) - { - pPlugin = (*iter); - if (pPlugin->m_Status < Pl_Paused) - { - continue; - } - /* Only valid for plugins >= 10 (v1:5, SourceMM 1.4) */ - if (pPlugin->m_API->GetApiVersion() < 10) - { - continue; - } - for (event=pPlugin->m_Events.begin(); - event!=pPlugin->m_Events.end(); - event++) - { - pML = (*event); - pML->OnVSPListening(this); - } - } - - return true; -} diff --git a/sourcemm/vsp_listener.h b/sourcemm/vsp_listener.h deleted file mode 100644 index 44b7b60..0000000 --- a/sourcemm/vsp_listener.h +++ /dev/null @@ -1,49 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_SOURCEMM_VSPLISTENER_H_ -#define _INCLUDE_SOURCEMM_VSPLISTENER_H_ - -#include "sourcemm.h" -#include "iserverplugin.h" - -class VSPListener : public IServerPluginCallbacks -{ -public: - VSPListener(); -public: - virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory); - virtual void Unload(); - virtual void Pause(); - virtual void UnPause(); - virtual const char *GetPluginDescription(); - virtual void LevelInit(char const *pMapName); - virtual void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); - virtual void GameFrame(bool simulating); - virtual void LevelShutdown(void); - virtual void ClientActive(edict_t *pEntity); - virtual void ClientDisconnect(edict_t *pEntity); - virtual void ClientPutInServer(edict_t *pEntity, char const *playername); - virtual void SetCommandClient(int index); - virtual void ClientSettingsChanged(edict_t *pEdict); - virtual PLUGIN_RESULT ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); - virtual PLUGIN_RESULT ClientCommand(edict_t *pEntity); - virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID); -public: - bool IsLoaded(); - void SetLoadable(bool loadable); -private: - bool m_Loaded; - bool m_Loadable; -}; - -extern VSPListener g_VspListener; - -#endif //_INCLUDE_SOURCEMM_VSPLISTENER_H_ From aa7d63bc5fe1b9a41a5c23e916a9889323c6ba65 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 22 Sep 2007 21:23:16 +0000 Subject: [PATCH 07/25] committed two forgotten files --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40428 --- sourcemm/metamod_provider.h | 288 ++++++++++++++++++++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100644 sourcemm/metamod_provider.h diff --git a/sourcemm/metamod_provider.h b/sourcemm/metamod_provider.h new file mode 100644 index 0000000..b9978eb --- /dev/null +++ b/sourcemm/metamod_provider.h @@ -0,0 +1,288 @@ +#ifndef _INCLUDE_METAMOD_SOURCE_SUPPORT_H_ +#define _INCLUDE_METAMOD_SOURCE_SUPPORT_H_ + +#include +#include +#include + +namespace SourceMM +{ + enum + { + ConVarFlag_None, + ConVarFlag_Notify, + ConVarFlag_Replicated, + ConVarFlag_SpOnly + }; + + enum ProvidedHooks + { + ProvidedHook_LevelInit = 0, /**< IServerGameDLL::LevelInit */ + ProvidedHook_LevelShutdown = 1, /**< IServerGameDLL::LevelShutdown */ + ProvidedHook_DLLInit = 2, /**< IServerGameDLL::DLLInit */ + ProvidedHook_DLLShutdown = 3, /**< IServerGameDLL::DLLShutdown */ + ProvidedHook_GameInit = 4, /**< IServerGameDLL::GameInit */ + }; + + /** + * @brief Abstracts command information, since the new engine fixes the + * re-entrancy problems in the tokenization system. + */ + class IMetamodSourceCommandInfo + { + public: + /** + * @brief Returns the argument count such that arguments + * 1 to N are valid arguments, and 0 is the command name. + * + * @return Argument count. + */ + virtual unsigned int GetArgCount() =0; + + /** + * @brief Returns the string of an argument number. + * + * @param num Argument number. + * @return Argument text. + */ + virtual const char *GetArg(unsigned int num) =0; + + /** + * @brief Returns the entire command argument string. + * + * @return Argument string. + */ + virtual const char *GetArgString() =0; + }; + + typedef bool (*METAMOD_COMMAND)(edict_t *pEdict, IMetamodSourceCommandInfo *info); + + class IMetamodSourceProvider + { + public: + /** + * @brief Returns whether source engine build is compatible. + * + * @param build Source engine build. + * @return True if compatible, false otherwise. + */ + virtual bool IsSourceEngineBuildCompatible(int build) =0; + + /** + * @brief Retrieves hook information for each callback. Each hook + * must be implemented. + * + * @param hook Hook information to provide. + * @param pInfo Non-NULL pointer to fill with information + * about the hook's virtual location. + * @return True if supported, false to fail, which + * will cause Metamod:Source to fail. + */ + virtual bool GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo) =0; + + /** + * @brief Logs a message via IVEngineServer::LogPrint. + * + * @param buffer Buffer to print. + * @return True on success, false if not supported, + * or IVEngineServer is not yet known. + */ + virtual bool LogMessage(const char *buffer) =0; + + /** + * @brief Returns the command line value of a parameter. If ICvar + * is not yet loaded, this uses an equivalent function. + * + * @param key Parameter to look up. + * @param val Default string to return if none found. + * @return Parameter value. + */ + virtual const char *GetCommandLineValue(const char *key, const char *defval) =0; + + /** + * @brief Prints a string to the remote server console. + * + * Note: new lines are not appended. + * + * @param msg Message string. + */ + virtual void ConsolePrint(const char *msg) =0; + + /** + * @brief Returns whether remote printing is available. + * + * @return True if remote printing is available, + * otherwise returns false. + */ + virtual bool IsRemotePrintingAvailable() =0; + + /** + * @brief Prints text in the specified client's console. + * + * @param client Client edict pointer. + * @param msg Message string. + */ + virtual void ClientConsolePrint(edict_t *client, const char *msg) =0; + + /** + * @brief Returns a server plugin helper for the given interface + * string. + * + * @param iface Interface version + * @return IServerPluginCallbacks pointer. + */ + virtual IServerPluginCallbacks *GetVSPCallbacks(const char *iface) =0; + + /** + * @brief Halts the server with a fatal error message. + * + * @param fmt Formatted message string. + * @param ... Format parameters. + */ + virtual void DisplayError(const char *fmt, ...) =0; + + /** + * @brief Sends the server a warning message. + * + * @param fmt Formatted message string. + * @param ... Format parameters. + */ + virtual void DisplayWarning(const char *fmt, ...) =0; + + /** + * @brief Attempts to notify the provider of the gamedll version being + * used. + * + * @param iface Interface string. + * @return Version number on success, 0 otherwise. + */ + virtual int TryServerGameDLL(const char *iface) =0; + + /** + * @brief Attempts to notify the provider of the gameclients version + * being used. + * + * @param iface Interface string. + * @return Version number on success, 0 otherwise. + */ + virtual int TryServerGameClients(const char *iface) =0; + + /** + * @brief Notifies the provider that the DLLInit pre-hook is almost done. + */ + virtual void Notify_DLLInit_Pre() =0; + + /** + * @brief Wrapper around IVEngineServer::ServerCommand() + * + * @param cmd Command string. + */ + virtual void ServerCommand(const char *cmd) =0; + + /** + * @brief Creates a ConVar pointer. + * + * @param name ConVar name. + * @param defval Default value string. + * @param flags ConVar flags. + * @param help Help text. + * @return ConVar pointer. + */ + virtual ConVar *CreateConVar(const char *name, + const char *defval, + const char *help, + int flags) =0; + + /** + * @brief Returns the string value of a ConVar. + * + * @param convar ConVar pointer. + * @return String value. + */ + virtual const char *GetConVarString(ConVar *convar) =0; + + /** + * @brief Creates a console command. + * + * @param name Command name. + * @param callback Callback pointer. + * @param help Help text. + */ + virtual void CreateCommand(const char *name, + METAMOD_COMMAND callback, + const char *help) =0; + + /** + * @brief Sets the ClientCommand handler. + * + * @param callback Callback pointer. + */ + virtual void SetClientCommandHandler(METAMOD_COMMAND callback) =0; + + /** + * @brief Retrieves the game description. + * + * @return Game description. + */ + virtual const char *GetGameDescription() =0; + + /** + * @brief Returns the ConCommandBase accessor. + * + * @return An IConCommandBaseAccessor pointer. + */ + virtual IConCommandBaseAccessor *GetConCommandBaseAccessor() =0; + + /** + * @brief Registers a ConCommandBase. + * + * @param pCommand ConCommandBase to register. + * @return True if successful, false otherwise. + */ + virtual bool RegisterConCommandBase(ConCommandBase *pCommand) =0; + + /** + * @brief Unregisters a ConCommandBase. + * + * @param pCommand ConCommandBase to unlink. + */ + virtual void UnregisterConCommandBase(ConCommandBase *pCommand) =0; + + /** + * @brief Returns whether a ConCommandBase is a command or not. + * + * @param pCommand ConCommandBase pointer. + * @return True if a command, false otherwise. + */ + virtual bool IsConCommandBaseACommand(ConCommandBase *pCommand) =0; + + /** + * @brief Returns the number of user messages in the GameDLL. + * + * @return Number of user messages, or -1 if SourceMM has + * failed to get user message list. + */ + virtual int GetUserMessageCount() =0; + + /** + * @brief Returns the index of the specified user message. + * + * @param name User message name. + * @param size Optional pointer to store size of user message. + * @return Message index, or -1 on failure. + */ + virtual int FindUserMessage(const char *name, int *size=NULL) =0; + + /** + * @brief Returns the name of the specified user message. + * + * @param index User message index. + * @param size Optional pointer to store size of user message. + * @return Message name, or NULL on failure. + */ + virtual const char *GetUserMessage(int index, int *size=NULL) =0; + }; +}; + +#endif //_INCLUDE_METAMOD_SOURCE_SUPPORT_H_ + From 11fd69452fd17a5b1675b1284157dd11c59b57c0 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 22 Sep 2007 21:31:45 +0000 Subject: [PATCH 08/25] committed two forgotten files --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40429 --- sourcemm/metamod_plugins.cpp | 731 +++++++++++++++++++++++++++++++++++ 1 file changed, 731 insertions(+) create mode 100644 sourcemm/metamod_plugins.cpp diff --git a/sourcemm/metamod_plugins.cpp b/sourcemm/metamod_plugins.cpp new file mode 100644 index 0000000..29ee2bf --- /dev/null +++ b/sourcemm/metamod_plugins.cpp @@ -0,0 +1,731 @@ +/* ======== SourceMM ======== + * Copyright (C) 2004-2007 Metamod:Source Development Team + * No warranties of any kind + * + * License: zlib/libpng + * + * Author(s): David "BAILOPAN" Anderson + * ============================ + */ + +#if defined _DEBUG +#define DEBUG2 +#undef _DEBUG +#endif +#include "metamod.h" +#include "metamod_plugins.h" +#include "metamod_util.h" +#if defined DEBUG2 +#undef DEBUG2 +#define _DEBUG +#endif + +/** + * @brief Implements functions from CPlugin.h + * @file CPlugin.cpp + */ + +using namespace SourceMM; + +#define ITER_PLEVENT(evn, plid) \ + CPluginManager::CPlugin *_Xpl; \ + SourceHook::List::iterator event; \ + IMetamodListener *api; \ + for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ + _Xpl = (*iter); \ + if (_Xpl->m_Id == plid) \ + continue; \ + for (event=_Xpl->m_Events.begin(); event!=_Xpl->m_Events.end(); event++) { \ + api = (*event); \ + api->evn(plid); \ + } \ + } + +CPluginManager g_PluginMngr; + +CPluginManager::CPluginManager() +{ + m_LastId = Pl_MinId; + m_AllLoaded = false; +} + +CPluginManager::~CPluginManager() +{ + SourceHook::List::iterator iter; + + for (iter = m_Aliases.begin(); iter != m_Aliases.end(); iter++) + { + delete (*iter); + } + + m_Aliases.clear(); +} + +const char *CPluginManager::LookupAlias(const char *alias) +{ + SourceHook::List::iterator iter; + CNameAlias *p; + + for (iter = m_Aliases.begin(); iter != m_Aliases.end(); iter++) + { + p = (*iter); + if (p->alias.compare(alias) == 0) + { + return p->value.c_str(); + } + } + + return NULL; +} + +SourceHook::List::iterator CPluginManager::_alias_begin() +{ + return m_Aliases.begin(); +} + +SourceHook::List::iterator CPluginManager::_alias_end() +{ + return m_Aliases.end(); +} + +void CPluginManager::SetAlias(const char *alias, const char *value) +{ + SourceHook::List::iterator iter; + CNameAlias *p; + + for (iter = m_Aliases.begin(); iter != m_Aliases.end(); iter++) + { + p = (*iter); + if (p->alias.compare(alias) == 0) + { + if (value[0] == '\0') + { + iter = m_Aliases.erase(iter); + return; + } + else + { + p->value.assign(value); + return; + } + } + } + + if (value[0] != '\0') + { + p = new CNameAlias; + + p->alias.assign(alias); + p->value.assign(value); + + m_Aliases.push_back(p); + } +} + +CPluginManager::CPlugin::CPlugin() : m_Id(0), m_Source(0), m_API(NULL), m_Lib(NULL) +{ + +} + +PluginId CPluginManager::Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen) +{ + already = false; + //Check if we're about to reload an old plugin + PluginIter i = m_Plugins.begin(); + while (i != m_Plugins.end()) + { + if ((*i) && UTIL_PathCmp(file, (*i)->m_File.c_str())) + { + if ((*i)->m_Status < Pl_Paused) + { + //Attempt to load the plugin again + already = true; + i = m_Plugins.erase(i); + continue; + } + else + { + //No need to load it + already = true; + return (*i)->m_Id; + } + } + i++; + } + + CPlugin *pl = _Load(file, source, error, maxlen); + + if (!pl) + { + return Pl_BadLoad; + } + + ITER_PLEVENT(OnPluginLoad, pl->m_Id); + + return pl->m_Id; +} + +CPluginManager::CPlugin *CPluginManager::FindById(PluginId id) +{ + PluginIter i; + + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i)->m_Id == id )\ + { + return (*i); + } + } + + return NULL; +} + +void CPluginManager::SetAllLoaded() +{ + m_AllLoaded = true; + PluginIter i; + + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i) && (*i)->m_Status == Pl_Running && (*i)->m_API ) + { + //API 4 is when we added this callback + //Min version is now 5, so we ignore this check + //if ( (*i)->m_API->GetApiVersion() >= 004 ) + (*i)->m_API->AllPluginsLoaded(); + } + } +} + +bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen) +{ + CPlugin *pl = FindById(id); + + if (!pl) + { + UTIL_Format(error, maxlen, "Plugin id not found"); + return false; + } + + bool ret; + + if ((ret=_Pause(pl, error, maxlen)) == true) + { + ITER_PLEVENT(OnPluginPause, pl->m_Id); + } + + return ret; +} + +bool CPluginManager::Unpause(PluginId id, char *error, size_t maxlen) +{ + CPlugin *pl = FindById(id); + + if (!pl) + { + UTIL_Format(error, maxlen, "Plugin id not found"); + return false; + } + + bool ret; + + if ( (ret=_Unpause(pl, error, maxlen)) == true ) + { + ITER_PLEVENT(OnPluginUnpause, pl->m_Id); + } + + return ret; +} + +bool CPluginManager::Unload(PluginId id, bool force, char *error, size_t maxlen) +{ + CPlugin *pl = FindById(id); + + if (!pl) + { + UTIL_Format(error, maxlen, "Plugin %d not found", id); + return false; + } + + bool ret; + PluginId old_id = pl->m_Id; + if ( (ret=_Unload(pl, force, error, maxlen)) == true ) + { + ITER_PLEVENT(OnPluginUnload, old_id); + } + + return ret; +} + +bool CPluginManager::Retry(PluginId id, char *error, size_t len) +{ + PluginIter i; + char buffer[64]; + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i) && (*i)->m_Id == id ) + { + if ( (*i)->m_Status >= Pl_Paused) + { + UTIL_Format(error, len, "Plugin %d is already running.", id); + return false; + } + CPlugin *pl = _Load((*i)->m_File.c_str(), Pl_Console, error, len); + if (!pl) + { + return false; + } + if (pl->m_Status >= Pl_Paused) + { + //Now it gets crazy... unload the original copy. + _Unload( (*i), true, buffer, sizeof(buffer)-1 ); + + //Set the new copy's id + pl->m_Id = id; + + //We just wasted an id... reclaim it + m_LastId--; + + return true; + } + else + { + //don't really care about the buffer here + _Unload(pl, true, buffer, sizeof(buffer)-1); + + //We just wasted an id... reclaim it + m_LastId--; + return false; + } + } + } + + UTIL_Format(error, len, "Plugin %d not found,", id); + return false; +} + +CPluginManager::CPlugin *CPluginManager::FindByAPI(ISmmPlugin *api) +{ + PluginIter i; + + //don't find bad plugins! + if (!api) + { + return NULL; + } + + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ((*i)->m_API == api) + { + return (*i); + } + } + + return NULL; +} + +int CPluginManager::GetPluginCount() +{ + return (int)m_Plugins.size(); +} + +const char *CPluginManager::GetStatusText(CPlugin *pl) +{ + switch (pl->m_Status) + { + case Pl_NotFound: + return "NOFILE"; + case Pl_Error: + return "ERROR"; + case Pl_Refused: + return "FAILED"; + case Pl_Paused: + return "PAUSED"; + case Pl_Running: + { + if (pl->m_API && pl->m_API->QueryRunning(NULL, 0)) + { + return "STOPPED"; + } else { + return "RUNNING"; + } + } + default: + return "-"; + } +} + +CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source, char *error, size_t maxlen) +{ + FILE *fp; + CPlugin *pl; + + pl = new CPlugin(); + *error = '\0'; + + //Add plugin to list + pl->m_Id = m_LastId; + pl->m_File.assign(file); + m_Plugins.push_back(pl); + m_LastId++; + + //Check if the file even exists + fp = fopen(file, "r"); + if (!fp) + { + if (error) + { + UTIL_Format(error, maxlen, "File not found: %s", file); + } + pl->m_Status = Pl_NotFound; + } + + if (fp) + { + fclose(fp); + fp = NULL; + + //Load the file + pl->m_Lib = dlmount(file); + if (!pl->m_Lib) + { + if (error) + { + UTIL_Format(error, maxlen, "%s", dlerror()); + } + pl->m_Status = Pl_Error; + } + else + { + CreateInterfaceFn pfn = (CreateInterfaceFn)(dlsym(pl->m_Lib, PL_EXPOSURE_C)); + if (!pfn) + { + if (error) + { + UTIL_Format(error, maxlen, "Function %s not found", PL_EXPOSURE_C); + } + pl->m_Status = Pl_Error; + } + else + { + pl->m_API = static_cast((pfn)(PLAPI_NAME, NULL)); + if (!pl->m_API) + { + if (error) + { + UTIL_Format(error, maxlen, "Failed to get API"); + } + pl->m_Status = Pl_Error; + } + else + { + int api = pl->m_API->GetApiVersion(); + if (api < PLAPI_MIN_VERSION) + { + if (error) + { + UTIL_Format(error, maxlen, "Plugin API %d is out of date with required minimum (%d)", api, PLAPI_MIN_VERSION); + } + pl->m_Status = Pl_Error; + } + else if (api > PLAPI_VERSION) + { + if (error) + { + UTIL_Format(error, maxlen, "Plugin API %d is newer than internal version (%d)", api, PLAPI_VERSION); + } + pl->m_Status = Pl_Error; + } + else + { + if (pl->m_API->Load(pl->m_Id, &g_Metamod, error, maxlen, m_AllLoaded)) + { + pl->m_Status = Pl_Running; + if (m_AllLoaded) + { + //API 4 is when we added this callback + //Removing this code as the min version is now 5 + //if (pl->m_API->GetApiVersion() >= 4) + pl->m_API->AllPluginsLoaded(); + } + } + else + { + pl->m_Status = Pl_Refused; + } + } + } + } + } + } + + if (pl->m_Lib && (pl->m_Status < Pl_Paused)) + { + pl->m_Events.clear(); + g_SourceHook.UnloadPlugin(pl->m_Id); + UnregAllConCmds(pl); + + dlclose(pl->m_Lib); + pl->m_Lib = NULL; + pl->m_API = NULL; + } + + return pl; +} + +bool CPluginManager::_Unload(CPluginManager::CPlugin *pl, bool force, char *error, size_t maxlen) +{ + if (error) + { + *error = '\0'; + } + + if (pl->m_API && pl->m_Lib) + { + //Note, we'll always tell the plugin it will be unloading... + if (pl->m_API->Unload(error, maxlen) || force) + { + //Make sure to detach it from sourcehook! + g_SourceHook.UnloadPlugin(pl->m_Id); + + UnregAllConCmds(pl); + + //Clean up the DLL + dlclose(pl->m_Lib); + pl->m_Lib = NULL; + pl->m_API = NULL; + + //Remove the plugin from the list + PluginIter i; + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i)->m_Id == pl->m_Id ) + { + i = m_Plugins.erase(i); + break; + } + } + //Free its memory + delete pl; + + return true; + } + } else { + //The plugin is not valid, and let's just remove it from the list anyway + PluginIter i; + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i)->m_Id == pl->m_Id ) + { + i = m_Plugins.erase(i); + break; + } + } + delete pl; + + return true; + } + + return false; +} + +bool CPluginManager::_Pause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) +{ + if (error) + { + *error = '\0'; + } + + if (pl->m_Status != Pl_Running || !pl->m_API) + { + if (error) + { + UTIL_Format(error, maxlen, "Plugin cannot be paused"); + } + } + else + { + if (pl->m_API->Pause(error, maxlen)) + { + g_SourceHook.PausePlugin(pl->m_Id); + pl->m_Status = Pl_Paused; + + return true; + } + } + + return false; +} + +bool CPluginManager::_Unpause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) +{ + if (error) + { + *error = '\0'; + } + + if (pl->m_Status != Pl_Paused || !pl->m_API) + { + if (error) + { + UTIL_Format(error, maxlen, "Plugin cannot be unpaused"); + } + } + else + { + if (pl->m_API->Unpause(error, maxlen)) + { + g_SourceHook.UnpausePlugin(pl->m_Id); + pl->m_Status = Pl_Running; + + return true; + } + } + + return false; +} + +bool CPluginManager::UnloadAll() +{ + PluginIter i; + + char error[128]; + bool status = true; + + while ((i = m_Plugins.begin()) != m_Plugins.end()) + { + if ( !_Unload( (*i), true, error, sizeof(error)) ) + { + status = false; + } + } + + return status; +} + +bool CPluginManager::Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source) +{ + CPlugin *pl = FindById(id); + + if (!pl) + { + return false; + } + + file = pl->m_File.c_str(); + status = pl->m_Status; + source = pl->m_Source; + + return true; +} + +bool CPluginManager::QueryRunning(PluginId id, char *error, size_t maxlength) +{ + CPlugin *pl = FindById(id); + + if (!pl || !pl->m_API) + { + if (error) + { + UTIL_Format(error, maxlength, "Plugin not valid"); + } + return false; + } + + return pl->m_API->QueryRunning(error, maxlength); +} + +bool CPluginManager::QueryHandle(PluginId id, void *&handle) +{ + CPlugin *pl = FindById(id); + + if (!pl) + { + return false; + } + + handle = static_cast(pl->m_Lib); + + return true; +} + +PluginIter CPluginManager::_begin() +{ + return m_Plugins.begin(); +} + +PluginIter CPluginManager::_end() +{ + return m_Plugins.end(); +} + +void CPluginManager::AddPluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) +{ + CPlugin *pl = FindByAPI(api); + + if (!pl) + { + return; + } + + pl->m_Cvars.push_back(pCvar); +} + +void CPluginManager::AddPluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) +{ + CPlugin *pl = FindByAPI(api); + + if (!pl) + { + return; + } + + pl->m_Cmds.push_back(pCmd); +} + +void CPluginManager::RemovePluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) +{ + CPlugin *pl = FindByAPI(api); + + if (!pl) + { + return; + } + + pl->m_Cvars.remove(pCvar); +} + +void CPluginManager::RemovePluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) +{ + CPlugin *pl = FindByAPI(api); + + if (!pl) + { + return; + } + + pl->m_Cmds.remove(pCmd); +} + +void CPluginManager::UnregAllConCmds(CPlugin *pl) +{ +#if 0 + SourceHook::List::iterator i; + + /* :TODO: */ + for (i=pl->m_Cvars.begin(); i!=pl->m_Cvars.end(); i++) + { + g_SMConVarAccessor.Unregister(pl->m_Id, (*i) ); + } + + pl->m_Cvars.clear(); + + for (i=pl->m_Cmds.begin(); i!=pl->m_Cmds.end(); i++) + { + g_SMConVarAccessor.Unregister(pl->m_Id, (*i) ); + } + + pl->m_Cmds.clear(); +#endif +} From 2542b0471edd1480d628d745b49fe48cd702bf42 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 27 Sep 2007 18:12:20 +0000 Subject: [PATCH 09/25] added svn:keywords property --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40430 --- sourcemm/ISmmAPI.h | 1 + sourcemm/ISmmPlugin.h | 1 + sourcemm/Makefile | 9 +++------ sourcemm/metamod.cpp | 2 +- sourcemm/oslink.cpp | 11 +++++------ 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h index d581a12..6977128 100644 --- a/sourcemm/ISmmAPI.h +++ b/sourcemm/ISmmAPI.h @@ -360,3 +360,4 @@ public: // Added in 1.6.0 (1:7) */ #endif //_INCLUDE_ISMM_API_H + diff --git a/sourcemm/ISmmPlugin.h b/sourcemm/ISmmPlugin.h index f795e0b..350c7cb 100644 --- a/sourcemm/ISmmPlugin.h +++ b/sourcemm/ISmmPlugin.h @@ -435,3 +435,4 @@ public: } #endif //_INCLUDE_ISMM_PLUGIN_H + diff --git a/sourcemm/Makefile b/sourcemm/Makefile index 7cea117..f713ab2 100644 --- a/sourcemm/Makefile +++ b/sourcemm/Makefile @@ -1,7 +1,7 @@ #(C)2004-2007 SourceMM Development Team # Makefile written by David "BAILOPAN" Anderson -HL2SDK = ../../hl2sdk +HL2SDK = ../../../hl2sdk SMM_ROOT = .. SRCDS = ~/srcds @@ -16,10 +16,9 @@ BINARY = server_i486.so HL2PUB = $(HL2SDK)/public HL2LIB = $(HL2SDK)/linux_sdk -OBJECTS = oslink.cpp util.cpp concommands.cpp CSmmAPI.cpp \ - sourcemm.cpp CPlugin.cpp sourcehook.cpp vsp_listener.cpp +OBJECTS = oslink.cpp metamod_util.cpp metamod.cpp -LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc +LINK = -static-libgcc INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook @@ -47,8 +46,6 @@ $(BIN_DIR)/%.o: %.cpp all: mkdir -p $(BIN_DIR) - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so ln -sf $(SMM_ROOT)/sourcehook/sourcehook.cpp sourcehook.cpp $(MAKE) sourcemm rm -rf $(BINARY) diff --git a/sourcemm/metamod.cpp b/sourcemm/metamod.cpp index 82081d4..bd825bf 100644 --- a/sourcemm/metamod.cpp +++ b/sourcemm/metamod.cpp @@ -589,7 +589,7 @@ void InitializeVSP() char engine_path[PATH_SIZE]; char rel_path[PATH_SIZE * 2]; - GetFileOfAddress(engine_factory, engine_file, sizeof(engine_file)); + GetFileOfAddress((void *)engine_factory, engine_file, sizeof(engine_file)); /* Chop off the "engine" file part */ len = strlen(engine_file); diff --git a/sourcemm/oslink.cpp b/sourcemm/oslink.cpp index 470dbf9..d5a5bfa 100644 --- a/sourcemm/oslink.cpp +++ b/sourcemm/oslink.cpp @@ -14,6 +14,7 @@ */ #include "oslink.h" +#include #ifdef __linux #include #include @@ -70,21 +71,19 @@ bool GetFileOfAddress(void *pAddr, char *buffer, size_t maxlength) #if defined __GNUC__ && (__GNUC__ == 3 || __GNUC__ == 4) void * operator new(size_t size) { - return(calloc(1, size)); + return malloc(size); } void * operator new[](size_t size) { - return(calloc(1, size)); + return malloc(size); } void operator delete(void * ptr) { - if(ptr) - free(ptr); + free(ptr); } void operator delete[](void * ptr) { - if(ptr) - free(ptr); + free(ptr); } #endif From 0e6498a471fca3e6952c04661848b96819ee2123 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 27 Sep 2007 19:28:05 +0000 Subject: [PATCH 10/25] removed unnecessary api call --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40431 --- sourcemm/metamod_provider.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/sourcemm/metamod_provider.h b/sourcemm/metamod_provider.h index b9978eb..b9c93de 100644 --- a/sourcemm/metamod_provider.h +++ b/sourcemm/metamod_provider.h @@ -136,6 +136,8 @@ namespace SourceMM /** * @brief Halts the server with a fatal error message. * + * No newline is appended. + * * @param fmt Formatted message string. * @param ... Format parameters. */ @@ -144,6 +146,8 @@ namespace SourceMM /** * @brief Sends the server a warning message. * + * No newline is appended. + * * @param fmt Formatted message string. * @param ... Format parameters. */ @@ -158,15 +162,6 @@ namespace SourceMM */ virtual int TryServerGameDLL(const char *iface) =0; - /** - * @brief Attempts to notify the provider of the gameclients version - * being used. - * - * @param iface Interface string. - * @return Version number on success, 0 otherwise. - */ - virtual int TryServerGameClients(const char *iface) =0; - /** * @brief Notifies the provider that the DLLInit pre-hook is almost done. */ From 194b42b0f2b68499b900fc7996bb84785378ca76 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 27 Sep 2007 19:28:30 +0000 Subject: [PATCH 11/25] initial import of the provider layout for ep1 --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40432 --- providers/Makefile.ep1 | 70 ++++ providers/episode1/console.cpp | 111 ++++++ providers/episode1/console.h | 24 ++ providers/episode1/convar_smm.h | 523 ++++++++++++++++++++++++++++ providers/episode1/provider_ep1.cpp | 264 ++++++++++++++ providers/episode1/provider_ep1.h | 49 +++ providers/provider_util.cpp | 15 + providers/provider_util.h | 11 + 8 files changed, 1067 insertions(+) create mode 100644 providers/Makefile.ep1 create mode 100644 providers/episode1/console.cpp create mode 100644 providers/episode1/console.h create mode 100644 providers/episode1/convar_smm.h create mode 100644 providers/episode1/provider_ep1.cpp create mode 100644 providers/episode1/provider_ep1.h create mode 100644 providers/provider_util.cpp create mode 100644 providers/provider_util.h diff --git a/providers/Makefile.ep1 b/providers/Makefile.ep1 new file mode 100644 index 0000000..bc853c9 --- /dev/null +++ b/providers/Makefile.ep1 @@ -0,0 +1,70 @@ +#(C)2004-2007 SourceMM Development Team +# Makefile written by David "BAILOPAN" Anderson + +HL2SDK = ../../../hl2sdk +SMM_ROOT = .. +SRCDS = ~/srcds + +### EDIT BELOW FOR OTHER PROJECTS ### + +OPT_FLAGS = -O2 -funroll-loops -s -pipe +GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden +DEBUG_FLAGS = -g -ggdb3 +CPP = gcc-4.1 +BINARY = provider_ep1_i486.so + +HL2PUB = $(HL2SDK)/public +HL2LIB = $(HL2SDK)/linux_sdk + +OBJECTS = provider_util.cpp episode1/provider_ep1.cpp episode1/console.cpp + +LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc + +INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ + -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook \ + -I$(SMM_ROOT)/sourcemm + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug + CFLAGS = $(DEBUG_FLAGS) +else + BIN_DIR = Release + CFLAGS = $(OPT_FLAGS) +endif + +GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) + +CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse + +ifeq "$(GCC_VERSION)" "4" + CFLAGS += $(GCC4_FLAGS) +endif + +OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +$(BIN_DIR)/%.o: %.cpp + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +all: + mkdir -p $(BIN_DIR) + mkdir -p $(BIN_DIR)/episode1 + ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so + ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so + $(MAKE) -f Makefile.ep1 provider + rm -rf $(BINARY) + +provider: $(OBJ_LINUX) + $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) + +debug: + $(MAKE) -f Makefile.ep1 all DEBUG=true + +default: all + +clean: + rm -rf Release/episode1/*.o + rm -rf Release/*.o + rm -rf Release/$(BINARY) + rm -rf Debug/episode1/*.o + rm -rf Debug/*.o + rm -rf Debug/$(BINARY) diff --git a/providers/episode1/console.cpp b/providers/episode1/console.cpp new file mode 100644 index 0000000..e6d7c83 --- /dev/null +++ b/providers/episode1/console.cpp @@ -0,0 +1,111 @@ +#include "console.h" +#include "provider_ep1.h" + +using namespace SourceHook; + +SMConVarAccessor g_SMConVarAccessor; + +class CAlwaysRegisterableCommand : public ConCommandBase +{ +public: + CAlwaysRegisterableCommand() + { + Create("metamod_eternal", NULL, FCVAR_UNREGISTERED|FCVAR_GAMEDLL); + } + bool IsRegistered( void ) const + { + return false; + } + void BringToFront() + { + // First, let's try to find us! + ConCommandBase *pPtr = icvar->GetCommands(); + + if (pPtr == this) + { + // We are already at the beginning; Nothing to do + return; + } + + while (pPtr) + { + if (pPtr == this) + { + break; + } + ConCommandBase *pPrev = NULL; + while (pPtr) + { + if (pPtr == this) + { + break; + } + pPrev = pPtr; + pPtr = const_cast(pPtr->GetNext()); + } + if (pPrev && pPtr == this) + { + pPrev->SetNext(m_pNext); // Remove us from the list + } + // Now, register us + SetNext(NULL); + icvar->RegisterConCommandBase(this); + } + } +} s_EternalCommand; + +bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) +{ + m_RegisteredCommands.push_back(pCommand); + pCommand->SetNext(NULL); + icvar->RegisterConCommandBase(pCommand); + + return true; +} + +bool SMConVarAccessor::Register(ConCommandBase *pCommand) +{ + pCommand->SetNext(NULL); + icvar->RegisterConCommandBase(pCommand); + + return true; +} + +void SMConVarAccessor::MarkCommandsAsGameDLL() +{ + for (List::iterator iter = m_RegisteredCommands.begin(); + iter != m_RegisteredCommands.end(); ++iter) + { + (*iter)->AddFlags(FCVAR_GAMEDLL); + } +} + +void SMConVarAccessor::Unregister(ConCommandBase *pCommand) +{ + ConCommandBase *ptr = icvar->GetCommands(); + + if (ptr == pCommand) + { + s_EternalCommand.BringToFront(); + s_EternalCommand.SetNext(const_cast(pCommand->GetNext())); + } + else + { + /* Find us and unregister us */ + ConCommandBase *pPrev = NULL; + while (ptr) + { + if (ptr == pCommand) + { + break; + } + pPrev = ptr; + ptr = const_cast(ptr->GetNext()); + } + if (pPrev && ptr == pCommand) + { + pPrev->SetNext(const_cast(pCommand->GetNext())); + } + } +} + diff --git a/providers/episode1/console.h b/providers/episode1/console.h new file mode 100644 index 0000000..4f1b5b8 --- /dev/null +++ b/providers/episode1/console.h @@ -0,0 +1,24 @@ +#ifndef _INCLUDE_CONSOLE_MMS_H_ +#define _INCLUDE_CONSOLE_MMS_H_ + +#include "convar_smm.h" +#include +#include +#include + +class SMConVarAccessor : public IConCommandBaseAccessor +{ +public: + bool RegisterConCommandBase(ConCommandBase *pCommand); + bool Register(ConCommandBase *pCommand); + void MarkCommandsAsGameDLL(); + void Unregister(ConCommandBase *pCommand); + void UnregisterGameDLLCommands(); +private: + SourceHook::List m_RegisteredCommands; +}; + +extern SMConVarAccessor g_SMConVarAccessor; + +#endif //_INCLUDE_CONSOLE_MMS_H_ + diff --git a/providers/episode1/convar_smm.h b/providers/episode1/convar_smm.h new file mode 100644 index 0000000..8e5dd82 --- /dev/null +++ b/providers/episode1/convar_smm.h @@ -0,0 +1,523 @@ +//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $Workfile: $ +// $Date: 2007-02-08 04:19:19 -0500 (Thu, 08 Feb 2007) $ +// +//----------------------------------------------------------------------------- +// $NoKeywords: $ +//=============================================================================// + +#ifndef CONVAR_H +#define CONVAR_H +#if _WIN32 +#pragma once +#endif + +#include "tier0/dbg.h" + +#ifdef _WIN32 +#define FORCEINLINE_CVAR FORCEINLINE +#elif _LINUX +#define FORCEINLINE_CVAR __inline__ FORCEINLINE +#else +#error "implement me" +#endif + +// The default, no flags at all +#define FCVAR_NONE 0 + +// Command to ConVars and ConCommands +// ConVar Systems +#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. +#define FCVAR_LAUNCHER (1<<1) // defined by launcher +#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL +#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL +#define FCVAR_MATERIAL_SYSTEM (1<<4) // Defined by the material system. +#define FCVAR_DATACACHE (1<<19) // Defined by the datacache system. +#define FCVAR_STUDIORENDER (1<<15) // Defined by the studiorender system. +#define FCVAR_FILESYSTEM (1<<21) // Defined by the file system. +#define FCVAR_PLUGIN (1<<18) // Defined by a 3rd party plugin. +#define FCVAR_TOOLSYSTEM (1<<20) // Defined by an IToolSystem library +#define FCVAR_SOUNDSYSTEM (1<<23) // Defined by the soundsystem library +#define FCVAR_INPUTSYSTEM (1<<25) // Defined by the inputsystem dll +#define FCVAR_NETWORKSYSTEM (1<<26) // Defined by the network system +// NOTE!! if you add a cvar system, add it here too!!!! +// the engine lacks a cvar flag, but needs it for xbox +// an engine cvar is thus a cvar not marked with any other system +#define FCVAR_NON_ENGINE ((FCVAR_LAUNCHER|FCVAR_GAMEDLL|FCVAR_CLIENTDLL|FCVAR_MATERIAL_SYSTEM|FCVAR_DATACACHE|FCVAR_STUDIORENDER|FCVAR_FILESYSTEM|FCVAR_PLUGIN|FCVAR_TOOLSYSTEM|FCVAR_SOUNDSYSTEM|FCVAR_INPUTSYSTEM|FCVAR_NETWORKSYSTEM)) + +// ConVar only +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc +#define FCVAR_NOTIFY (1<<8) // notifies players when changed +#define FCVAR_USERINFO (1<<9) // changes the client's info string +#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats + +#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log +#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar + +// It's a ConVar that's shared between the client and the server. +// At signon, the values of all such ConVars are sent from the server to the client (skipped for local +// client, of course ) +// If a change is requested it must come from the console (i.e., no remote client changes) +// If a value is changed while a server is active, it's replicated to all connected clients +#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time +#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file +#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles + +#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server + +#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox + + +// #define FCVAR_AVAILABLE (1<<27) +// #define FCVAR_AVAILABLE (1<<28) +// #define FCVAR_AVAILABLE (1<<29) +// #define FCVAR_AVAILABLE (1<<30) +// #define FCVAR_AVAILABLE (1<<31) + + +class ConVar; +class ConCommand; +class ConCommandBase; + +// Any executable that wants to use ConVars need to implement one of +// these to hook up access to console variables. +class IConCommandBaseAccessor +{ +public: + // Flags is a combination of FCVAR flags in cvar.h. + // hOut is filled in with a handle to the variable. + virtual bool RegisterConCommandBase( ConCommandBase *pVar )=0; +}; + + +// You don't have to instantiate one of these, just call its +// OneTimeInit function when your executable is initializing. +class ConCommandBaseMgr +{ +public: + // Call this ONCE when the executable starts up. + static void OneTimeInit( IConCommandBaseAccessor *pAccessor ); +#ifdef _XBOX + static bool Fixup( ConCommandBase* pConCommandBase ); +#ifndef _RETAIL + static void PublishCommands( bool bForce ); +#endif +#endif +}; + +// Called when a ConVar changes value +typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString ); + +// Called when a ConCommand needs to execute +typedef void ( *FnCommandCallback )( void ); + +#define COMMAND_COMPLETION_MAXITEMS 64 +#define COMMAND_COMPLETION_ITEM_LENGTH 64 + +// Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings +typedef int ( *FnCommandCompletionCallback )( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); + +//----------------------------------------------------------------------------- +// Purpose: The base console invoked command/cvar interface +//----------------------------------------------------------------------------- +class ConCommandBase +{ + friend class ConCommandBaseMgr; + friend class CCvar; + friend class ConVar; + friend class ConCommand; + +public: + ConCommandBase( void ); + ConCommandBase( char const *pName, char const *pHelpString = 0, + int flags = 0 ); + + virtual ~ConCommandBase( void ); + + virtual bool IsCommand( void ) const; + + // Check flag + virtual bool IsBitSet( int flag ) const; + // Set flag + virtual void AddFlags( int flags ); + + // Return name of cvar + virtual char const *GetName( void ) const; + + // Return help text for cvar + virtual char const *GetHelpText( void ) const; + + // Deal with next pointer + const ConCommandBase *GetNext( void ) const; + void SetNext( ConCommandBase *next ); + + virtual bool IsRegistered( void ) const; + + // Global methods + static ConCommandBase const *GetCommands( void ); + static void AddToList( ConCommandBase *var ); + static void RemoveFlaggedCommands( int flag ); + static void RevertFlaggedCvars( int flag ); + static ConCommandBase const *FindCommand( char const *name ); + +protected: + virtual void Create( char const *pName, char const *pHelpString = 0, + int flags = 0 ); + + // Used internally by OneTimeInit to initialize. + virtual void Init(); + + // Internal copy routine ( uses new operator from correct module ) + char *CopyString( char const *from ); + + // Next ConVar in chain + ConCommandBase *m_pNext; + +private: + // Has the cvar been added to the global list? + bool m_bRegistered; + + // Static data + char const *m_pszName; + char const *m_pszHelpString; + + // ConVar flags + int m_nFlags; + +protected: + + // ConVars add themselves to this list for the executable. Then ConVarMgr::Init() runs through + // all the console variables and registers them. + static ConCommandBase *s_pConCommandBases; + + // ConVars in this executable use this 'global' to access values. + static IConCommandBaseAccessor *s_pAccessor; +}; + +//----------------------------------------------------------------------------- +// Purpose: The console invoked command +//----------------------------------------------------------------------------- +class ConCommand : public ConCommandBase +{ +friend class ConCommandBaseMgr; +friend class CCvar; +#ifdef _STATIC_LINKED +friend class G_ConCommand; +friend class C_ConCommand; +friend class M_ConCommand; +friend class S_ConCommand; +friend class D_ConCommand; +#endif + +public: + typedef ConCommandBase BaseClass; + + ConCommand( void ); + ConCommand( char const *pName, FnCommandCallback callback, + char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); + + virtual ~ConCommand( void ); + + virtual bool IsCommand( void ) const; + + virtual int AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); + + virtual bool CanAutoComplete( void ); + + // Invoke the function + virtual void Dispatch( void ); +private: + virtual void Create( char const *pName, FnCommandCallback callback, + char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); + + // Call this function when executing the command + FnCommandCallback m_fnCommandCallback; + + FnCommandCompletionCallback m_fnCompletionCallback; + bool m_bHasCompletionCallback; +public: + FnCommandCallback GetCallback() { return m_fnCommandCallback; } +}; + +//----------------------------------------------------------------------------- +// Purpose: A console variable +//----------------------------------------------------------------------------- +class ConVar : public ConCommandBase +{ +friend class ConCommandBaseMgr; +friend class CCvar; +friend class CDefaultCvar; +#ifdef _STATIC_LINKED +friend class G_ConVar; +friend class C_ConVar; +friend class M_ConVar; +friend class S_ConVar; +friend class D_ConVar; +#endif + +public: + typedef ConCommandBase BaseClass; + + ConVar( char const *pName, char const *pDefaultValue, int flags = 0); + + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString ); + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ); + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString, FnChangeCallback callback ); + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, + FnChangeCallback callback ); + + virtual ~ConVar( void ); + + virtual bool IsBitSet( int flag ) const; + virtual char const* GetHelpText( void ) const; + virtual bool IsRegistered( void ) const; + virtual char const *GetName( void ) const; + virtual void AddFlags( int flags ); + virtual bool IsCommand( void ) const; + + // Install a change callback (there shouldn't already be one....) + void InstallChangeCallback( FnChangeCallback callback ); + + // Retrieve value + FORCEINLINE_CVAR float GetFloat( void ) const; + FORCEINLINE_CVAR int GetInt( void ) const; + FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } + FORCEINLINE_CVAR char const *GetString( void ) const; + + // Any function that allocates/frees memory needs to be virtual or else you'll have crashes + // from alloc/free across dll/exe boundaries. + + // These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue). + virtual void SetValue( char const *value ); + virtual void SetValue( float value ); + virtual void SetValue( int value ); + + // Reset to default value + void Revert( void ); + + // True if it has a min/max setting + bool GetMin( float& minVal ) const; + bool GetMax( float& maxVal ) const; + char const *GetDefault( void ) const; + + static void RevertAll( void ); +private: + // Called by CCvar when the value of a var is changing. + virtual void InternalSetValue(char const *value); + // For CVARs marked FCVAR_NEVER_AS_STRING + virtual void InternalSetFloatValue( float fNewValue ); + virtual void InternalSetIntValue( int nValue ); + + virtual bool ClampValue( float& value ); + virtual void ChangeStringValue( char const *tempVal ); + + virtual void Create( char const *pName, char const *pDefaultValue, int flags = 0, + char const *pHelpString = 0, bool bMin = false, float fMin = 0.0, + bool bMax = false, float fMax = false, FnChangeCallback callback = 0 ); + + // Used internally by OneTimeInit to initialize. + virtual void Init(); + +private: + + // This either points to "this" or it points to the original declaration of a ConVar. + // This allows ConVars to exist in separate modules, and they all use the first one to be declared. + // m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar). + ConVar *m_pParent; + + // Static data + char const *m_pszDefaultValue; + + // Value + // Dynamically allocated + char *m_pszString; + int m_StringLength; + + // Values + float m_fValue; + int m_nValue; + + // Min/Max values + bool m_bHasMin; + float m_fMinVal; + bool m_bHasMax; + float m_fMaxVal; + + // Call this function when ConVar changes + FnChangeCallback m_fnChangeCallback; +}; + + +//----------------------------------------------------------------------------- +// Purpose: Return ConVar value as a float +// Output : float +//----------------------------------------------------------------------------- +FORCEINLINE_CVAR float ConVar::GetFloat( void ) const +{ + return m_pParent->m_fValue; +} + +//----------------------------------------------------------------------------- +// Purpose: Return ConVar value as an int +// Output : int +//----------------------------------------------------------------------------- +FORCEINLINE_CVAR int ConVar::GetInt( void ) const +{ + return m_pParent->m_nValue; +} + + +//----------------------------------------------------------------------------- +// Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. +// Output : char const * +//----------------------------------------------------------------------------- +FORCEINLINE_CVAR char const *ConVar::GetString( void ) const +{ + if ( m_nFlags & FCVAR_NEVER_AS_STRING ) + { + return "FCVAR_NEVER_AS_STRING"; + } + + return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : ""; +} + + +#ifdef _STATIC_LINKED +// identifies subsystem via piggybacking constructors with flags +class G_ConCommand : public ConCommand +{ +public: + G_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_GAMEDLL, completionFunc) {} +}; + +class C_ConCommand : public ConCommand +{ +public: + C_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_CLIENTDLL, completionFunc) {} +}; + +class M_ConCommand : public ConCommand +{ +public: + M_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_MATERIAL_SYSTEM, completionFunc) {} +}; + +class S_ConCommand : public ConCommand +{ +public: + S_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_STUDIORENDER, completionFunc) {} +}; + +class D_ConCommand : public ConCommand +{ +public: + D_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_DATACACHE, completionFunc) {} +}; + +typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString ); +typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString ); +typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString ); +typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString ); +typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString ); + +class G_ConVar : public ConVar +{ +public: + G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, (FnChangeCallback)callback ) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class C_ConVar : public ConVar +{ +public: + C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, (FnChangeCallback)callback ) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class M_ConVar : public ConVar +{ +public: + M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, (FnChangeCallback)callback ) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class S_ConVar : public ConVar +{ +public: + S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, (FnChangeCallback)callback ) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, S_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class D_ConVar : public ConVar +{ +public: + D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, (FnChangeCallback)callback ) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, D_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +// redirect these declarations to their specific subsystem +#ifdef GAME_DLL +#define ConCommand G_ConCommand +#define ConVar G_ConVar +#endif +#ifdef CLIENT_DLL +#define ConCommand C_ConCommand +#define ConVar C_ConVar +#endif +#ifdef MATERIALSYSTEM_DLL +#define ConCommand M_ConCommand +#define ConVar M_ConVar +#endif +#ifdef STUDIORENDER_DLL +#define ConCommand S_ConCommand +#define ConVar S_ConVar +#endif +#ifdef DATACACHE_DLL +#define ConCommand D_ConCommand +#define ConVar D_ConVar +#endif +#endif // _STATIC_LINKED + +//----------------------------------------------------------------------------- +// Purpose: Utility to quicky generate a simple console command +//----------------------------------------------------------------------------- +#define CON_COMMAND( name, description ) \ + static void name(); \ + static ConCommand name##_command( #name, name, description ); \ + static void name() + +//----------------------------------------------------------------------------- +// Purpose: Utility to quicky generate a simple console command +//----------------------------------------------------------------------------- +#define CON_COMMAND_F( name, description, flags ) \ + static void name(); \ + static ConCommand name##_command( #name, name, description, flags ); \ + static void name() + + +#endif // CONVAR_H diff --git a/providers/episode1/provider_ep1.cpp b/providers/episode1/provider_ep1.cpp new file mode 100644 index 0000000..a4e91b2 --- /dev/null +++ b/providers/episode1/provider_ep1.cpp @@ -0,0 +1,264 @@ +#include "convar_smm.h" +#include +#include +#include +#include "provider_util.h" +#include "provider_ep1.h" +#include "console.h" + +/* Types */ +typedef void (*CONPRINTF_FUNC)(const char *, ...); +/* Imports */ +#undef CommandLine +DLL_IMPORT ICommandLine *CommandLine(); +/* Functions */ +CONPRINTF_FUNC ExtractRemotePrinter(); +/* Variables */ +CONPRINTF_FUNC echo_msg_func = NULL; +IVEngineServer *engine = NULL; +IServerGameDLL *server = NULL; +ICvar *icvar = NULL; + +void BaseProvider::ConsolePrint(const char *str) +{ + if (echo_msg_func != NULL) + { + echo_msg_func("%s", str); + } + else + { + Msg("%s", str); + } +} + +void BaseProvider::Notify_DLLInit_Pre() +{ + echo_msg_func = ExtractRemotePrinter(); +} + +bool BaseProvider::IsRemotePrintingAvailable() +{ + return (echo_msg_func != NULL); +} + +void BaseProvider::ClientConsolePrint(edict_t *client, const char *message) +{ + engine->ClientPrintf(client, message); +} + +void BaseProvider::ServerCommand(const char *cmd) +{ + engine->ServerCommand(cmd); +} + +const char *BaseProvider::GetConVarString(ConVar *convar) +{ + return convar->GetString(); +} + +bool BaseProvider::IsConCommandBaseACommand(ConCommandBase *pCommand) +{ + return pCommand->IsCommand(); +} + + +bool BaseProvider::IsSourceEngineBuildCompatible(int build) +{ + return (build == SOURCE_ENGINE_ORIGINAL + || build == SOURCE_ENGINE_EPISODEONE); +} + +const char *BaseProvider::GetCommandLineValue(const char *key, const char *defval) +{ + if (key[0] == '-' || key[0] == '+') + { + return CommandLine()->ParmValue(key, defval); + } + else + { + const char *val; + if ((val = icvar->GetCommandLineValue(key)) == NULL) + { + return defval; + } + + return val; + } +} + +int BaseProvider::TryServerGameDLL(const char *iface) +{ + if (strncmp(iface, "ServerGameDLL", 13) != 0) + { + return 0; + } + + return atoi(&iface[13]); +} + +bool BaseProvider::LogMessage(const char *buffer) +{ + if (!engine) + { + return false; + } + + engine->LogPrint(buffer); + + return true; +} + +bool BaseProvider::GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo) +{ + SourceHook::MemFuncInfo mfi = {true, -1, 0, 0}; + + if (hook == ProvidedHook_LevelInit) + { + SourceHook::GetFuncInfo(&IServerGameDLL::LevelInit, mfi); + } + else if (hook == ProvidedHook_LevelShutdown) + { + SourceHook::GetFuncInfo(&IServerGameDLL::LevelShutdown, mfi); + } + else if (hook == ProvidedHook_GameInit) + { + SourceHook::GetFuncInfo(&IServerGameDLL::GameInit, mfi); + } + else if (hook == ProvidedHook_DLLShutdown) + { + SourceHook::GetFuncInfo(&IServerGameDLL::DLLShutdown, mfi); + } + else if (hook == ProvidedHook_DLLInit) + { + SourceHook::GetFuncInfo(&IServerGameDLL::DLLInit, mfi); + } + + *pInfo = mfi; + + return (mfi.thisptroffs >= 0); +} + +void BaseProvider::DisplayError(const char *fmt, ...) +{ + va_list ap; + char buffer[2048]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + Error(buffer); +} + +void BaseProvider::DisplayWarning(const char *fmt, ...) +{ + va_list ap; + char buffer[2048]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + Warning(buffer); +} + +IConCommandBaseAccessor *BaseProvider::GetConCommandBaseAccessor() +{ + return &g_SMConVarAccessor; +} + +bool BaseProvider::RegisterConCommandBase(ConCommandBase *pCommand) +{ + return g_SMConVarAccessor.Register(pCommand); +} + +void BaseProvider::UnregisterConCommandBase(ConCommandBase *pCommand) +{ + return g_SMConVarAccessor.Unregister(pCommand); +} + +////////////////////////////////////////////////////////////////////////// +//THERE BE HAX HERE!!!! DON'T TELL ALFRED, BUT GABE WANTED IT THAT WAY. // +// (note: you can find the offset by looking for the text // +// "Echo text to console", you'll find the callback cmd pushed on the // +// stack.) // +////////////////////////////////////////////////////////////////////////// + +#define SIGLEN 8 +#define ENGINE486_SIG "\x55\x89\xE5\x53\x83\xEC\x14\xBB" +#define ENGINE486_OFFS 40 +#define ENGINE686_SIG "\x53\x83\xEC\x08\xBB\x01\x00\x00" +#define ENGINE686_OFFS 50 +#define ENGINEAMD_SIG "\x53\x51\xBB\x01\x00\x00\x00\x51" +#define ENGINEAMD_OFFS 47 +#define ENGINEW32_SIG "\xA1\x2A\x2A\x2A\x2A\x56\xBE\x01" +#define ENGINEW32_OFFS 38 +#define IA32_CALL 0xE8 + +bool vcmp(const void *_addr1, const void *_addr2, size_t len) +{ + unsigned char *addr1 = (unsigned char *)_addr1; + unsigned char *addr2 = (unsigned char *)_addr2; + + for (size_t i=0; iGetCommands(); + unsigned char *ptr = NULL; + FnCommandCallback callback = NULL; + int offs = 0; + + while (pBase) + { + if ( strcmp(pBase->GetName(), "echo") == 0 ) + { + callback = ((ConCommand *)pBase)->GetCallback(); + ptr = (unsigned char *)callback; +#ifdef OS_LINUX + if (vcmp(ptr, ENGINE486_SIG, SIGLEN)) + { + offs = ENGINE486_OFFS; + } + else if (vcmp(ptr, ENGINE686_SIG, SIGLEN)) + { + offs = ENGINE686_OFFS; + } + else if (vcmp(ptr, ENGINEAMD_SIG, SIGLEN)) + { + offs = ENGINEAMD_OFFS; + } +#elif defined OS_WIN32 // Only one Windows engine binary so far... + if (vcmp(ptr, ENGINEW32_SIG, SIGLEN)) + { + offs = ENGINEW32_OFFS; + } +#endif + + if (!offs || ptr[offs - 1] != IA32_CALL) + { + return NULL; + } + //get the relative offset + void *addr = *((void **)(ptr + offs)); + //add the base offset, to the ip (which is the address+offset + 4 bytes for next instruction) + return (CONPRINTF_FUNC)((unsigned long)addr + (unsigned long)(ptr + offs) + 4); + } + pBase = const_cast(pBase->GetNext()); + } + + return NULL; +} + + diff --git a/providers/episode1/provider_ep1.h b/providers/episode1/provider_ep1.h new file mode 100644 index 0000000..c6be648 --- /dev/null +++ b/providers/episode1/provider_ep1.h @@ -0,0 +1,49 @@ +#ifndef _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ +#define _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ + +#include +#include + +using namespace SourceMM; + +class BaseProvider : public IMetamodSourceProvider +{ +public: + virtual bool IsSourceEngineBuildCompatible(int build); + virtual bool GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo); + virtual bool LogMessage(const char *buffer); + virtual const char *GetCommandLineValue(const char *key, const char *defval); + virtual void ConsolePrint(const char *msg); + virtual bool IsRemotePrintingAvailable(); + virtual void ClientConsolePrint(edict_t *client, const char *msg); + virtual IServerPluginCallbacks *GetVSPCallbacks(const char *iface); + virtual void DisplayError(const char *fmt, ...); + virtual void DisplayWarning(const char *fmt, ...); + virtual int TryServerGameDLL(const char *iface); + virtual void Notify_DLLInit_Pre(); + virtual void ServerCommand(const char *cmd); + virtual ConVar *CreateConVar(const char *name, + const char *defval, + const char *help, + int flags); + virtual const char *GetConVarString(ConVar *convar); + virtual void CreateCommand(const char *name, + METAMOD_COMMAND callback, + const char *help); + virtual void SetClientCommandHandler(METAMOD_COMMAND callback); + virtual const char *GetGameDescription(); + virtual IConCommandBaseAccessor *GetConCommandBaseAccessor(); + virtual bool RegisterConCommandBase(ConCommandBase *pCommand); + virtual void UnregisterConCommandBase(ConCommandBase *pCommand); + virtual bool IsConCommandBaseACommand(ConCommandBase *pCommand); + virtual int GetUserMessageCount(); + virtual int FindUserMessage(const char *name, int *size=NULL); + virtual const char *GetUserMessage(int index, int *size=NULL); +}; + +extern IVEngineServer *engine; +extern IServerGameDLL *server; +extern ICvar *icvar; + +#endif //_INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ + diff --git a/providers/provider_util.cpp b/providers/provider_util.cpp new file mode 100644 index 0000000..5cdcc5f --- /dev/null +++ b/providers/provider_util.cpp @@ -0,0 +1,15 @@ +#include "provider_util.h" + +size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params) +{ + size_t len = vsnprintf(buffer, maxlength, fmt, params); + + if (len >= maxlength) + { + len = maxlength - 1; + buffer[len] = '\0'; + } + + return len; +} + diff --git a/providers/provider_util.h b/providers/provider_util.h new file mode 100644 index 0000000..742f5b5 --- /dev/null +++ b/providers/provider_util.h @@ -0,0 +1,11 @@ +#ifndef _METAMOD_SOURCE_PROVIDER_UTIL_H_ +#define _METAMOD_SOURCE_PROVIDER_UTIL_H_ + +#include +#include +#include + +size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params); + +#endif //_METAMOD_SOURCE_PROVIDER_UTIL_H_ + From cc18058a510b99819d6895d1d251a9014fa07fff Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 27 Sep 2007 20:43:03 +0000 Subject: [PATCH 12/25] more filling in of the provider for episode1 --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40433 --- providers/episode1/provider_ep1.cpp | 242 +++++++++++++++++++++++++++- providers/episode1/provider_ep1.h | 3 + 2 files changed, 243 insertions(+), 2 deletions(-) diff --git a/providers/episode1/provider_ep1.cpp b/providers/episode1/provider_ep1.cpp index a4e91b2..55c6530 100644 --- a/providers/episode1/provider_ep1.cpp +++ b/providers/episode1/provider_ep1.cpp @@ -1,23 +1,41 @@ #include "convar_smm.h" #include #include +#include #include +#include +#include #include "provider_util.h" #include "provider_ep1.h" #include "console.h" /* Types */ typedef void (*CONPRINTF_FUNC)(const char *, ...); +struct UsrMsgInfo +{ + int size; + String name; +}; /* Imports */ #undef CommandLine DLL_IMPORT ICommandLine *CommandLine(); /* Functions */ CONPRINTF_FUNC ExtractRemotePrinter(); +bool CacheUserMessages(); +void ClientCommand(edict_t *pEdict); /* Variables */ +bool usermsgs_extracted = false; +CVector usermsgs_list; CONPRINTF_FUNC echo_msg_func = NULL; +METAMOD_COMMAND client_cmd_handler = NULL; +ICvar *icvar = NULL; +ISourceHook *g_SHPtr = NULL; IVEngineServer *engine = NULL; IServerGameDLL *server = NULL; -ICvar *icvar = NULL; +IServerGameClients *gameclients = NULL; +unsigned int g_PLID; + +SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); void BaseProvider::ConsolePrint(const char *str) { @@ -34,6 +52,9 @@ void BaseProvider::ConsolePrint(const char *str) void BaseProvider::Notify_DLLInit_Pre() { echo_msg_func = ExtractRemotePrinter(); + usermsgs_extracted = CacheUserMessages(); + + SH_ADD_HOOK_STATICFUNC(IServerGameClients, ClientCommand, gameclients, ClientCommand, false); } bool BaseProvider::IsRemotePrintingAvailable() @@ -177,6 +198,91 @@ void BaseProvider::UnregisterConCommandBase(ConCommandBase *pCommand) return g_SMConVarAccessor.Unregister(pCommand); } +int BaseProvider::GetUserMessageCount() +{ + if (!usermsgs_extracted) + { + return -1; + } + + return (int)usermsgs_list.size(); +} + +int BaseProvider::FindUserMessage(const char *name, int *size) +{ + for (size_t i = 0; i < usermsgs_list.size(); i++) + { + if (usermsgs_list[i].name.compare(name) == 0) + { + if (size) + { + *size = usermsgs_list[i].size; + } + return (int)i; + } + } + + return -1; +} + +const char *BaseProvider::GetUserMessage(int index, int *size) +{ + if (!usermsgs_extracted || index < 0 || index >= (int)usermsgs_list.size()) + { + return NULL; + } + + if (size) + { + *size = usermsgs_list[index].size; + } + + return usermsgs_list[index].name.c_str(); +} + +const char *BaseProvider::GetGameDescription() +{ + return server->GetGameDescription(); +} + +void BaseProvider::SetClientCommandHandler(METAMOD_COMMAND callback) +{ + client_cmd_handler = callback; +} + +class GlobCommand : public IMetamodSourceCommandInfo +{ +public: + unsigned int GetArgCount() + { + return engine->Cmd_Argc() - 1; + } + + const char *GetArg(unsigned int num) + { + return engine->Cmd_Argv(num); + } + + const char *GetArgString() + { + return engine->Cmd_Args(); + } +}; + +void ClientCommand(edict_t *pEdict) +{ + if (client_cmd_handler) + { + GlobCommand cmd; + bool result; + + if ((result = client_cmd_handler(pEdict, &cmd)) == true) + { + RETURN_META(MRES_SUPERCEDE); + } + } +} + ////////////////////////////////////////////////////////////////////////// //THERE BE HAX HERE!!!! DON'T TELL ALFRED, BUT GABE WANTED IT THAT WAY. // // (note: you can find the offset by looking for the text // @@ -203,9 +309,13 @@ bool vcmp(const void *_addr1, const void *_addr2, size_t len) for (size_t i=0; iGetName(), "echo") == 0 ) + if (strcmp(pBase->GetName(), "echo") == 0) { callback = ((ConCommand *)pBase)->GetCallback(); ptr = (unsigned char *)callback; @@ -261,4 +371,132 @@ CONPRINTF_FUNC ExtractRemotePrinter() return NULL; } +////////////////////////////////////////////////////////////////////// +// EVEN MORE HACKS HERE! YOU HAVE BEEN WARNED! // +// Signatures necessary in finding the pointer to the CUtlDict that // +// stores user message information. // +// IServerGameDLL::GetUserMessageInfo() normally crashes with bad // +// message indices. This is our answer to it. Yuck! <:-( // +////////////////////////////////////////////////////////////////////// +#ifdef OS_WIN32 + /* General Windows sig */ + #define MSGCLASS_SIGLEN 7 + #define MSGCLASS_SIG "\x8B\x0D\x2A\x2A\x2A\x2A\x56" + #define MSGCLASS_OFFS 2 + + /* Dystopia Wimdows hack */ + #define MSGCLASS2_SIGLEN 16 + #define MSGCLASS2_SIG "\x56\x8B\x74\x24\x2A\x85\xF6\x7C\x2A\x3B\x35\x2A\x2A\x2A\x2A\x7D" + #define MSGCLASS2_OFFS 11 + + /* Windows frame pointer sig */ + #define MSGCLASS3_SIGLEN 18 + #define MSGCLASS3_SIG "\x55\x8B\xEC\x51\x89\x2A\x2A\x8B\x2A\x2A\x50\x8B\x0D\x2A\x2A\x2A\x2A\xE8" + #define MSGCLASS3_OFFS 13 +#elif defined OS_LINUX + /* No frame pointer sig */ + #define MSGCLASS_SIGLEN 14 + #define MSGCLASS_SIG "\x53\x83\xEC\x2A\x8B\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" + #define MSGCLASS_OFFS 9 + + /* Frame pointer sig */ + #define MSGCLASS2_SIGLEN 16 + #define MSGCLASS2_SIG "\x55\x89\xE5\x53\x83\xEC\x2A\x8B\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" + #define MSGCLASS2_OFFS 11 +#endif + +struct UserMessage +{ + int size; + const char *name; +}; + +typedef CUtlDict UserMsgDict; + +/* This is the ugliest function in all of SourceMM */ +bool CacheUserMessages() +{ + /* Get address of original GetUserMessageInfo() */ + char *vfunc = NULL; + /* :TODO: fix this for v5 (char *)SH_GET_ORIG_VFNPTR_ENTRY(server, &IServerGameDLL::GetUserMessageInfo); */ + + /* Oh dear, we have a relative jump on our hands + * PVK II on Windows made me do this, but I suppose it doesn't hurt to check this on Linux too... + */ + if (*vfunc == '\xE9') + { + /* Get address from displacement... + * + * Add 5 because it's relative to next instruction: + * Opcode <1 byte> + 32-bit displacement <4 bytes> + */ + vfunc += *reinterpret_cast(vfunc + 1) + 5; + } + + CUtlDict *dict = NULL; + + if (vcmp(vfunc, MSGCLASS_SIG, MSGCLASS_SIGLEN)) + { + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + } + else if (vcmp(vfunc, MSGCLASS2_SIG, MSGCLASS2_SIGLEN)) + { + #ifdef OS_WIN32 + /* If we get here, the code is possibly inlined like in Dystopia */ + + /* Get the address of the CUtlRBTree */ + char *rbtree = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); + + /* CUtlDict should be 8 bytes before the CUtlRBTree (hacktacular!) */ + dict = reinterpret_cast(rbtree - 8); + #elif defined OS_LINUX + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + #endif + #ifdef OS_WIN32 + } + else if (vcmp(vfunc, MSGCLASS3_SIG, MSGCLASS3_SIGLEN)) + { + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS3_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + #endif + } + + if (dict) + { + int msg_count = dict->Count(); + + /* Ensure that count is within bounds of an unsigned byte, because that's what engine supports */ + if (msg_count < 0 || msg_count > 255) + { + return false; + } + + UserMessage *msg; + UsrMsgInfo u_msg; + + /* Cache messages in our CUtlDict */ + for (int i = 0; i < msg_count; i++) + { + msg = dict->Element(i); + u_msg.name = msg->name; + u_msg.size = msg->size; + usermsgs_list.push_back(u_msg); + } + + return true; + } + + return false; +} diff --git a/providers/episode1/provider_ep1.h b/providers/episode1/provider_ep1.h index c6be648..6be81bc 100644 --- a/providers/episode1/provider_ep1.h +++ b/providers/episode1/provider_ep1.h @@ -3,8 +3,10 @@ #include #include +#include "oslink.h" using namespace SourceMM; +using namespace SourceHook; class BaseProvider : public IMetamodSourceProvider { @@ -43,6 +45,7 @@ public: extern IVEngineServer *engine; extern IServerGameDLL *server; +extern IServerGameClients *gameclients; extern ICvar *icvar; #endif //_INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ From 6cfff6ed919866869ac7815c552886581dcc62c7 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 28 Sep 2007 21:31:02 +0000 Subject: [PATCH 13/25] combining everything into one binary again now that api is separated --HG-- branch : sourcemm-1.6.0 rename : sourcemm/oslink.cpp => sourcemm/metamod_oslink.cpp rename : sourcemm/oslink.h => sourcemm/metamod_oslink.h extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40434 --- sourcemm/ISmmAPI.h | 2 +- sourcemm/ISmmPlugin.h | 2 +- sourcemm/episode1/console.cpp | 111 ++++ sourcemm/episode1/console.h | 24 + sourcemm/episode1/convar_smm.h | 523 ++++++++++++++++++ sourcemm/episode1/provider_ep1.cpp | 553 ++++++++++++++++++++ sourcemm/episode1/provider_ep1.h | 53 ++ sourcemm/metamod.cpp | 36 +- sourcemm/metamod.h | 3 - sourcemm/metamod_console.cpp | 2 +- sourcemm/metamod_console.h | 2 +- sourcemm/{oslink.cpp => metamod_oslink.cpp} | 2 +- sourcemm/{oslink.h => metamod_oslink.h} | 0 sourcemm/metamod_plugins.h | 2 +- sourcemm/metamod_provider.h | 32 +- sourcemm/metamod_util.cpp | 2 +- sourcemm/msvc8/sourcemm.sln | 20 - sourcemm/msvc8/sourcemm.vcproj | 336 ------------ 18 files changed, 1307 insertions(+), 398 deletions(-) create mode 100644 sourcemm/episode1/console.cpp create mode 100644 sourcemm/episode1/console.h create mode 100644 sourcemm/episode1/convar_smm.h create mode 100644 sourcemm/episode1/provider_ep1.cpp create mode 100644 sourcemm/episode1/provider_ep1.h rename sourcemm/{oslink.cpp => metamod_oslink.cpp} (98%) rename sourcemm/{oslink.h => metamod_oslink.h} (100%) delete mode 100644 sourcemm/msvc8/sourcemm.sln delete mode 100644 sourcemm/msvc8/sourcemm.vcproj diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h index 6977128..e872262 100644 --- a/sourcemm/ISmmAPI.h +++ b/sourcemm/ISmmAPI.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include "IPluginManager.h" #if defined __GNUC__ diff --git a/sourcemm/ISmmPlugin.h b/sourcemm/ISmmPlugin.h index 350c7cb..99769e5 100644 --- a/sourcemm/ISmmPlugin.h +++ b/sourcemm/ISmmPlugin.h @@ -17,7 +17,7 @@ */ #include -#include +#include #include "ISmmAPI.h" #define PLAPI_VERSION 12 diff --git a/sourcemm/episode1/console.cpp b/sourcemm/episode1/console.cpp new file mode 100644 index 0000000..e6d7c83 --- /dev/null +++ b/sourcemm/episode1/console.cpp @@ -0,0 +1,111 @@ +#include "console.h" +#include "provider_ep1.h" + +using namespace SourceHook; + +SMConVarAccessor g_SMConVarAccessor; + +class CAlwaysRegisterableCommand : public ConCommandBase +{ +public: + CAlwaysRegisterableCommand() + { + Create("metamod_eternal", NULL, FCVAR_UNREGISTERED|FCVAR_GAMEDLL); + } + bool IsRegistered( void ) const + { + return false; + } + void BringToFront() + { + // First, let's try to find us! + ConCommandBase *pPtr = icvar->GetCommands(); + + if (pPtr == this) + { + // We are already at the beginning; Nothing to do + return; + } + + while (pPtr) + { + if (pPtr == this) + { + break; + } + ConCommandBase *pPrev = NULL; + while (pPtr) + { + if (pPtr == this) + { + break; + } + pPrev = pPtr; + pPtr = const_cast(pPtr->GetNext()); + } + if (pPrev && pPtr == this) + { + pPrev->SetNext(m_pNext); // Remove us from the list + } + // Now, register us + SetNext(NULL); + icvar->RegisterConCommandBase(this); + } + } +} s_EternalCommand; + +bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) +{ + m_RegisteredCommands.push_back(pCommand); + pCommand->SetNext(NULL); + icvar->RegisterConCommandBase(pCommand); + + return true; +} + +bool SMConVarAccessor::Register(ConCommandBase *pCommand) +{ + pCommand->SetNext(NULL); + icvar->RegisterConCommandBase(pCommand); + + return true; +} + +void SMConVarAccessor::MarkCommandsAsGameDLL() +{ + for (List::iterator iter = m_RegisteredCommands.begin(); + iter != m_RegisteredCommands.end(); ++iter) + { + (*iter)->AddFlags(FCVAR_GAMEDLL); + } +} + +void SMConVarAccessor::Unregister(ConCommandBase *pCommand) +{ + ConCommandBase *ptr = icvar->GetCommands(); + + if (ptr == pCommand) + { + s_EternalCommand.BringToFront(); + s_EternalCommand.SetNext(const_cast(pCommand->GetNext())); + } + else + { + /* Find us and unregister us */ + ConCommandBase *pPrev = NULL; + while (ptr) + { + if (ptr == pCommand) + { + break; + } + pPrev = ptr; + ptr = const_cast(ptr->GetNext()); + } + if (pPrev && ptr == pCommand) + { + pPrev->SetNext(const_cast(pCommand->GetNext())); + } + } +} + diff --git a/sourcemm/episode1/console.h b/sourcemm/episode1/console.h new file mode 100644 index 0000000..3e388d7 --- /dev/null +++ b/sourcemm/episode1/console.h @@ -0,0 +1,24 @@ +#ifndef _INCLUDE_CONSOLE_MMS_H_ +#define _INCLUDE_CONSOLE_MMS_H_ + +#include +#include +#include "convar_smm.h" +#include + +class SMConVarAccessor : public IConCommandBaseAccessor +{ +public: + bool RegisterConCommandBase(ConCommandBase *pCommand); + bool Register(ConCommandBase *pCommand); + void MarkCommandsAsGameDLL(); + void Unregister(ConCommandBase *pCommand); + void UnregisterGameDLLCommands(); +private: + SourceHook::List m_RegisteredCommands; +}; + +extern SMConVarAccessor g_SMConVarAccessor; + +#endif //_INCLUDE_CONSOLE_MMS_H_ + diff --git a/sourcemm/episode1/convar_smm.h b/sourcemm/episode1/convar_smm.h new file mode 100644 index 0000000..8e5dd82 --- /dev/null +++ b/sourcemm/episode1/convar_smm.h @@ -0,0 +1,523 @@ +//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $Workfile: $ +// $Date: 2007-02-08 04:19:19 -0500 (Thu, 08 Feb 2007) $ +// +//----------------------------------------------------------------------------- +// $NoKeywords: $ +//=============================================================================// + +#ifndef CONVAR_H +#define CONVAR_H +#if _WIN32 +#pragma once +#endif + +#include "tier0/dbg.h" + +#ifdef _WIN32 +#define FORCEINLINE_CVAR FORCEINLINE +#elif _LINUX +#define FORCEINLINE_CVAR __inline__ FORCEINLINE +#else +#error "implement me" +#endif + +// The default, no flags at all +#define FCVAR_NONE 0 + +// Command to ConVars and ConCommands +// ConVar Systems +#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. +#define FCVAR_LAUNCHER (1<<1) // defined by launcher +#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL +#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL +#define FCVAR_MATERIAL_SYSTEM (1<<4) // Defined by the material system. +#define FCVAR_DATACACHE (1<<19) // Defined by the datacache system. +#define FCVAR_STUDIORENDER (1<<15) // Defined by the studiorender system. +#define FCVAR_FILESYSTEM (1<<21) // Defined by the file system. +#define FCVAR_PLUGIN (1<<18) // Defined by a 3rd party plugin. +#define FCVAR_TOOLSYSTEM (1<<20) // Defined by an IToolSystem library +#define FCVAR_SOUNDSYSTEM (1<<23) // Defined by the soundsystem library +#define FCVAR_INPUTSYSTEM (1<<25) // Defined by the inputsystem dll +#define FCVAR_NETWORKSYSTEM (1<<26) // Defined by the network system +// NOTE!! if you add a cvar system, add it here too!!!! +// the engine lacks a cvar flag, but needs it for xbox +// an engine cvar is thus a cvar not marked with any other system +#define FCVAR_NON_ENGINE ((FCVAR_LAUNCHER|FCVAR_GAMEDLL|FCVAR_CLIENTDLL|FCVAR_MATERIAL_SYSTEM|FCVAR_DATACACHE|FCVAR_STUDIORENDER|FCVAR_FILESYSTEM|FCVAR_PLUGIN|FCVAR_TOOLSYSTEM|FCVAR_SOUNDSYSTEM|FCVAR_INPUTSYSTEM|FCVAR_NETWORKSYSTEM)) + +// ConVar only +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc +#define FCVAR_NOTIFY (1<<8) // notifies players when changed +#define FCVAR_USERINFO (1<<9) // changes the client's info string +#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats + +#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log +#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar + +// It's a ConVar that's shared between the client and the server. +// At signon, the values of all such ConVars are sent from the server to the client (skipped for local +// client, of course ) +// If a change is requested it must come from the console (i.e., no remote client changes) +// If a value is changed while a server is active, it's replicated to all connected clients +#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time +#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file +#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles + +#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server + +#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox + + +// #define FCVAR_AVAILABLE (1<<27) +// #define FCVAR_AVAILABLE (1<<28) +// #define FCVAR_AVAILABLE (1<<29) +// #define FCVAR_AVAILABLE (1<<30) +// #define FCVAR_AVAILABLE (1<<31) + + +class ConVar; +class ConCommand; +class ConCommandBase; + +// Any executable that wants to use ConVars need to implement one of +// these to hook up access to console variables. +class IConCommandBaseAccessor +{ +public: + // Flags is a combination of FCVAR flags in cvar.h. + // hOut is filled in with a handle to the variable. + virtual bool RegisterConCommandBase( ConCommandBase *pVar )=0; +}; + + +// You don't have to instantiate one of these, just call its +// OneTimeInit function when your executable is initializing. +class ConCommandBaseMgr +{ +public: + // Call this ONCE when the executable starts up. + static void OneTimeInit( IConCommandBaseAccessor *pAccessor ); +#ifdef _XBOX + static bool Fixup( ConCommandBase* pConCommandBase ); +#ifndef _RETAIL + static void PublishCommands( bool bForce ); +#endif +#endif +}; + +// Called when a ConVar changes value +typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString ); + +// Called when a ConCommand needs to execute +typedef void ( *FnCommandCallback )( void ); + +#define COMMAND_COMPLETION_MAXITEMS 64 +#define COMMAND_COMPLETION_ITEM_LENGTH 64 + +// Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings +typedef int ( *FnCommandCompletionCallback )( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); + +//----------------------------------------------------------------------------- +// Purpose: The base console invoked command/cvar interface +//----------------------------------------------------------------------------- +class ConCommandBase +{ + friend class ConCommandBaseMgr; + friend class CCvar; + friend class ConVar; + friend class ConCommand; + +public: + ConCommandBase( void ); + ConCommandBase( char const *pName, char const *pHelpString = 0, + int flags = 0 ); + + virtual ~ConCommandBase( void ); + + virtual bool IsCommand( void ) const; + + // Check flag + virtual bool IsBitSet( int flag ) const; + // Set flag + virtual void AddFlags( int flags ); + + // Return name of cvar + virtual char const *GetName( void ) const; + + // Return help text for cvar + virtual char const *GetHelpText( void ) const; + + // Deal with next pointer + const ConCommandBase *GetNext( void ) const; + void SetNext( ConCommandBase *next ); + + virtual bool IsRegistered( void ) const; + + // Global methods + static ConCommandBase const *GetCommands( void ); + static void AddToList( ConCommandBase *var ); + static void RemoveFlaggedCommands( int flag ); + static void RevertFlaggedCvars( int flag ); + static ConCommandBase const *FindCommand( char const *name ); + +protected: + virtual void Create( char const *pName, char const *pHelpString = 0, + int flags = 0 ); + + // Used internally by OneTimeInit to initialize. + virtual void Init(); + + // Internal copy routine ( uses new operator from correct module ) + char *CopyString( char const *from ); + + // Next ConVar in chain + ConCommandBase *m_pNext; + +private: + // Has the cvar been added to the global list? + bool m_bRegistered; + + // Static data + char const *m_pszName; + char const *m_pszHelpString; + + // ConVar flags + int m_nFlags; + +protected: + + // ConVars add themselves to this list for the executable. Then ConVarMgr::Init() runs through + // all the console variables and registers them. + static ConCommandBase *s_pConCommandBases; + + // ConVars in this executable use this 'global' to access values. + static IConCommandBaseAccessor *s_pAccessor; +}; + +//----------------------------------------------------------------------------- +// Purpose: The console invoked command +//----------------------------------------------------------------------------- +class ConCommand : public ConCommandBase +{ +friend class ConCommandBaseMgr; +friend class CCvar; +#ifdef _STATIC_LINKED +friend class G_ConCommand; +friend class C_ConCommand; +friend class M_ConCommand; +friend class S_ConCommand; +friend class D_ConCommand; +#endif + +public: + typedef ConCommandBase BaseClass; + + ConCommand( void ); + ConCommand( char const *pName, FnCommandCallback callback, + char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); + + virtual ~ConCommand( void ); + + virtual bool IsCommand( void ) const; + + virtual int AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); + + virtual bool CanAutoComplete( void ); + + // Invoke the function + virtual void Dispatch( void ); +private: + virtual void Create( char const *pName, FnCommandCallback callback, + char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); + + // Call this function when executing the command + FnCommandCallback m_fnCommandCallback; + + FnCommandCompletionCallback m_fnCompletionCallback; + bool m_bHasCompletionCallback; +public: + FnCommandCallback GetCallback() { return m_fnCommandCallback; } +}; + +//----------------------------------------------------------------------------- +// Purpose: A console variable +//----------------------------------------------------------------------------- +class ConVar : public ConCommandBase +{ +friend class ConCommandBaseMgr; +friend class CCvar; +friend class CDefaultCvar; +#ifdef _STATIC_LINKED +friend class G_ConVar; +friend class C_ConVar; +friend class M_ConVar; +friend class S_ConVar; +friend class D_ConVar; +#endif + +public: + typedef ConCommandBase BaseClass; + + ConVar( char const *pName, char const *pDefaultValue, int flags = 0); + + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString ); + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ); + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString, FnChangeCallback callback ); + ConVar( char const *pName, char const *pDefaultValue, int flags, + char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, + FnChangeCallback callback ); + + virtual ~ConVar( void ); + + virtual bool IsBitSet( int flag ) const; + virtual char const* GetHelpText( void ) const; + virtual bool IsRegistered( void ) const; + virtual char const *GetName( void ) const; + virtual void AddFlags( int flags ); + virtual bool IsCommand( void ) const; + + // Install a change callback (there shouldn't already be one....) + void InstallChangeCallback( FnChangeCallback callback ); + + // Retrieve value + FORCEINLINE_CVAR float GetFloat( void ) const; + FORCEINLINE_CVAR int GetInt( void ) const; + FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } + FORCEINLINE_CVAR char const *GetString( void ) const; + + // Any function that allocates/frees memory needs to be virtual or else you'll have crashes + // from alloc/free across dll/exe boundaries. + + // These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue). + virtual void SetValue( char const *value ); + virtual void SetValue( float value ); + virtual void SetValue( int value ); + + // Reset to default value + void Revert( void ); + + // True if it has a min/max setting + bool GetMin( float& minVal ) const; + bool GetMax( float& maxVal ) const; + char const *GetDefault( void ) const; + + static void RevertAll( void ); +private: + // Called by CCvar when the value of a var is changing. + virtual void InternalSetValue(char const *value); + // For CVARs marked FCVAR_NEVER_AS_STRING + virtual void InternalSetFloatValue( float fNewValue ); + virtual void InternalSetIntValue( int nValue ); + + virtual bool ClampValue( float& value ); + virtual void ChangeStringValue( char const *tempVal ); + + virtual void Create( char const *pName, char const *pDefaultValue, int flags = 0, + char const *pHelpString = 0, bool bMin = false, float fMin = 0.0, + bool bMax = false, float fMax = false, FnChangeCallback callback = 0 ); + + // Used internally by OneTimeInit to initialize. + virtual void Init(); + +private: + + // This either points to "this" or it points to the original declaration of a ConVar. + // This allows ConVars to exist in separate modules, and they all use the first one to be declared. + // m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar). + ConVar *m_pParent; + + // Static data + char const *m_pszDefaultValue; + + // Value + // Dynamically allocated + char *m_pszString; + int m_StringLength; + + // Values + float m_fValue; + int m_nValue; + + // Min/Max values + bool m_bHasMin; + float m_fMinVal; + bool m_bHasMax; + float m_fMaxVal; + + // Call this function when ConVar changes + FnChangeCallback m_fnChangeCallback; +}; + + +//----------------------------------------------------------------------------- +// Purpose: Return ConVar value as a float +// Output : float +//----------------------------------------------------------------------------- +FORCEINLINE_CVAR float ConVar::GetFloat( void ) const +{ + return m_pParent->m_fValue; +} + +//----------------------------------------------------------------------------- +// Purpose: Return ConVar value as an int +// Output : int +//----------------------------------------------------------------------------- +FORCEINLINE_CVAR int ConVar::GetInt( void ) const +{ + return m_pParent->m_nValue; +} + + +//----------------------------------------------------------------------------- +// Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. +// Output : char const * +//----------------------------------------------------------------------------- +FORCEINLINE_CVAR char const *ConVar::GetString( void ) const +{ + if ( m_nFlags & FCVAR_NEVER_AS_STRING ) + { + return "FCVAR_NEVER_AS_STRING"; + } + + return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : ""; +} + + +#ifdef _STATIC_LINKED +// identifies subsystem via piggybacking constructors with flags +class G_ConCommand : public ConCommand +{ +public: + G_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_GAMEDLL, completionFunc) {} +}; + +class C_ConCommand : public ConCommand +{ +public: + C_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_CLIENTDLL, completionFunc) {} +}; + +class M_ConCommand : public ConCommand +{ +public: + M_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_MATERIAL_SYSTEM, completionFunc) {} +}; + +class S_ConCommand : public ConCommand +{ +public: + S_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_STUDIORENDER, completionFunc) {} +}; + +class D_ConCommand : public ConCommand +{ +public: + D_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_DATACACHE, completionFunc) {} +}; + +typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString ); +typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString ); +typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString ); +typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString ); +typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString ); + +class G_ConVar : public ConVar +{ +public: + G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, (FnChangeCallback)callback ) {} + G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class C_ConVar : public ConVar +{ +public: + C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, (FnChangeCallback)callback ) {} + C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class M_ConVar : public ConVar +{ +public: + M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, (FnChangeCallback)callback ) {} + M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class S_ConVar : public ConVar +{ +public: + S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, (FnChangeCallback)callback ) {} + S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, S_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +class D_ConVar : public ConVar +{ +public: + D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, (FnChangeCallback)callback ) {} + D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, D_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} +}; + +// redirect these declarations to their specific subsystem +#ifdef GAME_DLL +#define ConCommand G_ConCommand +#define ConVar G_ConVar +#endif +#ifdef CLIENT_DLL +#define ConCommand C_ConCommand +#define ConVar C_ConVar +#endif +#ifdef MATERIALSYSTEM_DLL +#define ConCommand M_ConCommand +#define ConVar M_ConVar +#endif +#ifdef STUDIORENDER_DLL +#define ConCommand S_ConCommand +#define ConVar S_ConVar +#endif +#ifdef DATACACHE_DLL +#define ConCommand D_ConCommand +#define ConVar D_ConVar +#endif +#endif // _STATIC_LINKED + +//----------------------------------------------------------------------------- +// Purpose: Utility to quicky generate a simple console command +//----------------------------------------------------------------------------- +#define CON_COMMAND( name, description ) \ + static void name(); \ + static ConCommand name##_command( #name, name, description ); \ + static void name() + +//----------------------------------------------------------------------------- +// Purpose: Utility to quicky generate a simple console command +//----------------------------------------------------------------------------- +#define CON_COMMAND_F( name, description, flags ) \ + static void name(); \ + static ConCommand name##_command( #name, name, description, flags ); \ + static void name() + + +#endif // CONVAR_H diff --git a/sourcemm/episode1/provider_ep1.cpp b/sourcemm/episode1/provider_ep1.cpp new file mode 100644 index 0000000..c535a54 --- /dev/null +++ b/sourcemm/episode1/provider_ep1.cpp @@ -0,0 +1,553 @@ +#include +#include "convar_smm.h" +#include +#include +#include +#include +#include +#include "../metamod_util.h" +#include "provider_ep1.h" +#include "console.h" +#include "metamod_console.h" + +/* Types */ +typedef void (*CONPRINTF_FUNC)(const char *, ...); +struct UsrMsgInfo +{ + int size; + String name; +}; +/* Imports */ +#undef CommandLine +DLL_IMPORT ICommandLine *CommandLine(); +/* Functions */ +CONPRINTF_FUNC ExtractRemotePrinter(); +bool CacheUserMessages(); +void ClientCommand(edict_t *pEdict); +void _ServerCommand(); +/* Variables */ +bool usermsgs_extracted = false; +CVector usermsgs_list; +CONPRINTF_FUNC echo_msg_func = NULL; +ICvar *icvar = NULL; +ISmmAPI *metamod_api = NULL; +IVEngineServer *engine = NULL; +IServerGameClients *gameclients = NULL; +BaseProvider g_Ep1Provider; +IMetamodSourceProvider *provider = &g_Ep1Provider; + +SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); + +void BaseProvider::ConsolePrint(const char *str) +{ + if (echo_msg_func != NULL) + { + echo_msg_func("%s", str); + } + else + { + Msg("%s", str); + } +} + +void BaseProvider::Notify_DLLInit_Pre(void *gamedll, + CreateInterfaceFn engineFactory, + CreateInterfaceFn serverFactory) +{ + server = (IServerGameDLL *)gamedll; + engine = (IVEngineServer *)((engineFactory)(INTERFACEVERSION_VENGINESERVER, NULL)); + if (!engine) + { + Error("Could not find IVEngineServer! Metamod cannot load."); + return; + } + icvar = (ICvar *)((engineFactory)(VENGINE_CVAR_INTERFACE_VERSION, NULL)); + if (!icvar) + { + Error("Could not find ICvar! Metamod cannot load."); + return; + } + + if ((gameclients = (IServerGameClients *)(serverFactory("ServerGameClients003", NULL))) + == NULL) + { + gameclients = (IServerGameClients *)(serverFactory("ServerGameClients004", NULL)); + } + + echo_msg_func = ExtractRemotePrinter(); + usermsgs_extracted = CacheUserMessages(); + + if (gameclients) + { + SH_ADD_HOOK_STATICFUNC(IServerGameClients, ClientCommand, gameclients, ClientCommand, false); + } + + ConCommandBaseMgr::OneTimeInit(&g_SMConVarAccessor); +} + +bool BaseProvider::IsRemotePrintingAvailable() +{ + return (echo_msg_func != NULL); +} + +void BaseProvider::ClientConsolePrint(edict_t *client, const char *message) +{ + engine->ClientPrintf(client, message); +} + +void BaseProvider::ServerCommand(const char *cmd) +{ + engine->ServerCommand(cmd); +} + +const char *BaseProvider::GetConVarString(ConVar *convar) +{ + return convar->GetString(); +} + +bool BaseProvider::IsConCommandBaseACommand(ConCommandBase *pCommand) +{ + return pCommand->IsCommand(); +} + + +bool BaseProvider::IsSourceEngineBuildCompatible(int build) +{ + return (build == SOURCE_ENGINE_ORIGINAL + || build == SOURCE_ENGINE_EPISODEONE); +} + +const char *BaseProvider::GetCommandLineValue(const char *key, const char *defval) +{ + if (key[0] == '-' || key[0] == '+') + { + return CommandLine()->ParmValue(key, defval); + } + else + { + const char *val; + if ((val = icvar->GetCommandLineValue(key)) == NULL) + { + return defval; + } + + return val; + } +} + +int BaseProvider::TryServerGameDLL(const char *iface) +{ + if (strncmp(iface, "ServerGameDLL", 13) != 0) + { + return 0; + } + + return atoi(&iface[13]); +} + +bool BaseProvider::LogMessage(const char *buffer) +{ + if (!engine) + { + return false; + } + + engine->LogPrint(buffer); + + return true; +} + +bool BaseProvider::GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo) +{ + SourceHook::MemFuncInfo mfi = {true, -1, 0, 0}; + + if (hook == ProvidedHook_LevelInit) + { + SourceHook::GetFuncInfo(&IServerGameDLL::LevelInit, mfi); + } + else if (hook == ProvidedHook_LevelShutdown) + { + SourceHook::GetFuncInfo(&IServerGameDLL::LevelShutdown, mfi); + } + else if (hook == ProvidedHook_GameInit) + { + SourceHook::GetFuncInfo(&IServerGameDLL::GameInit, mfi); + } + else if (hook == ProvidedHook_DLLShutdown) + { + SourceHook::GetFuncInfo(&IServerGameDLL::DLLShutdown, mfi); + } + else if (hook == ProvidedHook_DLLInit) + { + SourceHook::GetFuncInfo(&IServerGameDLL::DLLInit, mfi); + } + + *pInfo = mfi; + + return (mfi.thisptroffs >= 0); +} + +void BaseProvider::DisplayError(const char *fmt, ...) +{ + va_list ap; + char buffer[2048]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + Error(buffer); +} + +void BaseProvider::DisplayWarning(const char *fmt, ...) +{ + va_list ap; + char buffer[2048]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + Warning(buffer); +} + +IConCommandBaseAccessor *BaseProvider::GetConCommandBaseAccessor() +{ + return &g_SMConVarAccessor; +} + +bool BaseProvider::RegisterConCommandBase(ConCommandBase *pCommand) +{ + return g_SMConVarAccessor.Register(pCommand); +} + +void BaseProvider::UnregisterConCommandBase(ConCommandBase *pCommand) +{ + return g_SMConVarAccessor.Unregister(pCommand); +} + +int BaseProvider::GetUserMessageCount() +{ + if (!usermsgs_extracted) + { + return -1; + } + + return (int)usermsgs_list.size(); +} + +int BaseProvider::FindUserMessage(const char *name, int *size) +{ + for (size_t i = 0; i < usermsgs_list.size(); i++) + { + if (usermsgs_list[i].name.compare(name) == 0) + { + if (size) + { + *size = usermsgs_list[i].size; + } + return (int)i; + } + } + + return -1; +} + +const char *BaseProvider::GetUserMessage(int index, int *size) +{ + if (!usermsgs_extracted || index < 0 || index >= (int)usermsgs_list.size()) + { + return NULL; + } + + if (size) + { + *size = usermsgs_list[index].size; + } + + return usermsgs_list[index].name.c_str(); +} + +const char *BaseProvider::GetGameDescription() +{ + return server->GetGameDescription(); +} + +ConVar *BaseProvider::CreateConVar(const char *name, + const char *defval, + const char *help, + int flags) +{ + int newflags = 0; + if (flags & ConVarFlag_Notify) + { + newflags |= FCVAR_NOTIFY; + } + if (flags & ConVarFlag_Replicated) + { + newflags |= FCVAR_REPLICATED; + } + if (flags & ConVarFlag_SpOnly) + { + newflags |= FCVAR_SPONLY; + } + + return new ConVar(name, defval, newflags, help); +} + +IServerPluginCallbacks *BaseProvider::GetVSPCallbacks(const char *iface) +{ + return NULL; +} + +class GlobCommand : public IMetamodSourceCommandInfo +{ +public: + unsigned int GetArgCount() + { + return engine->Cmd_Argc() - 1; + } + + const char *GetArg(unsigned int num) + { + return engine->Cmd_Argv(num); + } + + const char *GetArgString() + { + return engine->Cmd_Args(); + } +}; + +CON_COMMAND(meta, "Metamod:Source control commands") +{ + GlobCommand cmd; + Command_Meta(&cmd); +} + +void ClientCommand(edict_t *pEdict) +{ + GlobCommand cmd; + + if (strcmp(cmd.GetArg(0), "meta") == 0) + { + Command_ClientMeta(pEdict, &cmd); + } +} + +////////////////////////////////////////////////////////////////////////// +//THERE BE HAX HERE!!!! DON'T TELL ALFRED, BUT GABE WANTED IT THAT WAY. // +// (note: you can find the offset by looking for the text // +// "Echo text to console", you'll find the callback cmd pushed on the // +// stack.) // +////////////////////////////////////////////////////////////////////////// + +#define SIGLEN 8 +#define ENGINE486_SIG "\x55\x89\xE5\x53\x83\xEC\x14\xBB" +#define ENGINE486_OFFS 40 +#define ENGINE686_SIG "\x53\x83\xEC\x08\xBB\x01\x00\x00" +#define ENGINE686_OFFS 50 +#define ENGINEAMD_SIG "\x53\x51\xBB\x01\x00\x00\x00\x51" +#define ENGINEAMD_OFFS 47 +#define ENGINEW32_SIG "\xA1\x2A\x2A\x2A\x2A\x56\xBE\x01" +#define ENGINEW32_OFFS 38 +#define IA32_CALL 0xE8 + +bool vcmp(const void *_addr1, const void *_addr2, size_t len) +{ + unsigned char *addr1 = (unsigned char *)_addr1; + unsigned char *addr2 = (unsigned char *)_addr2; + + for (size_t i=0; iGetCommands(); + unsigned char *ptr = NULL; + FnCommandCallback callback = NULL; + int offs = 0; + + while (pBase) + { + if (strcmp(pBase->GetName(), "echo") == 0) + { + callback = ((ConCommand *)pBase)->GetCallback(); + ptr = (unsigned char *)callback; +#ifdef OS_LINUX + if (vcmp(ptr, ENGINE486_SIG, SIGLEN)) + { + offs = ENGINE486_OFFS; + } + else if (vcmp(ptr, ENGINE686_SIG, SIGLEN)) + { + offs = ENGINE686_OFFS; + } + else if (vcmp(ptr, ENGINEAMD_SIG, SIGLEN)) + { + offs = ENGINEAMD_OFFS; + } +#elif defined OS_WIN32 // Only one Windows engine binary so far... + if (vcmp(ptr, ENGINEW32_SIG, SIGLEN)) + { + offs = ENGINEW32_OFFS; + } +#endif + + if (!offs || ptr[offs - 1] != IA32_CALL) + { + return NULL; + } + //get the relative offset + void *addr = *((void **)(ptr + offs)); + //add the base offset, to the ip (which is the address+offset + 4 bytes for next instruction) + return (CONPRINTF_FUNC)((unsigned long)addr + (unsigned long)(ptr + offs) + 4); + } + pBase = const_cast(pBase->GetNext()); + } + + return NULL; +} + +////////////////////////////////////////////////////////////////////// +// EVEN MORE HACKS HERE! YOU HAVE BEEN WARNED! // +// Signatures necessary in finding the pointer to the CUtlDict that // +// stores user message information. // +// IServerGameDLL::GetUserMessageInfo() normally crashes with bad // +// message indices. This is our answer to it. Yuck! <:-( // +////////////////////////////////////////////////////////////////////// +#ifdef OS_WIN32 + /* General Windows sig */ + #define MSGCLASS_SIGLEN 7 + #define MSGCLASS_SIG "\x8B\x0D\x2A\x2A\x2A\x2A\x56" + #define MSGCLASS_OFFS 2 + + /* Dystopia Wimdows hack */ + #define MSGCLASS2_SIGLEN 16 + #define MSGCLASS2_SIG "\x56\x8B\x74\x24\x2A\x85\xF6\x7C\x2A\x3B\x35\x2A\x2A\x2A\x2A\x7D" + #define MSGCLASS2_OFFS 11 + + /* Windows frame pointer sig */ + #define MSGCLASS3_SIGLEN 18 + #define MSGCLASS3_SIG "\x55\x8B\xEC\x51\x89\x2A\x2A\x8B\x2A\x2A\x50\x8B\x0D\x2A\x2A\x2A\x2A\xE8" + #define MSGCLASS3_OFFS 13 +#elif defined OS_LINUX + /* No frame pointer sig */ + #define MSGCLASS_SIGLEN 14 + #define MSGCLASS_SIG "\x53\x83\xEC\x2A\x8B\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" + #define MSGCLASS_OFFS 9 + + /* Frame pointer sig */ + #define MSGCLASS2_SIGLEN 16 + #define MSGCLASS2_SIG "\x55\x89\xE5\x53\x83\xEC\x2A\x8B\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" + #define MSGCLASS2_OFFS 11 +#endif + +struct UserMessage +{ + int size; + const char *name; +}; + +typedef CUtlDict UserMsgDict; + +/* This is the ugliest function in all of SourceMM */ +bool CacheUserMessages() +{ + /* Get address of original GetUserMessageInfo() */ + char *vfunc = (char *)SH_GET_ORIG_VFNPTR_ENTRY(server, &IServerGameDLL::GetUserMessageInfo); + + /* Oh dear, we have a relative jump on our hands + * PVK II on Windows made me do this, but I suppose it doesn't hurt to check this on Linux too... + */ + if (*vfunc == '\xE9') + { + /* Get address from displacement... + * + * Add 5 because it's relative to next instruction: + * Opcode <1 byte> + 32-bit displacement <4 bytes> + */ + vfunc += *reinterpret_cast(vfunc + 1) + 5; + } + + CUtlDict *dict = NULL; + + if (vcmp(vfunc, MSGCLASS_SIG, MSGCLASS_SIGLEN)) + { + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + } + else if (vcmp(vfunc, MSGCLASS2_SIG, MSGCLASS2_SIGLEN)) + { + #ifdef OS_WIN32 + /* If we get here, the code is possibly inlined like in Dystopia */ + + /* Get the address of the CUtlRBTree */ + char *rbtree = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); + + /* CUtlDict should be 8 bytes before the CUtlRBTree (hacktacular!) */ + dict = reinterpret_cast(rbtree - 8); + #elif defined OS_LINUX + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + #endif + #ifdef OS_WIN32 + } + else if (vcmp(vfunc, MSGCLASS3_SIG, MSGCLASS3_SIGLEN)) + { + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS3_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + #endif + } + + if (dict) + { + int msg_count = dict->Count(); + + /* Ensure that count is within bounds of an unsigned byte, because that's what engine supports */ + if (msg_count < 0 || msg_count > 255) + { + return false; + } + + UserMessage *msg; + UsrMsgInfo u_msg; + + /* Cache messages in our CUtlDict */ + for (int i = 0; i < msg_count; i++) + { + msg = dict->Element(i); + u_msg.name = msg->name; + u_msg.size = msg->size; + usermsgs_list.push_back(u_msg); + } + + return true; + } + + return false; +} + diff --git a/sourcemm/episode1/provider_ep1.h b/sourcemm/episode1/provider_ep1.h new file mode 100644 index 0000000..acd0a39 --- /dev/null +++ b/sourcemm/episode1/provider_ep1.h @@ -0,0 +1,53 @@ +#ifndef _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ +#define _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ + +#include +#include +#include +#include "ISmmAPI.h" +#include "metamod_provider.h" +#include "metamod_oslink.h" + +using namespace SourceMM; +using namespace SourceHook; + +class BaseProvider : public IMetamodSourceProvider +{ +public: + virtual bool IsSourceEngineBuildCompatible(int build); + virtual bool GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo); + virtual bool LogMessage(const char *buffer); + virtual const char *GetCommandLineValue(const char *key, const char *defval); + virtual void ConsolePrint(const char *msg); + virtual bool IsRemotePrintingAvailable(); + virtual void ClientConsolePrint(edict_t *client, const char *msg); + virtual IServerPluginCallbacks *GetVSPCallbacks(const char *iface); + virtual void DisplayError(const char *fmt, ...); + virtual void DisplayWarning(const char *fmt, ...); + virtual int TryServerGameDLL(const char *iface); + virtual void Notify_DLLInit_Pre(void *gamedll, + CreateInterfaceFn engineFactory, + CreateInterfaceFn serverFactory); + virtual void ServerCommand(const char *cmd); + virtual ConVar *CreateConVar(const char *name, + const char *defval, + const char *help, + int flags); + virtual const char *GetConVarString(ConVar *convar); + virtual const char *GetGameDescription(); + virtual IConCommandBaseAccessor *GetConCommandBaseAccessor(); + virtual bool RegisterConCommandBase(ConCommandBase *pCommand); + virtual void UnregisterConCommandBase(ConCommandBase *pCommand); + virtual bool IsConCommandBaseACommand(ConCommandBase *pCommand); + virtual int GetUserMessageCount(); + virtual int FindUserMessage(const char *name, int *size=NULL); + virtual const char *GetUserMessage(int index, int *size=NULL); +}; + +extern IVEngineServer *engine; +extern IServerGameDLL *server; +extern IServerGameClients *gameclients; +extern ICvar *icvar; + +#endif //_INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ + diff --git a/sourcemm/metamod.cpp b/sourcemm/metamod.cpp index bd825bf..d55b72a 100644 --- a/sourcemm/metamod.cpp +++ b/sourcemm/metamod.cpp @@ -33,7 +33,6 @@ using namespace SourceHook; * @brief Implementation of main SourceMM GameDLL functionality * @file sourcemm.cpp */ -IMetamodSourceProvider *provider = NULL; SH_DECL_MANUALHOOK4(SGD_DLLInit, 0, 0, 0, bool, CreateInterfaceFn, CreateInterfaceFn, CreateInterfaceFn, CGlobalVars *); SH_DECL_MANUALHOOK0(SGD_GameInit, 0, 0, 0, bool); @@ -665,7 +664,7 @@ bool Handler_DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsF g_GameDllPatch = SH_GET_CALLCLASS(server); - provider->Notify_DLLInit_Pre(); + provider->Notify_DLLInit_Pre(server, engineFactory, gamedll_info.factory); metamod_version = provider->CreateConVar("metamod_version", SOURCEMM_VERSION, @@ -681,9 +680,6 @@ bool Handler_DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsF "Metamod:Source Plugins File", ConVarFlag_SpOnly); - provider->CreateCommand("meta", Command_Meta, "Metamod:Source Menu"); - provider->SetClientCommandHandler(Command_ClientMeta); - const char *pluginFile = provider->GetCommandLineValue("mm_pluginsfile", NULL); if (!pluginFile) { @@ -1151,11 +1147,37 @@ void MetamodSource::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCo { if (provider->IsConCommandBaseACommand(pCommand)) { - g_PluginMngr.AddPluginCmd(plugin, pCommand); + g_PluginMngr.RemovePluginCmd(plugin, pCommand); } else { - g_PluginMngr.AddPluginCvar(plugin, pCommand); + g_PluginMngr.RemovePluginCvar(plugin, pCommand); + } + + PluginIter iter; + CPluginManager::CPlugin *pPlugin; + List::iterator event; + IMetamodListener *pML; + CPluginManager::CPlugin *pOrig = g_PluginMngr.FindByAPI(plugin); + for (iter=g_PluginMngr._begin(); iter!=g_PluginMngr._end(); iter++) + { + pPlugin = (*iter); + if (pPlugin->m_Status < Pl_Paused) + { + continue; + } + /* Only valid for plugins >= 12 (v1:6, SourceMM 1.5) */ + if (pPlugin->m_API->GetApiVersion() < 12) + { + continue; + } + for (event=pPlugin->m_Events.begin(); + event!=pPlugin->m_Events.end(); + event++) + { + pML = (*event); + pML->OnUnlinkConCommandBase(pOrig ? pOrig->m_Id : 0, pCommand); + } } return provider->UnregisterConCommandBase(pCommand); diff --git a/sourcemm/metamod.h b/sourcemm/metamod.h index 5f21669..57c6741 100644 --- a/sourcemm/metamod.h +++ b/sourcemm/metamod.h @@ -79,10 +79,7 @@ public: void LogMessage(const char *msg, ...); int LoadPluginsFromFile(const char *_file); -extern PluginId g_PLID; -extern SourceHook::ISourceHook *g_SHPtr; extern SourceHook::CSourceHookImpl g_SourceHook; extern MetamodSource g_Metamod; -extern IMetamodSourceProvider *provider; #endif //_INCLUDE_SOURCEMM_H diff --git a/sourcemm/metamod_console.cpp b/sourcemm/metamod_console.cpp index 1621e62..18183d4 100644 --- a/sourcemm/metamod_console.cpp +++ b/sourcemm/metamod_console.cpp @@ -33,7 +33,7 @@ using namespace SourceHook; #define CONMSG g_Metamod.ConPrintf #define CLIENT_CONMSG g_Metamod.ClientConPrintf -bool Command_Meta(edict_t *pEdict, IMetamodSourceCommandInfo *info) +bool Command_Meta(IMetamodSourceCommandInfo *info) { unsigned int args = info->GetArgCount(); diff --git a/sourcemm/metamod_console.h b/sourcemm/metamod_console.h index 4410bfd..b0d15ba 100644 --- a/sourcemm/metamod_console.h +++ b/sourcemm/metamod_console.h @@ -13,7 +13,7 @@ #include "metamod_provider.h" -bool Command_Meta(edict_t *pEdict, IMetamodSourceCommandInfo *info); +bool Command_Meta(IMetamodSourceCommandInfo *info); bool Command_ClientMeta(edict_t *client, IMetamodSourceCommandInfo *info); #endif //_INCLUDE_CONCOMMANDS_H diff --git a/sourcemm/oslink.cpp b/sourcemm/metamod_oslink.cpp similarity index 98% rename from sourcemm/oslink.cpp rename to sourcemm/metamod_oslink.cpp index d5a5bfa..9a8ca10 100644 --- a/sourcemm/oslink.cpp +++ b/sourcemm/metamod_oslink.cpp @@ -13,7 +13,7 @@ * @file oslink.cpp */ -#include "oslink.h" +#include "metamod_oslink.h" #include #ifdef __linux #include diff --git a/sourcemm/oslink.h b/sourcemm/metamod_oslink.h similarity index 100% rename from sourcemm/oslink.h rename to sourcemm/metamod_oslink.h diff --git a/sourcemm/metamod_plugins.h b/sourcemm/metamod_plugins.h index aaec549..dbc038d 100644 --- a/sourcemm/metamod_plugins.h +++ b/sourcemm/metamod_plugins.h @@ -21,7 +21,7 @@ #include #include #include "IPluginManager.h" -#include "oslink.h" +#include "metamod_oslink.h" /** * History of plugin versions: (M=min, C=current) diff --git a/sourcemm/metamod_provider.h b/sourcemm/metamod_provider.h index b9c93de..b2c5347 100644 --- a/sourcemm/metamod_provider.h +++ b/sourcemm/metamod_provider.h @@ -1,10 +1,6 @@ #ifndef _INCLUDE_METAMOD_SOURCE_SUPPORT_H_ #define _INCLUDE_METAMOD_SOURCE_SUPPORT_H_ -#include -#include -#include - namespace SourceMM { enum @@ -55,8 +51,6 @@ namespace SourceMM virtual const char *GetArgString() =0; }; - typedef bool (*METAMOD_COMMAND)(edict_t *pEdict, IMetamodSourceCommandInfo *info); - class IMetamodSourceProvider { public: @@ -165,7 +159,9 @@ namespace SourceMM /** * @brief Notifies the provider that the DLLInit pre-hook is almost done. */ - virtual void Notify_DLLInit_Pre() =0; + virtual void Notify_DLLInit_Pre(void *gamedll, + CreateInterfaceFn engineFactory, + CreateInterfaceFn serverFactory) =0; /** * @brief Wrapper around IVEngineServer::ServerCommand() @@ -196,24 +192,6 @@ namespace SourceMM */ virtual const char *GetConVarString(ConVar *convar) =0; - /** - * @brief Creates a console command. - * - * @param name Command name. - * @param callback Callback pointer. - * @param help Help text. - */ - virtual void CreateCommand(const char *name, - METAMOD_COMMAND callback, - const char *help) =0; - - /** - * @brief Sets the ClientCommand handler. - * - * @param callback Callback pointer. - */ - virtual void SetClientCommandHandler(METAMOD_COMMAND callback) =0; - /** * @brief Retrieves the game description. * @@ -279,5 +257,9 @@ namespace SourceMM }; }; +extern PluginId g_PLID; +extern SourceHook::ISourceHook *g_SHPtr; +extern SourceMM::IMetamodSourceProvider *provider; + #endif //_INCLUDE_METAMOD_SOURCE_SUPPORT_H_ diff --git a/sourcemm/metamod_util.cpp b/sourcemm/metamod_util.cpp index f9ca9ad..48f2d3d 100644 --- a/sourcemm/metamod_util.cpp +++ b/sourcemm/metamod_util.cpp @@ -12,7 +12,7 @@ #include #include #include "metamod_util.h" -#include "oslink.h" +#include "metamod_oslink.h" /** * @brief Utility functions diff --git a/sourcemm/msvc8/sourcemm.sln b/sourcemm/msvc8/sourcemm.sln deleted file mode 100644 index b338452..0000000 --- a/sourcemm/msvc8/sourcemm.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.ActiveCfg = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.Build.0 = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.ActiveCfg = Release|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/sourcemm/msvc8/sourcemm.vcproj b/sourcemm/msvc8/sourcemm.vcproj deleted file mode 100644 index 750ab85..0000000 --- a/sourcemm/msvc8/sourcemm.vcproj +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From c9b52f2cf0489be8d612ab0fdc4e9e2aeebbb611 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 28 Sep 2007 21:32:02 +0000 Subject: [PATCH 14/25] added project files --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40435 --- sourcemm/episode1/msvc8/sourcemm.sln | 20 ++ sourcemm/episode1/msvc8/sourcemm.vcproj | 329 ++++++++++++++++++++++++ 2 files changed, 349 insertions(+) create mode 100644 sourcemm/episode1/msvc8/sourcemm.sln create mode 100644 sourcemm/episode1/msvc8/sourcemm.vcproj diff --git a/sourcemm/episode1/msvc8/sourcemm.sln b/sourcemm/episode1/msvc8/sourcemm.sln new file mode 100644 index 0000000..b338452 --- /dev/null +++ b/sourcemm/episode1/msvc8/sourcemm.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.ActiveCfg = Debug|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.Build.0 = Debug|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.ActiveCfg = Release|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/sourcemm/episode1/msvc8/sourcemm.vcproj b/sourcemm/episode1/msvc8/sourcemm.vcproj new file mode 100644 index 0000000..ae17204 --- /dev/null +++ b/sourcemm/episode1/msvc8/sourcemm.vcproj @@ -0,0 +1,329 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 98aeb7b419187bd06f93a2bb4f97c0346beda2d3 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 28 Sep 2007 21:40:58 +0000 Subject: [PATCH 15/25] removed old providers location replaced sourcehook with v4.5 --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40436 --- providers/Makefile.ep1 | 70 - providers/episode1/console.cpp | 111 - providers/episode1/console.h | 24 - providers/episode1/convar_smm.h | 523 ---- providers/episode1/provider_ep1.cpp | 502 ---- providers/episode1/provider_ep1.h | 52 - providers/provider_util.cpp | 15 - providers/provider_util.h | 11 - sourcehook/generate/shworker.bin | Bin 54998 -> 59291 bytes sourcehook/generate/sourcehook.h | 3979 +++++++++++++++------------ sourcehook/generate/sourcehook.hxx | 493 ++-- sourcehook/sourcehook.cpp | 483 +++- sourcehook/sourcehook.h | 3979 +++++++++++++++------------ sourcehook/sourcehook_impl.h | 171 +- sourcehook/test/main.cpp | 1 + sourcehook/test/msvc7/test.vcproj | 15 + sourcehook/test/test1.cpp | 164 +- sourcehook/test/test2.cpp | 19 +- sourcehook/test/test3.cpp | 72 +- sourcehook/test/test4.cpp | 49 +- sourcehook/test/testbail.cpp | 6 +- sourcehook/test/testbail2.cpp | 4 +- sourcehook/test/testmanual.cpp | 136 +- sourcehook/test/testmulti.cpp | 6 +- sourcehook/test/testrecall.cpp | 47 +- sourcehook/test/testreentr.cpp | 98 +- sourcehook/test/testref.cpp | 23 +- sourcehook/test/testrefret.cpp | 22 +- 28 files changed, 5621 insertions(+), 5454 deletions(-) delete mode 100644 providers/Makefile.ep1 delete mode 100644 providers/episode1/console.cpp delete mode 100644 providers/episode1/console.h delete mode 100644 providers/episode1/convar_smm.h delete mode 100644 providers/episode1/provider_ep1.cpp delete mode 100644 providers/episode1/provider_ep1.h delete mode 100644 providers/provider_util.cpp delete mode 100644 providers/provider_util.h diff --git a/providers/Makefile.ep1 b/providers/Makefile.ep1 deleted file mode 100644 index bc853c9..0000000 --- a/providers/Makefile.ep1 +++ /dev/null @@ -1,70 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson - -HL2SDK = ../../../hl2sdk -SMM_ROOT = .. -SRCDS = ~/srcds - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O2 -funroll-loops -s -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = provider_ep1_i486.so - -HL2PUB = $(HL2SDK)/public -HL2LIB = $(HL2SDK)/linux_sdk - -OBJECTS = provider_util.cpp episode1/provider_ep1.cpp episode1/console.cpp - -LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc - -INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ - -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook \ - -I$(SMM_ROOT)/sourcemm - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - mkdir -p $(BIN_DIR)/episode1 - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - $(MAKE) -f Makefile.ep1 provider - rm -rf $(BINARY) - -provider: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) -f Makefile.ep1 all DEBUG=true - -default: all - -clean: - rm -rf Release/episode1/*.o - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/episode1/*.o - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/providers/episode1/console.cpp b/providers/episode1/console.cpp deleted file mode 100644 index e6d7c83..0000000 --- a/providers/episode1/console.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "console.h" -#include "provider_ep1.h" - -using namespace SourceHook; - -SMConVarAccessor g_SMConVarAccessor; - -class CAlwaysRegisterableCommand : public ConCommandBase -{ -public: - CAlwaysRegisterableCommand() - { - Create("metamod_eternal", NULL, FCVAR_UNREGISTERED|FCVAR_GAMEDLL); - } - bool IsRegistered( void ) const - { - return false; - } - void BringToFront() - { - // First, let's try to find us! - ConCommandBase *pPtr = icvar->GetCommands(); - - if (pPtr == this) - { - // We are already at the beginning; Nothing to do - return; - } - - while (pPtr) - { - if (pPtr == this) - { - break; - } - ConCommandBase *pPrev = NULL; - while (pPtr) - { - if (pPtr == this) - { - break; - } - pPrev = pPtr; - pPtr = const_cast(pPtr->GetNext()); - } - if (pPrev && pPtr == this) - { - pPrev->SetNext(m_pNext); // Remove us from the list - } - // Now, register us - SetNext(NULL); - icvar->RegisterConCommandBase(this); - } - } -} s_EternalCommand; - -bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) -{ - m_RegisteredCommands.push_back(pCommand); - pCommand->SetNext(NULL); - icvar->RegisterConCommandBase(pCommand); - - return true; -} - -bool SMConVarAccessor::Register(ConCommandBase *pCommand) -{ - pCommand->SetNext(NULL); - icvar->RegisterConCommandBase(pCommand); - - return true; -} - -void SMConVarAccessor::MarkCommandsAsGameDLL() -{ - for (List::iterator iter = m_RegisteredCommands.begin(); - iter != m_RegisteredCommands.end(); ++iter) - { - (*iter)->AddFlags(FCVAR_GAMEDLL); - } -} - -void SMConVarAccessor::Unregister(ConCommandBase *pCommand) -{ - ConCommandBase *ptr = icvar->GetCommands(); - - if (ptr == pCommand) - { - s_EternalCommand.BringToFront(); - s_EternalCommand.SetNext(const_cast(pCommand->GetNext())); - } - else - { - /* Find us and unregister us */ - ConCommandBase *pPrev = NULL; - while (ptr) - { - if (ptr == pCommand) - { - break; - } - pPrev = ptr; - ptr = const_cast(ptr->GetNext()); - } - if (pPrev && ptr == pCommand) - { - pPrev->SetNext(const_cast(pCommand->GetNext())); - } - } -} - diff --git a/providers/episode1/console.h b/providers/episode1/console.h deleted file mode 100644 index 4f1b5b8..0000000 --- a/providers/episode1/console.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _INCLUDE_CONSOLE_MMS_H_ -#define _INCLUDE_CONSOLE_MMS_H_ - -#include "convar_smm.h" -#include -#include -#include - -class SMConVarAccessor : public IConCommandBaseAccessor -{ -public: - bool RegisterConCommandBase(ConCommandBase *pCommand); - bool Register(ConCommandBase *pCommand); - void MarkCommandsAsGameDLL(); - void Unregister(ConCommandBase *pCommand); - void UnregisterGameDLLCommands(); -private: - SourceHook::List m_RegisteredCommands; -}; - -extern SMConVarAccessor g_SMConVarAccessor; - -#endif //_INCLUDE_CONSOLE_MMS_H_ - diff --git a/providers/episode1/convar_smm.h b/providers/episode1/convar_smm.h deleted file mode 100644 index 8e5dd82..0000000 --- a/providers/episode1/convar_smm.h +++ /dev/null @@ -1,523 +0,0 @@ -//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// -// -// Purpose: -// -// $Workfile: $ -// $Date: 2007-02-08 04:19:19 -0500 (Thu, 08 Feb 2007) $ -// -//----------------------------------------------------------------------------- -// $NoKeywords: $ -//=============================================================================// - -#ifndef CONVAR_H -#define CONVAR_H -#if _WIN32 -#pragma once -#endif - -#include "tier0/dbg.h" - -#ifdef _WIN32 -#define FORCEINLINE_CVAR FORCEINLINE -#elif _LINUX -#define FORCEINLINE_CVAR __inline__ FORCEINLINE -#else -#error "implement me" -#endif - -// The default, no flags at all -#define FCVAR_NONE 0 - -// Command to ConVars and ConCommands -// ConVar Systems -#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. -#define FCVAR_LAUNCHER (1<<1) // defined by launcher -#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL -#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL -#define FCVAR_MATERIAL_SYSTEM (1<<4) // Defined by the material system. -#define FCVAR_DATACACHE (1<<19) // Defined by the datacache system. -#define FCVAR_STUDIORENDER (1<<15) // Defined by the studiorender system. -#define FCVAR_FILESYSTEM (1<<21) // Defined by the file system. -#define FCVAR_PLUGIN (1<<18) // Defined by a 3rd party plugin. -#define FCVAR_TOOLSYSTEM (1<<20) // Defined by an IToolSystem library -#define FCVAR_SOUNDSYSTEM (1<<23) // Defined by the soundsystem library -#define FCVAR_INPUTSYSTEM (1<<25) // Defined by the inputsystem dll -#define FCVAR_NETWORKSYSTEM (1<<26) // Defined by the network system -// NOTE!! if you add a cvar system, add it here too!!!! -// the engine lacks a cvar flag, but needs it for xbox -// an engine cvar is thus a cvar not marked with any other system -#define FCVAR_NON_ENGINE ((FCVAR_LAUNCHER|FCVAR_GAMEDLL|FCVAR_CLIENTDLL|FCVAR_MATERIAL_SYSTEM|FCVAR_DATACACHE|FCVAR_STUDIORENDER|FCVAR_FILESYSTEM|FCVAR_PLUGIN|FCVAR_TOOLSYSTEM|FCVAR_SOUNDSYSTEM|FCVAR_INPUTSYSTEM|FCVAR_NETWORKSYSTEM)) - -// ConVar only -#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value -#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. -#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc -#define FCVAR_NOTIFY (1<<8) // notifies players when changed -#define FCVAR_USERINFO (1<<9) // changes the client's info string -#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats - -#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). -#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log -#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar - -// It's a ConVar that's shared between the client and the server. -// At signon, the values of all such ConVars are sent from the server to the client (skipped for local -// client, of course ) -// If a change is requested it must come from the console (i.e., no remote client changes) -// If a value is changed while a server is active, it's replicated to all connected clients -#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time -#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file -#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles - -#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server - -#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox - - -// #define FCVAR_AVAILABLE (1<<27) -// #define FCVAR_AVAILABLE (1<<28) -// #define FCVAR_AVAILABLE (1<<29) -// #define FCVAR_AVAILABLE (1<<30) -// #define FCVAR_AVAILABLE (1<<31) - - -class ConVar; -class ConCommand; -class ConCommandBase; - -// Any executable that wants to use ConVars need to implement one of -// these to hook up access to console variables. -class IConCommandBaseAccessor -{ -public: - // Flags is a combination of FCVAR flags in cvar.h. - // hOut is filled in with a handle to the variable. - virtual bool RegisterConCommandBase( ConCommandBase *pVar )=0; -}; - - -// You don't have to instantiate one of these, just call its -// OneTimeInit function when your executable is initializing. -class ConCommandBaseMgr -{ -public: - // Call this ONCE when the executable starts up. - static void OneTimeInit( IConCommandBaseAccessor *pAccessor ); -#ifdef _XBOX - static bool Fixup( ConCommandBase* pConCommandBase ); -#ifndef _RETAIL - static void PublishCommands( bool bForce ); -#endif -#endif -}; - -// Called when a ConVar changes value -typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString ); - -// Called when a ConCommand needs to execute -typedef void ( *FnCommandCallback )( void ); - -#define COMMAND_COMPLETION_MAXITEMS 64 -#define COMMAND_COMPLETION_ITEM_LENGTH 64 - -// Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings -typedef int ( *FnCommandCompletionCallback )( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); - -//----------------------------------------------------------------------------- -// Purpose: The base console invoked command/cvar interface -//----------------------------------------------------------------------------- -class ConCommandBase -{ - friend class ConCommandBaseMgr; - friend class CCvar; - friend class ConVar; - friend class ConCommand; - -public: - ConCommandBase( void ); - ConCommandBase( char const *pName, char const *pHelpString = 0, - int flags = 0 ); - - virtual ~ConCommandBase( void ); - - virtual bool IsCommand( void ) const; - - // Check flag - virtual bool IsBitSet( int flag ) const; - // Set flag - virtual void AddFlags( int flags ); - - // Return name of cvar - virtual char const *GetName( void ) const; - - // Return help text for cvar - virtual char const *GetHelpText( void ) const; - - // Deal with next pointer - const ConCommandBase *GetNext( void ) const; - void SetNext( ConCommandBase *next ); - - virtual bool IsRegistered( void ) const; - - // Global methods - static ConCommandBase const *GetCommands( void ); - static void AddToList( ConCommandBase *var ); - static void RemoveFlaggedCommands( int flag ); - static void RevertFlaggedCvars( int flag ); - static ConCommandBase const *FindCommand( char const *name ); - -protected: - virtual void Create( char const *pName, char const *pHelpString = 0, - int flags = 0 ); - - // Used internally by OneTimeInit to initialize. - virtual void Init(); - - // Internal copy routine ( uses new operator from correct module ) - char *CopyString( char const *from ); - - // Next ConVar in chain - ConCommandBase *m_pNext; - -private: - // Has the cvar been added to the global list? - bool m_bRegistered; - - // Static data - char const *m_pszName; - char const *m_pszHelpString; - - // ConVar flags - int m_nFlags; - -protected: - - // ConVars add themselves to this list for the executable. Then ConVarMgr::Init() runs through - // all the console variables and registers them. - static ConCommandBase *s_pConCommandBases; - - // ConVars in this executable use this 'global' to access values. - static IConCommandBaseAccessor *s_pAccessor; -}; - -//----------------------------------------------------------------------------- -// Purpose: The console invoked command -//----------------------------------------------------------------------------- -class ConCommand : public ConCommandBase -{ -friend class ConCommandBaseMgr; -friend class CCvar; -#ifdef _STATIC_LINKED -friend class G_ConCommand; -friend class C_ConCommand; -friend class M_ConCommand; -friend class S_ConCommand; -friend class D_ConCommand; -#endif - -public: - typedef ConCommandBase BaseClass; - - ConCommand( void ); - ConCommand( char const *pName, FnCommandCallback callback, - char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); - - virtual ~ConCommand( void ); - - virtual bool IsCommand( void ) const; - - virtual int AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); - - virtual bool CanAutoComplete( void ); - - // Invoke the function - virtual void Dispatch( void ); -private: - virtual void Create( char const *pName, FnCommandCallback callback, - char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); - - // Call this function when executing the command - FnCommandCallback m_fnCommandCallback; - - FnCommandCompletionCallback m_fnCompletionCallback; - bool m_bHasCompletionCallback; -public: - FnCommandCallback GetCallback() { return m_fnCommandCallback; } -}; - -//----------------------------------------------------------------------------- -// Purpose: A console variable -//----------------------------------------------------------------------------- -class ConVar : public ConCommandBase -{ -friend class ConCommandBaseMgr; -friend class CCvar; -friend class CDefaultCvar; -#ifdef _STATIC_LINKED -friend class G_ConVar; -friend class C_ConVar; -friend class M_ConVar; -friend class S_ConVar; -friend class D_ConVar; -#endif - -public: - typedef ConCommandBase BaseClass; - - ConVar( char const *pName, char const *pDefaultValue, int flags = 0); - - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, FnChangeCallback callback ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, - FnChangeCallback callback ); - - virtual ~ConVar( void ); - - virtual bool IsBitSet( int flag ) const; - virtual char const* GetHelpText( void ) const; - virtual bool IsRegistered( void ) const; - virtual char const *GetName( void ) const; - virtual void AddFlags( int flags ); - virtual bool IsCommand( void ) const; - - // Install a change callback (there shouldn't already be one....) - void InstallChangeCallback( FnChangeCallback callback ); - - // Retrieve value - FORCEINLINE_CVAR float GetFloat( void ) const; - FORCEINLINE_CVAR int GetInt( void ) const; - FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } - FORCEINLINE_CVAR char const *GetString( void ) const; - - // Any function that allocates/frees memory needs to be virtual or else you'll have crashes - // from alloc/free across dll/exe boundaries. - - // These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue). - virtual void SetValue( char const *value ); - virtual void SetValue( float value ); - virtual void SetValue( int value ); - - // Reset to default value - void Revert( void ); - - // True if it has a min/max setting - bool GetMin( float& minVal ) const; - bool GetMax( float& maxVal ) const; - char const *GetDefault( void ) const; - - static void RevertAll( void ); -private: - // Called by CCvar when the value of a var is changing. - virtual void InternalSetValue(char const *value); - // For CVARs marked FCVAR_NEVER_AS_STRING - virtual void InternalSetFloatValue( float fNewValue ); - virtual void InternalSetIntValue( int nValue ); - - virtual bool ClampValue( float& value ); - virtual void ChangeStringValue( char const *tempVal ); - - virtual void Create( char const *pName, char const *pDefaultValue, int flags = 0, - char const *pHelpString = 0, bool bMin = false, float fMin = 0.0, - bool bMax = false, float fMax = false, FnChangeCallback callback = 0 ); - - // Used internally by OneTimeInit to initialize. - virtual void Init(); - -private: - - // This either points to "this" or it points to the original declaration of a ConVar. - // This allows ConVars to exist in separate modules, and they all use the first one to be declared. - // m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar). - ConVar *m_pParent; - - // Static data - char const *m_pszDefaultValue; - - // Value - // Dynamically allocated - char *m_pszString; - int m_StringLength; - - // Values - float m_fValue; - int m_nValue; - - // Min/Max values - bool m_bHasMin; - float m_fMinVal; - bool m_bHasMax; - float m_fMaxVal; - - // Call this function when ConVar changes - FnChangeCallback m_fnChangeCallback; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as a float -// Output : float -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR float ConVar::GetFloat( void ) const -{ - return m_pParent->m_fValue; -} - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as an int -// Output : int -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR int ConVar::GetInt( void ) const -{ - return m_pParent->m_nValue; -} - - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. -// Output : char const * -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR char const *ConVar::GetString( void ) const -{ - if ( m_nFlags & FCVAR_NEVER_AS_STRING ) - { - return "FCVAR_NEVER_AS_STRING"; - } - - return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : ""; -} - - -#ifdef _STATIC_LINKED -// identifies subsystem via piggybacking constructors with flags -class G_ConCommand : public ConCommand -{ -public: - G_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_GAMEDLL, completionFunc) {} -}; - -class C_ConCommand : public ConCommand -{ -public: - C_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_CLIENTDLL, completionFunc) {} -}; - -class M_ConCommand : public ConCommand -{ -public: - M_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_MATERIAL_SYSTEM, completionFunc) {} -}; - -class S_ConCommand : public ConCommand -{ -public: - S_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_STUDIORENDER, completionFunc) {} -}; - -class D_ConCommand : public ConCommand -{ -public: - D_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_DATACACHE, completionFunc) {} -}; - -typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString ); -typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString ); -typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString ); -typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString ); -typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString ); - -class G_ConVar : public ConVar -{ -public: - G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, (FnChangeCallback)callback ) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class C_ConVar : public ConVar -{ -public: - C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, (FnChangeCallback)callback ) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class M_ConVar : public ConVar -{ -public: - M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, (FnChangeCallback)callback ) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class S_ConVar : public ConVar -{ -public: - S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, (FnChangeCallback)callback ) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, S_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class D_ConVar : public ConVar -{ -public: - D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, (FnChangeCallback)callback ) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, D_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -// redirect these declarations to their specific subsystem -#ifdef GAME_DLL -#define ConCommand G_ConCommand -#define ConVar G_ConVar -#endif -#ifdef CLIENT_DLL -#define ConCommand C_ConCommand -#define ConVar C_ConVar -#endif -#ifdef MATERIALSYSTEM_DLL -#define ConCommand M_ConCommand -#define ConVar M_ConVar -#endif -#ifdef STUDIORENDER_DLL -#define ConCommand S_ConCommand -#define ConVar S_ConVar -#endif -#ifdef DATACACHE_DLL -#define ConCommand D_ConCommand -#define ConVar D_ConVar -#endif -#endif // _STATIC_LINKED - -//----------------------------------------------------------------------------- -// Purpose: Utility to quicky generate a simple console command -//----------------------------------------------------------------------------- -#define CON_COMMAND( name, description ) \ - static void name(); \ - static ConCommand name##_command( #name, name, description ); \ - static void name() - -//----------------------------------------------------------------------------- -// Purpose: Utility to quicky generate a simple console command -//----------------------------------------------------------------------------- -#define CON_COMMAND_F( name, description, flags ) \ - static void name(); \ - static ConCommand name##_command( #name, name, description, flags ); \ - static void name() - - -#endif // CONVAR_H diff --git a/providers/episode1/provider_ep1.cpp b/providers/episode1/provider_ep1.cpp deleted file mode 100644 index 55c6530..0000000 --- a/providers/episode1/provider_ep1.cpp +++ /dev/null @@ -1,502 +0,0 @@ -#include "convar_smm.h" -#include -#include -#include -#include -#include -#include -#include "provider_util.h" -#include "provider_ep1.h" -#include "console.h" - -/* Types */ -typedef void (*CONPRINTF_FUNC)(const char *, ...); -struct UsrMsgInfo -{ - int size; - String name; -}; -/* Imports */ -#undef CommandLine -DLL_IMPORT ICommandLine *CommandLine(); -/* Functions */ -CONPRINTF_FUNC ExtractRemotePrinter(); -bool CacheUserMessages(); -void ClientCommand(edict_t *pEdict); -/* Variables */ -bool usermsgs_extracted = false; -CVector usermsgs_list; -CONPRINTF_FUNC echo_msg_func = NULL; -METAMOD_COMMAND client_cmd_handler = NULL; -ICvar *icvar = NULL; -ISourceHook *g_SHPtr = NULL; -IVEngineServer *engine = NULL; -IServerGameDLL *server = NULL; -IServerGameClients *gameclients = NULL; -unsigned int g_PLID; - -SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); - -void BaseProvider::ConsolePrint(const char *str) -{ - if (echo_msg_func != NULL) - { - echo_msg_func("%s", str); - } - else - { - Msg("%s", str); - } -} - -void BaseProvider::Notify_DLLInit_Pre() -{ - echo_msg_func = ExtractRemotePrinter(); - usermsgs_extracted = CacheUserMessages(); - - SH_ADD_HOOK_STATICFUNC(IServerGameClients, ClientCommand, gameclients, ClientCommand, false); -} - -bool BaseProvider::IsRemotePrintingAvailable() -{ - return (echo_msg_func != NULL); -} - -void BaseProvider::ClientConsolePrint(edict_t *client, const char *message) -{ - engine->ClientPrintf(client, message); -} - -void BaseProvider::ServerCommand(const char *cmd) -{ - engine->ServerCommand(cmd); -} - -const char *BaseProvider::GetConVarString(ConVar *convar) -{ - return convar->GetString(); -} - -bool BaseProvider::IsConCommandBaseACommand(ConCommandBase *pCommand) -{ - return pCommand->IsCommand(); -} - - -bool BaseProvider::IsSourceEngineBuildCompatible(int build) -{ - return (build == SOURCE_ENGINE_ORIGINAL - || build == SOURCE_ENGINE_EPISODEONE); -} - -const char *BaseProvider::GetCommandLineValue(const char *key, const char *defval) -{ - if (key[0] == '-' || key[0] == '+') - { - return CommandLine()->ParmValue(key, defval); - } - else - { - const char *val; - if ((val = icvar->GetCommandLineValue(key)) == NULL) - { - return defval; - } - - return val; - } -} - -int BaseProvider::TryServerGameDLL(const char *iface) -{ - if (strncmp(iface, "ServerGameDLL", 13) != 0) - { - return 0; - } - - return atoi(&iface[13]); -} - -bool BaseProvider::LogMessage(const char *buffer) -{ - if (!engine) - { - return false; - } - - engine->LogPrint(buffer); - - return true; -} - -bool BaseProvider::GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo) -{ - SourceHook::MemFuncInfo mfi = {true, -1, 0, 0}; - - if (hook == ProvidedHook_LevelInit) - { - SourceHook::GetFuncInfo(&IServerGameDLL::LevelInit, mfi); - } - else if (hook == ProvidedHook_LevelShutdown) - { - SourceHook::GetFuncInfo(&IServerGameDLL::LevelShutdown, mfi); - } - else if (hook == ProvidedHook_GameInit) - { - SourceHook::GetFuncInfo(&IServerGameDLL::GameInit, mfi); - } - else if (hook == ProvidedHook_DLLShutdown) - { - SourceHook::GetFuncInfo(&IServerGameDLL::DLLShutdown, mfi); - } - else if (hook == ProvidedHook_DLLInit) - { - SourceHook::GetFuncInfo(&IServerGameDLL::DLLInit, mfi); - } - - *pInfo = mfi; - - return (mfi.thisptroffs >= 0); -} - -void BaseProvider::DisplayError(const char *fmt, ...) -{ - va_list ap; - char buffer[2048]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - Error(buffer); -} - -void BaseProvider::DisplayWarning(const char *fmt, ...) -{ - va_list ap; - char buffer[2048]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - Warning(buffer); -} - -IConCommandBaseAccessor *BaseProvider::GetConCommandBaseAccessor() -{ - return &g_SMConVarAccessor; -} - -bool BaseProvider::RegisterConCommandBase(ConCommandBase *pCommand) -{ - return g_SMConVarAccessor.Register(pCommand); -} - -void BaseProvider::UnregisterConCommandBase(ConCommandBase *pCommand) -{ - return g_SMConVarAccessor.Unregister(pCommand); -} - -int BaseProvider::GetUserMessageCount() -{ - if (!usermsgs_extracted) - { - return -1; - } - - return (int)usermsgs_list.size(); -} - -int BaseProvider::FindUserMessage(const char *name, int *size) -{ - for (size_t i = 0; i < usermsgs_list.size(); i++) - { - if (usermsgs_list[i].name.compare(name) == 0) - { - if (size) - { - *size = usermsgs_list[i].size; - } - return (int)i; - } - } - - return -1; -} - -const char *BaseProvider::GetUserMessage(int index, int *size) -{ - if (!usermsgs_extracted || index < 0 || index >= (int)usermsgs_list.size()) - { - return NULL; - } - - if (size) - { - *size = usermsgs_list[index].size; - } - - return usermsgs_list[index].name.c_str(); -} - -const char *BaseProvider::GetGameDescription() -{ - return server->GetGameDescription(); -} - -void BaseProvider::SetClientCommandHandler(METAMOD_COMMAND callback) -{ - client_cmd_handler = callback; -} - -class GlobCommand : public IMetamodSourceCommandInfo -{ -public: - unsigned int GetArgCount() - { - return engine->Cmd_Argc() - 1; - } - - const char *GetArg(unsigned int num) - { - return engine->Cmd_Argv(num); - } - - const char *GetArgString() - { - return engine->Cmd_Args(); - } -}; - -void ClientCommand(edict_t *pEdict) -{ - if (client_cmd_handler) - { - GlobCommand cmd; - bool result; - - if ((result = client_cmd_handler(pEdict, &cmd)) == true) - { - RETURN_META(MRES_SUPERCEDE); - } - } -} - -////////////////////////////////////////////////////////////////////////// -//THERE BE HAX HERE!!!! DON'T TELL ALFRED, BUT GABE WANTED IT THAT WAY. // -// (note: you can find the offset by looking for the text // -// "Echo text to console", you'll find the callback cmd pushed on the // -// stack.) // -////////////////////////////////////////////////////////////////////////// - -#define SIGLEN 8 -#define ENGINE486_SIG "\x55\x89\xE5\x53\x83\xEC\x14\xBB" -#define ENGINE486_OFFS 40 -#define ENGINE686_SIG "\x53\x83\xEC\x08\xBB\x01\x00\x00" -#define ENGINE686_OFFS 50 -#define ENGINEAMD_SIG "\x53\x51\xBB\x01\x00\x00\x00\x51" -#define ENGINEAMD_OFFS 47 -#define ENGINEW32_SIG "\xA1\x2A\x2A\x2A\x2A\x56\xBE\x01" -#define ENGINEW32_OFFS 38 -#define IA32_CALL 0xE8 - -bool vcmp(const void *_addr1, const void *_addr2, size_t len) -{ - unsigned char *addr1 = (unsigned char *)_addr1; - unsigned char *addr2 = (unsigned char *)_addr2; - - for (size_t i=0; iGetCommands(); - unsigned char *ptr = NULL; - FnCommandCallback callback = NULL; - int offs = 0; - - while (pBase) - { - if (strcmp(pBase->GetName(), "echo") == 0) - { - callback = ((ConCommand *)pBase)->GetCallback(); - ptr = (unsigned char *)callback; -#ifdef OS_LINUX - if (vcmp(ptr, ENGINE486_SIG, SIGLEN)) - { - offs = ENGINE486_OFFS; - } - else if (vcmp(ptr, ENGINE686_SIG, SIGLEN)) - { - offs = ENGINE686_OFFS; - } - else if (vcmp(ptr, ENGINEAMD_SIG, SIGLEN)) - { - offs = ENGINEAMD_OFFS; - } -#elif defined OS_WIN32 // Only one Windows engine binary so far... - if (vcmp(ptr, ENGINEW32_SIG, SIGLEN)) - { - offs = ENGINEW32_OFFS; - } -#endif - - if (!offs || ptr[offs - 1] != IA32_CALL) - { - return NULL; - } - //get the relative offset - void *addr = *((void **)(ptr + offs)); - //add the base offset, to the ip (which is the address+offset + 4 bytes for next instruction) - return (CONPRINTF_FUNC)((unsigned long)addr + (unsigned long)(ptr + offs) + 4); - } - pBase = const_cast(pBase->GetNext()); - } - - return NULL; -} - -////////////////////////////////////////////////////////////////////// -// EVEN MORE HACKS HERE! YOU HAVE BEEN WARNED! // -// Signatures necessary in finding the pointer to the CUtlDict that // -// stores user message information. // -// IServerGameDLL::GetUserMessageInfo() normally crashes with bad // -// message indices. This is our answer to it. Yuck! <:-( // -////////////////////////////////////////////////////////////////////// -#ifdef OS_WIN32 - /* General Windows sig */ - #define MSGCLASS_SIGLEN 7 - #define MSGCLASS_SIG "\x8B\x0D\x2A\x2A\x2A\x2A\x56" - #define MSGCLASS_OFFS 2 - - /* Dystopia Wimdows hack */ - #define MSGCLASS2_SIGLEN 16 - #define MSGCLASS2_SIG "\x56\x8B\x74\x24\x2A\x85\xF6\x7C\x2A\x3B\x35\x2A\x2A\x2A\x2A\x7D" - #define MSGCLASS2_OFFS 11 - - /* Windows frame pointer sig */ - #define MSGCLASS3_SIGLEN 18 - #define MSGCLASS3_SIG "\x55\x8B\xEC\x51\x89\x2A\x2A\x8B\x2A\x2A\x50\x8B\x0D\x2A\x2A\x2A\x2A\xE8" - #define MSGCLASS3_OFFS 13 -#elif defined OS_LINUX - /* No frame pointer sig */ - #define MSGCLASS_SIGLEN 14 - #define MSGCLASS_SIG "\x53\x83\xEC\x2A\x8B\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" - #define MSGCLASS_OFFS 9 - - /* Frame pointer sig */ - #define MSGCLASS2_SIGLEN 16 - #define MSGCLASS2_SIG "\x55\x89\xE5\x53\x83\xEC\x2A\x8B\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" - #define MSGCLASS2_OFFS 11 -#endif - -struct UserMessage -{ - int size; - const char *name; -}; - -typedef CUtlDict UserMsgDict; - -/* This is the ugliest function in all of SourceMM */ -bool CacheUserMessages() -{ - /* Get address of original GetUserMessageInfo() */ - char *vfunc = NULL; - /* :TODO: fix this for v5 (char *)SH_GET_ORIG_VFNPTR_ENTRY(server, &IServerGameDLL::GetUserMessageInfo); */ - - /* Oh dear, we have a relative jump on our hands - * PVK II on Windows made me do this, but I suppose it doesn't hurt to check this on Linux too... - */ - if (*vfunc == '\xE9') - { - /* Get address from displacement... - * - * Add 5 because it's relative to next instruction: - * Opcode <1 byte> + 32-bit displacement <4 bytes> - */ - vfunc += *reinterpret_cast(vfunc + 1) + 5; - } - - CUtlDict *dict = NULL; - - if (vcmp(vfunc, MSGCLASS_SIG, MSGCLASS_SIGLEN)) - { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - } - else if (vcmp(vfunc, MSGCLASS2_SIG, MSGCLASS2_SIGLEN)) - { - #ifdef OS_WIN32 - /* If we get here, the code is possibly inlined like in Dystopia */ - - /* Get the address of the CUtlRBTree */ - char *rbtree = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* CUtlDict should be 8 bytes before the CUtlRBTree (hacktacular!) */ - dict = reinterpret_cast(rbtree - 8); - #elif defined OS_LINUX - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - #ifdef OS_WIN32 - } - else if (vcmp(vfunc, MSGCLASS3_SIG, MSGCLASS3_SIGLEN)) - { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS3_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - } - - if (dict) - { - int msg_count = dict->Count(); - - /* Ensure that count is within bounds of an unsigned byte, because that's what engine supports */ - if (msg_count < 0 || msg_count > 255) - { - return false; - } - - UserMessage *msg; - UsrMsgInfo u_msg; - - /* Cache messages in our CUtlDict */ - for (int i = 0; i < msg_count; i++) - { - msg = dict->Element(i); - u_msg.name = msg->name; - u_msg.size = msg->size; - usermsgs_list.push_back(u_msg); - } - - return true; - } - - return false; -} - diff --git a/providers/episode1/provider_ep1.h b/providers/episode1/provider_ep1.h deleted file mode 100644 index 6be81bc..0000000 --- a/providers/episode1/provider_ep1.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ -#define _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ - -#include -#include -#include "oslink.h" - -using namespace SourceMM; -using namespace SourceHook; - -class BaseProvider : public IMetamodSourceProvider -{ -public: - virtual bool IsSourceEngineBuildCompatible(int build); - virtual bool GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo); - virtual bool LogMessage(const char *buffer); - virtual const char *GetCommandLineValue(const char *key, const char *defval); - virtual void ConsolePrint(const char *msg); - virtual bool IsRemotePrintingAvailable(); - virtual void ClientConsolePrint(edict_t *client, const char *msg); - virtual IServerPluginCallbacks *GetVSPCallbacks(const char *iface); - virtual void DisplayError(const char *fmt, ...); - virtual void DisplayWarning(const char *fmt, ...); - virtual int TryServerGameDLL(const char *iface); - virtual void Notify_DLLInit_Pre(); - virtual void ServerCommand(const char *cmd); - virtual ConVar *CreateConVar(const char *name, - const char *defval, - const char *help, - int flags); - virtual const char *GetConVarString(ConVar *convar); - virtual void CreateCommand(const char *name, - METAMOD_COMMAND callback, - const char *help); - virtual void SetClientCommandHandler(METAMOD_COMMAND callback); - virtual const char *GetGameDescription(); - virtual IConCommandBaseAccessor *GetConCommandBaseAccessor(); - virtual bool RegisterConCommandBase(ConCommandBase *pCommand); - virtual void UnregisterConCommandBase(ConCommandBase *pCommand); - virtual bool IsConCommandBaseACommand(ConCommandBase *pCommand); - virtual int GetUserMessageCount(); - virtual int FindUserMessage(const char *name, int *size=NULL); - virtual const char *GetUserMessage(int index, int *size=NULL); -}; - -extern IVEngineServer *engine; -extern IServerGameDLL *server; -extern IServerGameClients *gameclients; -extern ICvar *icvar; - -#endif //_INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ - diff --git a/providers/provider_util.cpp b/providers/provider_util.cpp deleted file mode 100644 index 5cdcc5f..0000000 --- a/providers/provider_util.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "provider_util.h" - -size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params) -{ - size_t len = vsnprintf(buffer, maxlength, fmt, params); - - if (len >= maxlength) - { - len = maxlength - 1; - buffer[len] = '\0'; - } - - return len; -} - diff --git a/providers/provider_util.h b/providers/provider_util.h deleted file mode 100644 index 742f5b5..0000000 --- a/providers/provider_util.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _METAMOD_SOURCE_PROVIDER_UTIL_H_ -#define _METAMOD_SOURCE_PROVIDER_UTIL_H_ - -#include -#include -#include - -size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params); - -#endif //_METAMOD_SOURCE_PROVIDER_UTIL_H_ - diff --git a/sourcehook/generate/shworker.bin b/sourcehook/generate/shworker.bin index 18d35bd2ec92e780d2384dbf192640497b82ae37..63b8d5233837bf9393b75edd185a1b67c49a2c0b 100755 GIT binary patch literal 59291 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 gc`~ch(jOWgiqQg>v#c2F#rGn literal 54998 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 XRI!`2;db_HgI+>5lKQxTZw>zg{q0Ax diff --git a/sourcehook/generate/sourcehook.h b/sourcehook/generate/sourcehook.h index 49e6813..a75e271 100644 --- a/sourcehook/generate/sourcehook.h +++ b/sourcehook/generate/sourcehook.h @@ -22,7 +22,14 @@ // 3 - Added "hook loop status variable" // 4 - Reentrant #define SH_IFACE_VERSION 4 -#define SH_IMPL_VERSION 3 + +// Impl versions: +// ??? +// 4 - addition of hook ids and vp hooks (with them, AddHookNew and RemoveHookNew) +// This is not a SH_IFACE_VERSION change so that old plugins continue working! +// 5 - addition of direct vp hooks (new hook mode; from now on AddHookNew checks for +// invalid hookmode -> impl version won't have to change because of things like this) +#define SH_IMPL_VERSION 5 // Hookman version: // 1 - Support for recalls, performance optimisations @@ -291,15 +298,12 @@ namespace SourceHook } }; - template struct CallClass + template struct DeprecatedCallClass { virtual B *GetThisPtr() = 0; virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; }; - typedef CallClass GenericCallClass; - typedef CallClass ManualCallClass; - // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) // - Today is an important day. // I'm adding support for functions which return references. @@ -401,14 +405,14 @@ namespace SourceHook * @param iface The interface pointer * @param size Size of the class instance */ - virtual GenericCallClass *GetCallClass(void *iface, size_t size) = 0; + virtual DeprecatedCallClass *GetCallClass(void *iface, size_t size) = 0; /** * @brief Release a callclass * * @param ptr Pointer to the callclass */ - virtual void ReleaseCallClass(GenericCallClass *ptr) = 0; + virtual void ReleaseCallClass(DeprecatedCallClass *ptr) = 0; virtual void SetRes(META_RES res) = 0; //!< Sets the meta result virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the @@ -479,7 +483,65 @@ namespace SourceHook virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; - //!< + /** + * @brief Modes for the new AddHook + */ + enum AddHookMode + { + Hook_Normal, + Hook_VP, + Hook_DVP + }; + + /** + * @brief Add a (VP) hook. + * + * @return non-zero hook id on success, 0 otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param mode Can be either Hook_Normal or Hook_VP (vtable-wide hook) + * @param iface The interface pointer + * @param ifacesize The size of the class iface points to + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual int AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) = 0; + + /** + * @brief Remove a VP hook by ID. + * + * @return true on success, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param hookid The hook id (returned by AddHookNew) + */ + virtual bool RemoveHookByID(Plugin plug, int hookid) = 0; + + /** + * @brief Makes sure that hooks are going to be ignored on the next call of vfnptr + * + * @param plug The unique identifier of the plugin that calls this function + * @param vfnptr The virtual function pointer of the function in question + */ + virtual void SetIgnoreHooks(Plugin plug, void *vfnptr) = 0; + + /** + * @brief Reverses SetIgnoreHooks' effect + * + * @param plug The unique identifier of the plugin that calls this function + * @param vfnptr The virtual function pointer of the function in question + */ + virtual void ResetIgnoreHooks(Plugin plug, void *vfnptr) = 0; + + /** + * @brief Finds the original entry of a virtual function pointer + * + * @param vfnptr The virtual function pointer + * @return The original entry if the virtual function pointer has been patched; NULL otherwise. + */ + virtual void *GetOrigVfnPtrEntry(void *vfnptr) = 0; }; // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: @@ -510,6 +572,50 @@ namespace SourceHook return &ref; } }; + + // For source-level compatibility + template struct CallClass + { + T *ptr; + + CallClass(T *p) : ptr(p) + { + } + + operator T*() + { + return ptr; + } + }; + + typedef CallClass GenericCallClass; + typedef CallClass ManualCallClass; + + template + CallClass *GetCallClass(T *p) + { + return new CallClass(p); + } + + template + void ReleaseCallClass(CallClass *p) + { + delete p; + } + + template + void *GetOrigVfnPtrEntry(X *pInstance, MFP mfp, ISourceHook *pSH) + { + SourceHook::MemFuncInfo info = {true, -1, 0, 0}; + SourceHook::GetFuncInfo(pInstance, mfp, info); + + void *vfnptr = reinterpret_cast( + *reinterpret_cast(reinterpret_cast(pInstance) + info.thisptroffs + info.vtbloffs) + info.vtblindex); + + void *origentry = pSH->GetOrigVfnPtrEntry(vfnptr); + + return origentry ? origentry : *reinterpret_cast(vfnptr); + } } /************************************************************************/ @@ -614,31 +720,6 @@ namespace SourceHook RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ } while (0) -/** -* @brief Get/generate callclass for an interface pointer -* -* @param ifaceptr The interface pointer -*/ -template -inline SourceHook::CallClass *SH_GET_CALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), sizeof(ifacetype))); -} - -template -inline SourceHook::CallClass *SH_GET_MCALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr, int ifacesize) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), ifacesize)); -} - -template -inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::CallClass *ptr) -{ - shptr->ReleaseCallClass(reinterpret_cast(ptr)); -} - #define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ do { \ SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ @@ -647,41 +728,83 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ } while (0) -#define SH_GET_CALLCLASS(ptr) SH_GET_CALLCLASS_R(SH_GLOB_SHPTR, ptr) -#define SH_GET_MCALLCLASS(ptr, size) SH_GET_MCALLCLASS_R(SH_GLOB_SHPTR, reinterpret_cast(ptr), size) -#define SH_RELEASE_CALLCLASS(ptr) SH_RELEASE_CALLCLASS_R(SH_GLOB_SHPTR, ptr) + +#define SH_GET_ORIG_VFNPTR_ENTRY(inst, mfp) (SourceHook::GetOrigVfnPtrEntry(inst, mfp, SH_GLOB_SHPTR)) + +// For source-level compatibility + +#define SH_GET_CALLCLASS(ptr) SourceHook::GetCallClass(ptr) +#define SH_GET_MCALLCLASS(ptr, size) SourceHook::GetCallClass(reinterpret_cast(ptr)) +#define SH_RELEASE_CALLCLASS(ptr) SourceHook::ReleaseCallClass(ptr) + +// New ADD / REMOVE macros. +#define SH_STATIC(func) fastdelegate::MakeDelegate(func) +#define SH_MEMBER(inst, func) fastdelegate::MakeDelegate(inst, func) #define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ post, handler) -#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) #define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) -#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - + post, handler) #define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) #define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) +#define SH_ADD_VPHOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ + __SourceHook_FHVPAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ + post, handler, false) + +#define SH_ADD_DVPHOOK(ifacetype, ifacefunc, vtableptr, handler, post) \ + __SourceHook_FHVPAdd##ifacetype##ifacefunc(reinterpret_cast(vtableptr), \ + post, handler, true) + +#define SH_ADD_MANUALVPHOOK(hookname, ifaceptr, handler, post) \ + __SourceHook_FHMVPAdd##hookname(reinterpret_cast(ifaceptr), post, handler, false) + +#define SH_ADD_MANUALDVPHOOK(hookname, vtableptr, handler, post) \ + __SourceHook_FHMVPAdd##hookname(reinterpret_cast(vtableptr), post, handler, true) + +#define SH_REMOVE_HOOK_ID(hookid) \ + (SH_GLOB_SHPTR->RemoveHookByID(SH_GLOB_PLUGPTR, hookid)) + +// Old macros +// !! These are now deprecated. Instead, use one of these: +// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) + +// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) + +// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) + +// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) #define SH_NOATTRIB @@ -716,6 +839,8 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C /* Verify interface version */ \ if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ return 1; \ + if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ + return 1; \ \ if (action == HA_GetInfo) \ { \ @@ -760,7 +885,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ - bool __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ + int __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ { \ using namespace ::SourceHook; \ @@ -769,10 +894,24 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ return false; /* No non-virtual functions / virtual inheritance supported */ \ \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, mfi.thisptroffs, \ SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ new CSHDelegate(handler), post); \ } \ + int __SourceHook_FHVPAdd##ifacetype##ifacefunc(void *iface, bool post, \ + SH_FHCls(ifacetype,ifacefunc,overload)::FD handler, bool direct) \ + { \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(funcptr, mfi); \ + if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ + return false; /* No non-virtual functions / virtual inheritance supported */ \ + \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ + direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ + iface, mfi.thisptroffs, SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ + new CSHDelegate(handler), post); \ + } \ bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ { \ @@ -811,6 +950,8 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C /* Verify interface version */ \ if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ return 1; \ + if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ + return 1; \ \ if (action == HA_GetInfo) \ { \ @@ -843,13 +984,21 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ - bool __SourceHook_FHMAdd##hookname(void *iface, bool post, \ + int __SourceHook_FHMAdd##hookname(void *iface, bool post, \ SH_MFHCls(hookname)::FD handler) \ { \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, pthisptroffs, \ SH_MFHCls(hookname)::HookManPubFunc, \ new ::SourceHook::CSHDelegate(handler), post); \ } \ + int __SourceHook_FHMVPAdd##hookname(void *iface, bool post, \ + SH_MFHCls(hookname)::FD handler, bool direct) \ + { \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ + direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ + iface, pthisptroffs, SH_MFHCls(hookname)::HookManPubFunc, \ + new ::SourceHook::CSHDelegate(handler), post); \ + } \ bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ SH_MFHCls(hookname)::FD handler) \ { \ @@ -3007,1990 +3156,2063 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C ////////////////////////////////////////////////////////////////////////// // SH_CALL -#if SH_COMP == SH_COMP_MSVC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ +#define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ { \ using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = origfunc; \ - \ - void *adjustedthisptr = reinterpret_cast(reinterpret_cast(m_CC->GetThisPtr()) + mfi.thisptroffs); \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ + m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ + RetType tmpret = (m_ThisPtr->*m_MFP)call; \ + m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ + return tmpret; \ } -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ +#define SH_MAKE_EXECUTABLECLASS_OB_void(call, prms) \ { \ using namespace ::SourceHook; \ - char *adjustedthisptr = reinterpret_cast(m_CC->GetThisPtr()) + m_ThisPtrOffs; \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.addr) \ - u.addr = (*reinterpret_cast(adjustedthisptr + m_VtblOffs))[m_VtblIdx]; \ \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ + m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ + (m_ThisPtr->*m_MFP)call; \ + m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ } -#elif SH_COMP == SH_COMP_GCC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ - \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = origfunc; \ - u.s.adjustor = mfi.thisptroffs; \ - \ - return (reinterpret_cast(m_CC->GetThisPtr())->*u.mfpnew)call; \ -} - -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - char *thisptr = reinterpret_cast(m_CC->GetThisPtr()); \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.s.addr) \ - u.s.addr = (*reinterpret_cast(thisptr + m_ThisPtrOffs + m_VtblOffs))[m_VtblIdx]; \ - \ - u.s.adjustor = m_ThisPtrOffs; \ - return (reinterpret_cast(thisptr)->*u.mfpnew)call; \ -} - -#endif - namespace SourceHook { - - // Support for 0 arguments - template class ExecutableClass0 + // Call Class Wrapper! + template struct CCW { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass0(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()() const - SH_MAKE_EXECUTABLECLASS_OB((), ()) - - - template RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - + typedef T type; + + // Get Real Pointer! + static inline T *GRP(T *p) + { + return p; + } }; - template class MExecutableClass0 + template struct CCW< CallClass > { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; + typedef T type; + + // Get Real Pointer! + static inline T *GRP(CallClass *p) + { + return p->ptr; + } + }; + + + // Support for 0 arguments + template class ExecutableClass0 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - MExecutableClass0(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - + ExecutableClass0(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + RetType operator()() const - SH_MAKE_MEXECUTABLECLASS_OB((), ()) - + SH_MAKE_EXECUTABLECLASS_OB((), ()) + template RetType operator()(Param1 p1) const - SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) + SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass0 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass0(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()() const + SH_MAKE_EXECUTABLECLASS_OB_void((), ()) + + + template void operator()(Param1 p1) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1), (Param1)) + + template void operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 1 arguments - template class ExecutableClass1 + template class ExecutableClass1 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass1(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass1 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass1(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1) const - SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) - + SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) + template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass1 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1), (Param1)) + + + template void operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 2 arguments - template class ExecutableClass2 + template class ExecutableClass2 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass2(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass2(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass2 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass2(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass2 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass2(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 3 arguments - template class ExecutableClass3 + template class ExecutableClass3 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass3(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass3(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass3 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass3(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass3 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass3(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 4 arguments - template class ExecutableClass4 + template class ExecutableClass4 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass4(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass4(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass4 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass4(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass4 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass4(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 5 arguments - template class ExecutableClass5 + template class ExecutableClass5 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass5(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass5(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass5 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass5(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass5 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass5(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 6 arguments - template class ExecutableClass6 + template class ExecutableClass6 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass6(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass6(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass6 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass6(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass6 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass6(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 7 arguments - template class ExecutableClass7 + template class ExecutableClass7 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass7(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass7(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass7 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass7(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass7 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass7(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 8 arguments - template class ExecutableClass8 + template class ExecutableClass8 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass8(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass8(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass8 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass8(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass8 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass8(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 9 arguments - template class ExecutableClass9 + template class ExecutableClass9 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass9(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass9(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass9 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass9(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass9 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass9(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 10 arguments - template class ExecutableClass10 + template class ExecutableClass10 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass10(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass10(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass10 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass10(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass10 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass10(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 11 arguments - template class ExecutableClass11 + template class ExecutableClass11 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass11(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass11(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass11 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass11(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass11 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass11(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 12 arguments - template class ExecutableClass12 + template class ExecutableClass12 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass12(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass12(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass12 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass12(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass12 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass12(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 13 arguments - template class ExecutableClass13 + template class ExecutableClass13 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass13(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass13(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass13 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass13(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass13 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass13(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 14 arguments - template class ExecutableClass14 + template class ExecutableClass14 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass14(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass14(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass14 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass14(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass14 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass14(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 15 arguments - template class ExecutableClass15 + template class ExecutableClass15 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass15(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass15(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass15 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass15(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass15 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass15(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 16 arguments - template class ExecutableClass16 + template class ExecutableClass16 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass16(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass16(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass16 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass16(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass16 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass16(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 17 arguments - template class ExecutableClass17 + template class ExecutableClass17 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass17(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass17(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass17 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass17(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass17 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass17(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 18 arguments - template class ExecutableClass18 + template class ExecutableClass18 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass18(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass18(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass18 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass18(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass18 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass18(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 19 arguments - template class ExecutableClass19 + template class ExecutableClass19 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass19(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass19(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass19 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass19(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass19 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass19(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 20 arguments - template class ExecutableClass20 + template class ExecutableClass20 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass20(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass20(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - + }; - template class MExecutableClass20 + template class ExecutableClass20 { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - MExecutableClass20(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - + ExecutableClass20(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; } +#define SH__CALL_GET_VFNPTR_NORMAL \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(CCW::GRP(ptr), mfp, mfi); \ + void *vfnptr = reinterpret_cast( \ + *reinterpret_cast(reinterpret_cast(ptr) + mfi.thisptroffs + mfi.vtbloffs) + mfi.vtblindex); + +#define SH__CALL_GET_VFNPTR_MANUAL \ + using namespace ::SourceHook; \ + void *vfnptr = reinterpret_cast( \ + *reinterpret_cast( (reinterpret_cast(CCW::GRP(ptr)) + thisptroffs + vtbloffs) ) + vtblidx); \ + /* patch mfp */ \ + *reinterpret_cast(&mfp) = *reinterpret_cast(vfnptr); + // SH_CALL needs to deduce the return type -> it uses templates and function overloading // That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP // The only purpose of the mfp2 parameter is to extract the return type @@ -4998,464 +5220,590 @@ namespace SourceHook // Support for 0 arguments template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()) +SourceHook::ExecutableClass0::type, MFP, RetType> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()const) +SourceHook::ExecutableClass0::type, MFP, RetType> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)()const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass0 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass0 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass0(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass0( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 1 arguments template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)) +SourceHook::ExecutableClass1::type, MFP, RetType, Param1> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const) +SourceHook::ExecutableClass1::type, MFP, RetType, Param1> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass1 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass1 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass1(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass1( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 2 arguments template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)) +SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const) +SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass2 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass2 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass2(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass2( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 3 arguments template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)) +SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const) +SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass3 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass3 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass3(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass3( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 4 arguments template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)) +SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const) +SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass4 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass4 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass4(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass4( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 5 arguments template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)) +SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const) +SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass5 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass5 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass5(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass5( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 6 arguments template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)) +SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const) +SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass6 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass6 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass6(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass6( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 7 arguments template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) +SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const) +SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass7 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass7 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass7(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass7( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 8 arguments template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) +SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const) +SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass8 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass8 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass8(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass8( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 9 arguments template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) +SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const) +SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass9 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass9 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass9(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass9( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 10 arguments template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) +SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const) +SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass10 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass10 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass10(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass10( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 11 arguments template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) +SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const) +SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass11 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass11 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass11(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass11( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 12 arguments template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) +SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const) +SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass12 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass12 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass12(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass12( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 13 arguments template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) +SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const) +SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass13 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass13 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass13(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass13( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 14 arguments template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) +SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const) +SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass14 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass14 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass14(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass14( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 15 arguments template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) +SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const) +SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass15 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass15 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass15(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass15( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 16 arguments template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) +SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const) +SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass16 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass16 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass16(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass16( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 17 arguments template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) +SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const) +SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass17 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass17 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass17(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass17( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 18 arguments template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) +SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const) +SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass18 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass18 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass18(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass18( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 19 arguments template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) +SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const) +SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass19 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass19 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass19(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass19( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 20 arguments template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) +SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const) +SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass20 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass20 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass20(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass20( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } @@ -5465,344 +5813,429 @@ SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Par // Support for 0 arguments template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)) +SourceHook::ExecutableClass0::type, MFP, RetType> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)const) +SourceHook::ExecutableClass0::type, MFP, RetType> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 1 arguments template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)) +SourceHook::ExecutableClass1::type, MFP, RetType, Param1> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const) +SourceHook::ExecutableClass1::type, MFP, RetType, Param1> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 2 arguments template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)) +SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const) +SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 3 arguments template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)) +SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const) +SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 4 arguments template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)) +SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const) +SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 5 arguments template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)) +SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const) +SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 6 arguments template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)) +SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const) +SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 7 arguments template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)) +SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const) +SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 8 arguments template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)) +SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const) +SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 9 arguments template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)) +SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const) +SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 10 arguments template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)) +SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const) +SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 11 arguments template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)) +SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const) +SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 12 arguments template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)) +SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const) +SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 13 arguments template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)) +SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const) +SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 14 arguments template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)) +SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const) +SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 15 arguments template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)) +SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const) +SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 16 arguments template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)) +SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const) +SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 17 arguments template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)) +SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const) +SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 18 arguments template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)) +SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const) +SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 19 arguments template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)) +SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const) +SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 20 arguments template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)) +SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const) +SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } #endif -#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp)) +#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) +#define SH_MCALL2(ptr, mfp, vtblidx, vtbloffs, thisptroffs) SH_MCALL3((ptr), (mfp), (mfp), (vtblidx), (vtbloffs), (thisptroffs), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) #define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) diff --git a/sourcehook/generate/sourcehook.hxx b/sourcehook/generate/sourcehook.hxx index 1431c12..e2566e8 100755 --- a/sourcehook/generate/sourcehook.hxx +++ b/sourcehook/generate/sourcehook.hxx @@ -22,7 +22,14 @@ // 3 - Added "hook loop status variable" // 4 - Reentrant #define SH_IFACE_VERSION 4 -#define SH_IMPL_VERSION 3 + +// Impl versions: +// ??? +// 4 - addition of hook ids and vp hooks (with them, AddHookNew and RemoveHookNew) +// This is not a SH_IFACE_VERSION change so that old plugins continue working! +// 5 - addition of direct vp hooks (new hook mode; from now on AddHookNew checks for +// invalid hookmode -> impl version won't have to change because of things like this) +#define SH_IMPL_VERSION 5 // Hookman version: // 1 - Support for recalls, performance optimisations @@ -291,15 +298,12 @@ namespace SourceHook } }; - template struct CallClass + template struct DeprecatedCallClass { virtual B *GetThisPtr() = 0; virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; }; - typedef CallClass GenericCallClass; - typedef CallClass ManualCallClass; - // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) // - Today is an important day. // I'm adding support for functions which return references. @@ -401,14 +405,14 @@ namespace SourceHook * @param iface The interface pointer * @param size Size of the class instance */ - virtual GenericCallClass *GetCallClass(void *iface, size_t size) = 0; + virtual DeprecatedCallClass *GetCallClass(void *iface, size_t size) = 0; /** * @brief Release a callclass * * @param ptr Pointer to the callclass */ - virtual void ReleaseCallClass(GenericCallClass *ptr) = 0; + virtual void ReleaseCallClass(DeprecatedCallClass *ptr) = 0; virtual void SetRes(META_RES res) = 0; //!< Sets the meta result virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the @@ -479,7 +483,65 @@ namespace SourceHook virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; - //!< + /** + * @brief Modes for the new AddHook + */ + enum AddHookMode + { + Hook_Normal, + Hook_VP, + Hook_DVP + }; + + /** + * @brief Add a (VP) hook. + * + * @return non-zero hook id on success, 0 otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param mode Can be either Hook_Normal or Hook_VP (vtable-wide hook) + * @param iface The interface pointer + * @param ifacesize The size of the class iface points to + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual int AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) = 0; + + /** + * @brief Remove a VP hook by ID. + * + * @return true on success, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param hookid The hook id (returned by AddHookNew) + */ + virtual bool RemoveHookByID(Plugin plug, int hookid) = 0; + + /** + * @brief Makes sure that hooks are going to be ignored on the next call of vfnptr + * + * @param plug The unique identifier of the plugin that calls this function + * @param vfnptr The virtual function pointer of the function in question + */ + virtual void SetIgnoreHooks(Plugin plug, void *vfnptr) = 0; + + /** + * @brief Reverses SetIgnoreHooks' effect + * + * @param plug The unique identifier of the plugin that calls this function + * @param vfnptr The virtual function pointer of the function in question + */ + virtual void ResetIgnoreHooks(Plugin plug, void *vfnptr) = 0; + + /** + * @brief Finds the original entry of a virtual function pointer + * + * @param vfnptr The virtual function pointer + * @return The original entry if the virtual function pointer has been patched; NULL otherwise. + */ + virtual void *GetOrigVfnPtrEntry(void *vfnptr) = 0; }; // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: @@ -510,6 +572,50 @@ namespace SourceHook return &ref; } }; + + // For source-level compatibility + template struct CallClass + { + T *ptr; + + CallClass(T *p) : ptr(p) + { + } + + operator T*() + { + return ptr; + } + }; + + typedef CallClass GenericCallClass; + typedef CallClass ManualCallClass; + + template + CallClass *GetCallClass(T *p) + { + return new CallClass(p); + } + + template + void ReleaseCallClass(CallClass *p) + { + delete p; + } + + template + void *GetOrigVfnPtrEntry(X *pInstance, MFP mfp, ISourceHook *pSH) + { + SourceHook::MemFuncInfo info = {true, -1, 0, 0}; + SourceHook::GetFuncInfo(pInstance, mfp, info); + + void *vfnptr = reinterpret_cast( + *reinterpret_cast(reinterpret_cast(pInstance) + info.thisptroffs + info.vtbloffs) + info.vtblindex); + + void *origentry = pSH->GetOrigVfnPtrEntry(vfnptr); + + return origentry ? origentry : *reinterpret_cast(vfnptr); + } } /************************************************************************/ @@ -614,31 +720,6 @@ namespace SourceHook RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ } while (0) -/** -* @brief Get/generate callclass for an interface pointer -* -* @param ifaceptr The interface pointer -*/ -template -inline SourceHook::CallClass *SH_GET_CALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), sizeof(ifacetype))); -} - -template -inline SourceHook::CallClass *SH_GET_MCALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr, int ifacesize) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), ifacesize)); -} - -template -inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::CallClass *ptr) -{ - shptr->ReleaseCallClass(reinterpret_cast(ptr)); -} - #define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ do { \ SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ @@ -647,41 +728,83 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ } while (0) -#define SH_GET_CALLCLASS(ptr) SH_GET_CALLCLASS_R(SH_GLOB_SHPTR, ptr) -#define SH_GET_MCALLCLASS(ptr, size) SH_GET_MCALLCLASS_R(SH_GLOB_SHPTR, reinterpret_cast(ptr), size) -#define SH_RELEASE_CALLCLASS(ptr) SH_RELEASE_CALLCLASS_R(SH_GLOB_SHPTR, ptr) + +#define SH_GET_ORIG_VFNPTR_ENTRY(inst, mfp) (SourceHook::GetOrigVfnPtrEntry(inst, mfp, SH_GLOB_SHPTR)) + +// For source-level compatibility + +#define SH_GET_CALLCLASS(ptr) SourceHook::GetCallClass(ptr) +#define SH_GET_MCALLCLASS(ptr, size) SourceHook::GetCallClass(reinterpret_cast(ptr)) +#define SH_RELEASE_CALLCLASS(ptr) SourceHook::ReleaseCallClass(ptr) + +// New ADD / REMOVE macros. +#define SH_STATIC(func) fastdelegate::MakeDelegate(func) +#define SH_MEMBER(inst, func) fastdelegate::MakeDelegate(inst, func) #define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ post, handler) -#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) #define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) -#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - + post, handler) #define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) #define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) +#define SH_ADD_VPHOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ + __SourceHook_FHVPAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ + post, handler, false) + +#define SH_ADD_DVPHOOK(ifacetype, ifacefunc, vtableptr, handler, post) \ + __SourceHook_FHVPAdd##ifacetype##ifacefunc(reinterpret_cast(vtableptr), \ + post, handler, true) + +#define SH_ADD_MANUALVPHOOK(hookname, ifaceptr, handler, post) \ + __SourceHook_FHMVPAdd##hookname(reinterpret_cast(ifaceptr), post, handler, false) + +#define SH_ADD_MANUALDVPHOOK(hookname, vtableptr, handler, post) \ + __SourceHook_FHMVPAdd##hookname(reinterpret_cast(vtableptr), post, handler, true) + +#define SH_REMOVE_HOOK_ID(hookid) \ + (SH_GLOB_SHPTR->RemoveHookByID(SH_GLOB_PLUGPTR, hookid)) + +// Old macros +// !! These are now deprecated. Instead, use one of these: +// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) + +// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) + +// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) + +// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) #define SH_NOATTRIB @@ -716,6 +839,8 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C /* Verify interface version */ \ if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ return 1; \ + if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ + return 1; \ \ if (action == HA_GetInfo) \ { \ @@ -760,7 +885,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ - bool __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ + int __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ { \ using namespace ::SourceHook; \ @@ -769,10 +894,24 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ return false; /* No non-virtual functions / virtual inheritance supported */ \ \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, mfi.thisptroffs, \ SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ new CSHDelegate(handler), post); \ } \ + int __SourceHook_FHVPAdd##ifacetype##ifacefunc(void *iface, bool post, \ + SH_FHCls(ifacetype,ifacefunc,overload)::FD handler, bool direct) \ + { \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(funcptr, mfi); \ + if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ + return false; /* No non-virtual functions / virtual inheritance supported */ \ + \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ + direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ + iface, mfi.thisptroffs, SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ + new CSHDelegate(handler), post); \ + } \ bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ { \ @@ -811,6 +950,8 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C /* Verify interface version */ \ if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ return 1; \ + if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ + return 1; \ \ if (action == HA_GetInfo) \ { \ @@ -843,13 +984,21 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ - bool __SourceHook_FHMAdd##hookname(void *iface, bool post, \ + int __SourceHook_FHMAdd##hookname(void *iface, bool post, \ SH_MFHCls(hookname)::FD handler) \ { \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, pthisptroffs, \ SH_MFHCls(hookname)::HookManPubFunc, \ new ::SourceHook::CSHDelegate(handler), post); \ } \ + int __SourceHook_FHMVPAdd##hookname(void *iface, bool post, \ + SH_MFHCls(hookname)::FD handler, bool direct) \ + { \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ + direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ + iface, pthisptroffs, SH_MFHCls(hookname)::HookManPubFunc, \ + new ::SourceHook::CSHDelegate(handler), post); \ + } \ bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ SH_MFHCls(hookname)::FD handler) \ { \ @@ -1127,136 +1276,109 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C ////////////////////////////////////////////////////////////////////////// // SH_CALL -#if SH_COMP == SH_COMP_MSVC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ +#define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ { \ using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = origfunc; \ - \ - void *adjustedthisptr = reinterpret_cast(reinterpret_cast(m_CC->GetThisPtr()) + mfi.thisptroffs); \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ + m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ + RetType tmpret = (m_ThisPtr->*m_MFP)call; \ + m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ + return tmpret; \ } -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ +#define SH_MAKE_EXECUTABLECLASS_OB_void(call, prms) \ { \ using namespace ::SourceHook; \ - char *adjustedthisptr = reinterpret_cast(m_CC->GetThisPtr()) + m_ThisPtrOffs; \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.addr) \ - u.addr = (*reinterpret_cast(adjustedthisptr + m_VtblOffs))[m_VtblIdx]; \ \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ + m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ + (m_ThisPtr->*m_MFP)call; \ + m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ } -#elif SH_COMP == SH_COMP_GCC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ - \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = origfunc; \ - u.s.adjustor = mfi.thisptroffs; \ - \ - return (reinterpret_cast(m_CC->GetThisPtr())->*u.mfpnew)call; \ -} - -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - char *thisptr = reinterpret_cast(m_CC->GetThisPtr()); \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.s.addr) \ - u.s.addr = (*reinterpret_cast(thisptr + m_ThisPtrOffs + m_VtblOffs))[m_VtblIdx]; \ - \ - u.s.adjustor = m_ThisPtrOffs; \ - return (reinterpret_cast(thisptr)->*u.mfpnew)call; \ -} - -#endif - namespace SourceHook { -@[$1,0,$a: - // Support for $1 arguments - template class ExecutableClass$1 + // Call Class Wrapper! + template struct CCW { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass$1(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(@[$2,1,$1|, :Param$2 p$2@]) const - SH_MAKE_EXECUTABLECLASS_OB((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) - - @[$2,$1+1,$a: - template <@[$3,$1+1,$2|, :class Param$3@]> RetType operator()(@[$3,1,$2|, :Param$3 p$3@]) const - SH_MAKE_EXECUTABLECLASS_OB((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) - @] + typedef T type; + + // Get Real Pointer! + static inline T *GRP(T *p) + { + return p; + } }; - template class MExecutableClass$1 + template struct CCW< CallClass > { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; + typedef T type; + + // Get Real Pointer! + static inline T *GRP(CallClass *p) + { + return p->ptr; + } + }; + +@[$1,0,$a: + // Support for $1 arguments + template class ExecutableClass$1 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - MExecutableClass$1(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - + ExecutableClass$1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + RetType operator()(@[$2,1,$1|, :Param$2 p$2@]) const - SH_MAKE_MEXECUTABLECLASS_OB((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) - + SH_MAKE_EXECUTABLECLASS_OB((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) + @[$2,$1+1,$a: template <@[$3,$1+1,$2|, :class Param$3@]> RetType operator()(@[$3,1,$2|, :Param$3 p$3@]) const - SH_MAKE_MEXECUTABLECLASS_OB((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) + SH_MAKE_EXECUTABLECLASS_OB((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) @] }; + + template class ExecutableClass$1 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass$1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(@[$2,1,$1|, :Param$2 p$2@]) const + SH_MAKE_EXECUTABLECLASS_OB_void((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) + + @[$2,$1+1,$a: + template <@[$3,$1+1,$2|, :class Param$3@]> void operator()(@[$3,1,$2|, :Param$3 p$3@]) const + SH_MAKE_EXECUTABLECLASS_OB_void((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) + @] + }; @] } +#define SH__CALL_GET_VFNPTR_NORMAL \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(CCW::GRP(ptr), mfp, mfi); \ + void *vfnptr = reinterpret_cast( \ + *reinterpret_cast(reinterpret_cast(ptr) + mfi.thisptroffs + mfi.vtbloffs) + mfi.vtblindex); + +#define SH__CALL_GET_VFNPTR_MANUAL \ + using namespace ::SourceHook; \ + void *vfnptr = reinterpret_cast( \ + *reinterpret_cast( (reinterpret_cast(CCW::GRP(ptr)) + thisptroffs + vtbloffs) ) + vtblidx); \ + /* patch mfp */ \ + *reinterpret_cast(&mfp) = *reinterpret_cast(vfnptr); + // SH_CALL needs to deduce the return type -> it uses templates and function overloading // That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP // The only purpose of the mfp2 parameter is to extract the return type @@ -1264,24 +1386,30 @@ namespace SourceHook @[$1,0,$a: // Support for $1 arguments template -SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@])) +SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@])const) +SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@])const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass$1 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass$1 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass$1(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass$1( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } @] @@ -1291,24 +1419,29 @@ SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$ @[$1,0,$a: // Support for $1 arguments template -SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...)) +SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...)const) +SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } @] #endif -#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp)) +#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) +#define SH_MCALL2(ptr, mfp, vtblidx, vtbloffs, thisptroffs) SH_MCALL3((ptr), (mfp), (mfp), (vtblidx), (vtbloffs), (thisptroffs), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) #define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) diff --git a/sourcehook/sourcehook.cpp b/sourcehook/sourcehook.cpp index 9f34447..e2fc8b0 100644 --- a/sourcehook/sourcehook.cpp +++ b/sourcehook/sourcehook.cpp @@ -39,7 +39,7 @@ namespace SourceHook return -1; return 0; } - CSourceHookImpl::CSourceHookImpl() + CSourceHookImpl::CSourceHookImpl() : m_OneIgnore(NULL), m_IgnoreActive(false) { } CSourceHookImpl::~CSourceHookImpl() @@ -277,24 +277,32 @@ namespace SourceHook m_HookMans.clear(); } + bool CSourceHookImpl::AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post) { - void *adjustediface = reinterpret_cast(reinterpret_cast(iface) + thisptr_offs); + return AddHookNew(plug, Hook_Normal, iface, thisptr_offs, myHookMan, handler, post) != 0 ? true : false; + } + + int CSourceHookImpl::AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) + { + void *adjustediface = NULL; + void **cur_vtptr = NULL; + void *cur_vfnptr = NULL; + + if (mode != Hook_Normal && mode != Hook_VP && mode != Hook_DVP) + return 0; // 1) Get info about the hook manager CHookManagerInfo tmp; if (myHookMan(HA_GetInfo, &tmp) != 0) - return false; + return 0; tmp.m_Func = myHookMan; tmp.m_Plug = plug; CHookManagerContainer::HMCI hmci(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx); - void **cur_vtptr = *reinterpret_cast( - reinterpret_cast(adjustediface) + tmp.m_VtblOffs); - void *cur_vfnptr = reinterpret_cast(cur_vtptr + tmp.m_VtblIdx); - // Add the container if not already added HookManContList::iterator hmcl_iter = m_HookMans.find(hmci); if (hmcl_iter == m_HookMans.end()) @@ -320,7 +328,7 @@ namespace SourceHook hmil_iter != hmcl_iter2->end(); ++hmil_iter) { if (hmil_iter->m_VfnPtrs.find(cur_vfnptr) != hmil_iter->m_VfnPtrs.end()) - return false; + return 0; } } } @@ -329,16 +337,37 @@ namespace SourceHook if (hookman->m_VfnPtrs.empty()) hookman->m_Func(HA_Register, &(*hookman)); + + // find vfnptr + if (mode == Hook_Normal || mode == Hook_VP) + { + adjustediface = reinterpret_cast(reinterpret_cast(iface) + thisptr_offs); + + cur_vtptr = *reinterpret_cast( + reinterpret_cast(adjustediface) + tmp.m_VtblOffs); + cur_vfnptr = reinterpret_cast(cur_vtptr + tmp.m_VtblIdx); + + // For Hook_VP, adjustediface will be set to NULL later + // because we first have to patch callclasses (callclasses are deprecated but left in for backwards compat) + } + else if (mode == Hook_DVP) + { + adjustediface = NULL; + + cur_vtptr = reinterpret_cast(iface); + cur_vfnptr = cur_vtptr + tmp.m_VtblIdx; + } + CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.find(cur_vfnptr); if (vfnptr_iter == hookman->m_VfnPtrs.end()) { // Add a new one - CVfnPtr vfp(cur_vfnptr); + CVfnPtr vfp(cur_vfnptr, &m_OneIgnore); // Alter vtable entry if (!SetMemAccess(cur_vtptr, sizeof(void*) * (tmp.m_VtblIdx + 1), SH_MEM_READ | SH_MEM_WRITE)) - return false; + return 0; *reinterpret_cast(cur_vfnptr) = *reinterpret_cast(hookman->m_HookfuncVfnptr); @@ -352,6 +381,10 @@ namespace SourceHook ApplyCallClassPatches(adjustediface, tmp.m_VtblOffs, tmp.m_VtblIdx, vfp.m_OrigEntry); } + // If it's a VP hook, set adjustediface to NULL now ( see the comments at the beginning of sourcehook_impl.h ) + if (mode == Hook_VP) + adjustediface = NULL; + CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.find(adjustediface); if (iface_iter == vfnptr_iter->m_Ifaces.end()) { @@ -361,6 +394,34 @@ namespace SourceHook // Make iface_iter point to the new element iface_iter = vfnptr_iter->m_Ifaces.end(); --iface_iter; + + // If this is a VP-Hook-NULL interface, go through all other interfaces of this vfnptr and tell them! + if (adjustediface == NULL) + { + for (CVfnPtr::IfaceListIter iface_iter2 = vfnptr_iter->m_Ifaces.begin(); + iface_iter2 != vfnptr_iter->m_Ifaces.end(); ++iface_iter2) + { + if (*iface_iter2 != NULL) + { + iface_iter2->m_PreHooks.SetVPList(&iface_iter->m_PreHooks.m_List); + iface_iter2->m_PostHooks.SetVPList(&iface_iter->m_PostHooks.m_List); + } + } + } + else + { + // If this is a new non-VP-Hook-NULL interface, look for a non-VP-Hook-NULL interface! + for (CVfnPtr::IfaceListIter iface_iter2 = vfnptr_iter->m_Ifaces.begin(); + iface_iter2 != vfnptr_iter->m_Ifaces.end(); ++iface_iter2) + { + if (*iface_iter2 == NULL) + { + iface_iter->m_PreHooks.SetVPList(&iface_iter2->m_PreHooks.m_List); + iface_iter->m_PostHooks.SetVPList(&iface_iter2->m_PostHooks.m_List); + break; // There can only be one! + } + } + } } // Add the hook @@ -369,11 +430,136 @@ namespace SourceHook hookinfo.plug = plug; hookinfo.paused = false; hookinfo.thisptr_offs = thisptr_offs; + hookinfo.hookid = m_HookIDMan.New(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx, cur_vfnptr, + adjustediface, plug, thisptr_offs, handler, post); + if (post) iface_iter->m_PostHooks.m_List.push_back(hookinfo); else iface_iter->m_PreHooks.m_List.push_back(hookinfo); + return hookinfo.hookid; + } + + bool CSourceHookImpl::RemoveHookByID(Plugin plug, int hookid) + { + const CHookIDManager::Entry *hentry; + + hentry = m_HookIDMan.QueryHook(hookid); + if (!hentry) + { + // hookid doesn't exist ! + return false; + } + + HookManContList::iterator hmcl_iter = m_HookMans.find( + CHookManagerContainer::HMCI(hentry->proto.GetProto(), hentry->vtbl_offs, hentry->vtbl_idx)); + if (hmcl_iter == m_HookMans.end() || hmcl_iter->empty()) + return false; + CHookManagerContainer::iterator hookman = hmcl_iter->begin(); + + // Find vfnptr + CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.find(hentry->vfnptr); + if (vfnptr_iter == hookman->m_VfnPtrs.end()) + return false; + + // Find iface + CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.find(hentry->adjustediface); + if (iface_iter == vfnptr_iter->m_Ifaces.end()) + return false; + + // Find hook + List &hooks = hentry->post ? iface_iter->m_PostHooks.m_List : iface_iter->m_PreHooks.m_List; + + List::iterator hookiter = hooks.find(hookid); + if (hookiter == hooks.end()) + return false; + + hookiter->handler->DeleteThis(); + + // Move all iterators pointing at this + List::iterator oldhookiter = hookiter; + hookiter = hooks.erase(hookiter); + List::iterator newhookiter = hookiter; + --newhookiter; // The hook loop will ++ it then + CHookList::CIter *pItIter; + + for (pItIter = iface_iter->m_PreHooks.m_UsedIters; pItIter; pItIter = pItIter->m_pNext) + if (pItIter->m_Iter == oldhookiter) + pItIter->m_Iter = newhookiter; + + // If this is VP-Hook-NULL interface, also check all other interfaces of this vfnptr + if (*iface_iter == NULL) + { + for (CVfnPtr::IfaceListIter iface_iter2 = vfnptr_iter->m_Ifaces.begin(); + iface_iter2 != vfnptr_iter->m_Ifaces.end(); ++iface_iter2) + { + if (*iface_iter2 != NULL) + { + for (pItIter = iface_iter2->m_PreHooks.m_UsedIters; pItIter; pItIter = pItIter->m_pNext) + if (pItIter->m_Iter == oldhookiter) + pItIter->m_Iter = newhookiter; + } + } + } + + if (iface_iter->m_PostHooks.m_List.empty() && iface_iter->m_PreHooks.m_List.empty()) + { + // If this is a VP-Hook-NULL interface, go through all other interfaces of this vfnptr and tell them! + if (*iface_iter == NULL) + { + for (CVfnPtr::IfaceListIter iface_iter2 = vfnptr_iter->m_Ifaces.begin(); + iface_iter2 != vfnptr_iter->m_Ifaces.end(); ++iface_iter2) + { + if (iface_iter2->m_Ptr != NULL) + { + iface_iter2->m_PreHooks.ClearVPList(); + iface_iter2->m_PostHooks.ClearVPList(); + } + } + } + + + // There are no hooks on this iface anymore... + for (HookLoopInfoStack::iterator hli_iter = m_HLIStack.begin(); + hli_iter != m_HLIStack.end(); ++hli_iter) + { + if (hli_iter->pCurIface == static_cast(&(*iface_iter))) + hli_iter->shouldContinue = false; + } + + iface_iter = vfnptr_iter->m_Ifaces.erase(iface_iter); + if (vfnptr_iter->m_Ifaces.empty()) + { + // No ifaces at all -> Deactivate the hook + + // Only patch the vfnptr back if the module is still in memory + // If it's not, do not remove stuff like we did before + // First off we did it wrong (shutdown the whole hookman, uh..) and secondly applications may be + // confused by RemoveHook returning false then (yeah, I know, I made this one up, no one checks for RemoveHook error) + if (ModuleInMemory(reinterpret_cast(vfnptr_iter->m_Ptr), SH_PTRSIZE)) + { + *reinterpret_cast(vfnptr_iter->m_Ptr) = vfnptr_iter->m_OrigEntry; + } + + hookman->m_VfnPtrs.erase(vfnptr_iter); + + // Remove callclass patch + for (Impl_CallClassList::iterator cciter = m_CallClasses.begin(); cciter != m_CallClasses.end(); ++cciter) + if (cciter->m_Ptr == hentry->adjustediface) + cciter->RemoveCallClassPatch(hentry->vtbl_offs, hentry->vtbl_idx); + + if (hookman->m_VfnPtrs.empty()) + { + // Unregister the hook manager + hookman->m_Func(HA_Unregister, NULL); + } + } + } + + // Don't forget to remove the hookid from m_HookIDMan + m_HookIDMan.Remove(hookid); + return true; } @@ -384,113 +570,32 @@ namespace SourceHook bool CSourceHookImpl::RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post) { - void *adjustediface = reinterpret_cast(reinterpret_cast(iface)+thisptr_offs); + // Get info about hook manager and compute adjustediface CHookManagerInfo tmp; if (myHookMan(HA_GetInfo, &tmp) != 0) return false; - // Find the hook manager and the hook + void *adjustediface = reinterpret_cast(reinterpret_cast(iface)+thisptr_offs); - HookManContList::iterator hmcl_iter = m_HookMans.find( - CHookManagerContainer::HMCI(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx)); - if (hmcl_iter == m_HookMans.end() || hmcl_iter->empty()) - return false; - - CHookManagerContainer::iterator hookman = hmcl_iter->begin(); + // Loop through all hooks and remove those which match: + // hookman, vfnptr, iface, plug, adjusted iface, this ptr offs, handler, post + CVector removehooks; + m_HookIDMan.FindAllHooks(removehooks, tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx, adjustediface, plug, thisptr_offs, handler, post); - if (!ModuleInMemory(reinterpret_cast(adjustediface) + tmp.m_VtblOffs, - sizeof(void*) * (tmp.m_VtblIdx + 1))) - { - // The module the vtable was in is already unloaded. - hookman->m_VfnPtrs.clear(); - hookman->m_Func(HA_Unregister, NULL); - return true; - } - - void **cur_vtptr = *reinterpret_cast( - reinterpret_cast(adjustediface) + tmp.m_VtblOffs); - void *cur_vfnptr = reinterpret_cast(cur_vtptr + tmp.m_VtblIdx); - - CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.find(cur_vfnptr); - - if (vfnptr_iter == hookman->m_VfnPtrs.end()) + if (removehooks.empty()) return false; - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end();) + bool status = false; + + for (CVector::iterator iter = removehooks.begin(); iter != removehooks.end(); ++iter) { - if (iface_iter->m_Ptr != adjustediface) - { - iface_iter++; - continue; - } - List &hooks = - post ? iface_iter->m_PostHooks.m_List : iface_iter->m_PreHooks.m_List; - - bool erase; - for (List::iterator hookiter = hooks.begin(); - hookiter != hooks.end(); ) - { - erase = hookiter->plug == plug && hookiter->handler->IsEqual(handler) && - hookiter->thisptr_offs == thisptr_offs; - if (erase) - { - hookiter->handler->DeleteThis(); // Make the _plugin_ delete the handler object - - // Move all iterators pointing at this - List::iterator oldhookiter = hookiter; - hookiter = hooks.erase(hookiter); - List::iterator newhookiter = hookiter; - --newhookiter; // The hook loop will ++ it then - CHookList::CIter *pItIter; - for (pItIter = iface_iter->m_PreHooks.m_UsedIters; pItIter; pItIter = pItIter->m_pNext) - if (pItIter->m_Iter == oldhookiter) - pItIter->m_Iter = newhookiter; - } - else - ++hookiter; - } - if (iface_iter->m_PostHooks.m_List.empty() && iface_iter->m_PreHooks.m_List.empty()) - { - // There are no hooks on this iface anymore... - for (HookLoopInfoStack::iterator hli_iter = m_HLIStack.begin(); - hli_iter != m_HLIStack.end(); ++hli_iter) - { - if (hli_iter->pCurIface == static_cast(&(*iface_iter))) - hli_iter->shouldContinue = false; - } - - iface_iter = vfnptr_iter->m_Ifaces.erase(iface_iter); - if (vfnptr_iter->m_Ifaces.empty()) - { - // No ifaces at all -> Deactivate the hook - *reinterpret_cast(vfnptr_iter->m_Ptr) = vfnptr_iter->m_OrigEntry; - - hookman->m_VfnPtrs.erase(vfnptr_iter); - - // Remove callclass patch - for (Impl_CallClassList::iterator cciter = m_CallClasses.begin(); cciter != m_CallClasses.end(); ++cciter) - if (cciter->m_Ptr == adjustediface) - cciter->RemoveCallClassPatch(tmp.m_VtblOffs, tmp.m_VtblIdx); - - if (hookman->m_VfnPtrs.empty()) - { - // Unregister the hook manager - hookman->m_Func(HA_Unregister, NULL); - } - - // Don't try to continue looping through ifaces - // - the list is already invalid - return true; - } - } - else - ++iface_iter; + if (RemoveHookByID(plug, *iter)) + status = true; } - return true; + return status; } - GenericCallClass *CSourceHookImpl::GetCallClass(void *iface, size_t size) + DeprecatedCallClass *CSourceHookImpl::GetCallClass(void *iface, size_t size) { for (Impl_CallClassList::iterator cciter = m_CallClasses.begin(); cciter != m_CallClasses.end(); ++cciter) { @@ -509,7 +614,7 @@ namespace SourceHook return &m_CallClasses.back(); } - void CSourceHookImpl::ReleaseCallClass(GenericCallClass *ptr) + void CSourceHookImpl::ReleaseCallClass(DeprecatedCallClass *ptr) { Impl_CallClassList::iterator iter = m_CallClasses.find(ptr); if (iter == m_CallClasses.end()) @@ -614,7 +719,7 @@ namespace SourceHook void CSourceHookImpl::HookLoopBegin(IIface *pIface) { - HookLoopInfo hli; + HookLoopInfo hli = {0}; hli.pCurIface = pIface; hli.shouldContinue = true; hli.recall = HookLoopInfo::Recall_No; @@ -802,6 +907,35 @@ namespace SourceHook } } + void CSourceHookImpl::SetIgnoreHooks(Plugin plug, void *vfnptr) + { + m_OneIgnore = vfnptr; + } + + void CSourceHookImpl::ResetIgnoreHooks(Plugin plug, void *vfnptr) + { + m_OneIgnore = NULL; + } + + void *CSourceHookImpl::GetOrigVfnPtrEntry(void *vfnptr) + { + for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); + hmcl_iter != m_HookMans.end(); ++hmcl_iter) + { + for (CHookManagerContainer::iterator hookmaniter = hmcl_iter->begin(); + hookmaniter != hmcl_iter->end(); ++hookmaniter) + { + for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookmaniter->m_VfnPtrs.begin(); + vfnptr_iter != hookmaniter->m_VfnPtrs.end(); ++vfnptr_iter) + { + if (vfnptr_iter->m_Ptr == vfnptr) + return vfnptr_iter->m_OrigEntry; + } + } + } + return NULL; + } + //////////////////////////// // CCallClassImpl //////////////////////////// @@ -897,7 +1031,8 @@ namespace SourceHook // If you get a crash here, the ptr passed is invalid // This usually means a SH_DECL_MANUALHOOK* with wrong thisptroffs/vtbloffs/vtblidx - CSourceHookImpl::CVfnPtr::CVfnPtr(void *ptr) : m_Ptr(ptr), m_OrigEntry(*reinterpret_cast(ptr)) + CSourceHookImpl::CVfnPtr::CVfnPtr(void *ptr, void **pOneIgnore) : m_Ptr(ptr), + m_OrigEntry(*reinterpret_cast(ptr)), m_pOneIgnore(pOneIgnore) { } CSourceHookImpl::CVfnPtr::~CVfnPtr() @@ -916,8 +1051,24 @@ namespace SourceHook IIface *CSourceHookImpl::CVfnPtr::FindIface(void *ptr) { + if (m_Ptr == *m_pOneIgnore) + { + *m_pOneIgnore = NULL; // Only once! + return NULL; + } + IfaceListIter iter = m_Ifaces.find(ptr); - return iter == m_Ifaces.end() ? NULL : &(*iter); + + // If nothing is found, check for a NULL-interface (VP hooks only) + if (iter == m_Ifaces.end()) + { + iter = m_Ifaces.find((void*)0); + return iter == m_Ifaces.end() ? NULL : &(*iter); + } + else + { + return &(*iter); + } } //////////////////////////// @@ -948,11 +1099,11 @@ namespace SourceHook // CHookList //////////////////////////// - CSourceHookImpl::CHookList::CHookList() : m_FreeIters(NULL), m_UsedIters(NULL), + CSourceHookImpl::CHookList::CHookList() : m_VPList(NULL), m_FreeIters(NULL), m_UsedIters(NULL), m_Recall(false) { } - CSourceHookImpl::CHookList::CHookList(const CHookList &other) : m_List(other.m_List), + CSourceHookImpl::CHookList::CHookList(const CHookList &other) : m_VPList(other.m_VPList), m_List(other.m_List), m_FreeIters(NULL), m_UsedIters(NULL), m_Recall(false) { } @@ -1029,9 +1180,36 @@ namespace SourceHook m_Recall = false; } - CSourceHookImpl::CHookList::CIter::CIter(CHookList *pList) : m_pList(pList), m_pNext(NULL) + void CSourceHookImpl::CHookList::SetVPList(List *newList) + { + m_VPList = newList; + + // Update cached CIter objects + + CIter *pTmp; + pTmp = m_FreeIters; + while (pTmp) + { + pTmp->m_Iter.SetListLeft(m_VPList); + pTmp = pTmp->m_pNext; + } + + pTmp = m_UsedIters; + while (pTmp) + { + pTmp->m_Iter.SetListLeft(m_VPList); + pTmp = pTmp->m_pNext; + } + } + + void CSourceHookImpl::CHookList::ClearVPList() + { + SetVPList(NULL); + } + + CSourceHookImpl::CHookList::CIter::CIter(CHookList *pList) : m_pList(pList), + m_Iter(pList->m_VPList, &m_pList->m_List), m_pNext(NULL) { - GoToBegin(); } CSourceHookImpl::CHookList::CIter::~CIter() { @@ -1044,7 +1222,7 @@ namespace SourceHook void CSourceHookImpl::CHookList::CIter::GoToBegin() { - m_Iter = m_pList->m_List.begin(); + m_Iter.GoToBegin(); SkipPaused(); } @@ -1052,7 +1230,7 @@ namespace SourceHook { if (!m_pList) return false; - return m_Iter == m_pList->m_List.end(); + return m_Iter.End();; } void CSourceHookImpl::CHookList::CIter::Next() { @@ -1067,7 +1245,7 @@ namespace SourceHook } void CSourceHookImpl::CHookList::CIter::SkipPaused() { - while (m_Iter != m_pList->m_List.end() && m_Iter->paused) + while (!m_Iter.End() && m_Iter->paused) ++m_Iter; } @@ -1085,6 +1263,9 @@ namespace SourceHook ////////////////////////////////////////////////////////////////////////// char *CSourceHookImpl::CProto::DupProto(const char *p) { + if (!p) + return NULL; + char *newproto; if (*p) { @@ -1105,6 +1286,9 @@ namespace SourceHook void CSourceHookImpl::CProto::FreeProto(char *prot) { + if (!prot) + return; + if (*prot) { delete [] prot; @@ -1117,6 +1301,9 @@ namespace SourceHook bool CSourceHookImpl::CProto::Equal(const char *p1, const char *p2) { + if (!p1 || !p2) + return false; + if (*p1 && *p2) // Case1: Both old { // As in old versions @@ -1209,4 +1396,68 @@ namespace SourceHook } } } + + ////////////////////////////////////////////////////////////////////////// + // CHookIDManager + ////////////////////////////////////////////////////////////////////////// + CSourceHookImpl::CHookIDManager::CHookIDManager() + { + } + + int CSourceHookImpl::CHookIDManager::New(const CProto &proto, int vtbl_offs, int vtbl_idx, void *vfnptr, + void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post) + { + Entry tmp(proto, vtbl_offs, vtbl_idx, vfnptr, adjustediface, plug, thisptr_offs, handler, post); + + size_t cursize = m_Entries.size(); + for (size_t i = 0; i < cursize; ++i) + { + if (m_Entries[i].isfree) + { + m_Entries[i] = tmp; + return static_cast(i) + 1; + } + } + + m_Entries.push_back(tmp); + return static_cast(m_Entries.size()); // return size() because hookid = id+1 anyway + } + + bool CSourceHookImpl::CHookIDManager::Remove(int hookid) + { + int realid = hookid - 1; + if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree) + return false; + + m_Entries[realid].isfree = true; + + // :TODO: remove free ids from back sometimes ?? + + return true; + } + + const CSourceHookImpl::CHookIDManager::Entry * CSourceHookImpl::CHookIDManager::QueryHook(int hookid) + { + int realid = hookid - 1; + if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree) + return NULL; + + return &m_Entries[realid]; + } + + void CSourceHookImpl::CHookIDManager::FindAllHooks(CVector &output, const CProto &proto, int vtbl_offs, + int vtbl_idx, void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post) + { + // oh my god, a lot of parameters... + size_t cursize = m_Entries.size(); + for (size_t i = 0; i < cursize; ++i) + { + if (!m_Entries[i].isfree && m_Entries[i].proto == proto && m_Entries[i].vtbl_offs == vtbl_offs && + m_Entries[i].vtbl_idx == vtbl_idx && m_Entries[i].adjustediface == adjustediface && m_Entries[i].plug == plug && + m_Entries[i].thisptr_offs == thisptr_offs && m_Entries[i].handler->IsEqual(handler) && m_Entries[i].post == post) + { + output.push_back(static_cast(i) + 1); + } + } + } } diff --git a/sourcehook/sourcehook.h b/sourcehook/sourcehook.h index 49e6813..a75e271 100644 --- a/sourcehook/sourcehook.h +++ b/sourcehook/sourcehook.h @@ -22,7 +22,14 @@ // 3 - Added "hook loop status variable" // 4 - Reentrant #define SH_IFACE_VERSION 4 -#define SH_IMPL_VERSION 3 + +// Impl versions: +// ??? +// 4 - addition of hook ids and vp hooks (with them, AddHookNew and RemoveHookNew) +// This is not a SH_IFACE_VERSION change so that old plugins continue working! +// 5 - addition of direct vp hooks (new hook mode; from now on AddHookNew checks for +// invalid hookmode -> impl version won't have to change because of things like this) +#define SH_IMPL_VERSION 5 // Hookman version: // 1 - Support for recalls, performance optimisations @@ -291,15 +298,12 @@ namespace SourceHook } }; - template struct CallClass + template struct DeprecatedCallClass { virtual B *GetThisPtr() = 0; virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; }; - typedef CallClass GenericCallClass; - typedef CallClass ManualCallClass; - // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) // - Today is an important day. // I'm adding support for functions which return references. @@ -401,14 +405,14 @@ namespace SourceHook * @param iface The interface pointer * @param size Size of the class instance */ - virtual GenericCallClass *GetCallClass(void *iface, size_t size) = 0; + virtual DeprecatedCallClass *GetCallClass(void *iface, size_t size) = 0; /** * @brief Release a callclass * * @param ptr Pointer to the callclass */ - virtual void ReleaseCallClass(GenericCallClass *ptr) = 0; + virtual void ReleaseCallClass(DeprecatedCallClass *ptr) = 0; virtual void SetRes(META_RES res) = 0; //!< Sets the meta result virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the @@ -479,7 +483,65 @@ namespace SourceHook virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; - //!< + /** + * @brief Modes for the new AddHook + */ + enum AddHookMode + { + Hook_Normal, + Hook_VP, + Hook_DVP + }; + + /** + * @brief Add a (VP) hook. + * + * @return non-zero hook id on success, 0 otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param mode Can be either Hook_Normal or Hook_VP (vtable-wide hook) + * @param iface The interface pointer + * @param ifacesize The size of the class iface points to + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual int AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post) = 0; + + /** + * @brief Remove a VP hook by ID. + * + * @return true on success, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param hookid The hook id (returned by AddHookNew) + */ + virtual bool RemoveHookByID(Plugin plug, int hookid) = 0; + + /** + * @brief Makes sure that hooks are going to be ignored on the next call of vfnptr + * + * @param plug The unique identifier of the plugin that calls this function + * @param vfnptr The virtual function pointer of the function in question + */ + virtual void SetIgnoreHooks(Plugin plug, void *vfnptr) = 0; + + /** + * @brief Reverses SetIgnoreHooks' effect + * + * @param plug The unique identifier of the plugin that calls this function + * @param vfnptr The virtual function pointer of the function in question + */ + virtual void ResetIgnoreHooks(Plugin plug, void *vfnptr) = 0; + + /** + * @brief Finds the original entry of a virtual function pointer + * + * @param vfnptr The virtual function pointer + * @return The original entry if the virtual function pointer has been patched; NULL otherwise. + */ + virtual void *GetOrigVfnPtrEntry(void *vfnptr) = 0; }; // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: @@ -510,6 +572,50 @@ namespace SourceHook return &ref; } }; + + // For source-level compatibility + template struct CallClass + { + T *ptr; + + CallClass(T *p) : ptr(p) + { + } + + operator T*() + { + return ptr; + } + }; + + typedef CallClass GenericCallClass; + typedef CallClass ManualCallClass; + + template + CallClass *GetCallClass(T *p) + { + return new CallClass(p); + } + + template + void ReleaseCallClass(CallClass *p) + { + delete p; + } + + template + void *GetOrigVfnPtrEntry(X *pInstance, MFP mfp, ISourceHook *pSH) + { + SourceHook::MemFuncInfo info = {true, -1, 0, 0}; + SourceHook::GetFuncInfo(pInstance, mfp, info); + + void *vfnptr = reinterpret_cast( + *reinterpret_cast(reinterpret_cast(pInstance) + info.thisptroffs + info.vtbloffs) + info.vtblindex); + + void *origentry = pSH->GetOrigVfnPtrEntry(vfnptr); + + return origentry ? origentry : *reinterpret_cast(vfnptr); + } } /************************************************************************/ @@ -614,31 +720,6 @@ namespace SourceHook RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ } while (0) -/** -* @brief Get/generate callclass for an interface pointer -* -* @param ifaceptr The interface pointer -*/ -template -inline SourceHook::CallClass *SH_GET_CALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), sizeof(ifacetype))); -} - -template -inline SourceHook::CallClass *SH_GET_MCALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr, int ifacesize) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), ifacesize)); -} - -template -inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::CallClass *ptr) -{ - shptr->ReleaseCallClass(reinterpret_cast(ptr)); -} - #define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ do { \ SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ @@ -647,41 +728,83 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ } while (0) -#define SH_GET_CALLCLASS(ptr) SH_GET_CALLCLASS_R(SH_GLOB_SHPTR, ptr) -#define SH_GET_MCALLCLASS(ptr, size) SH_GET_MCALLCLASS_R(SH_GLOB_SHPTR, reinterpret_cast(ptr), size) -#define SH_RELEASE_CALLCLASS(ptr) SH_RELEASE_CALLCLASS_R(SH_GLOB_SHPTR, ptr) + +#define SH_GET_ORIG_VFNPTR_ENTRY(inst, mfp) (SourceHook::GetOrigVfnPtrEntry(inst, mfp, SH_GLOB_SHPTR)) + +// For source-level compatibility + +#define SH_GET_CALLCLASS(ptr) SourceHook::GetCallClass(ptr) +#define SH_GET_MCALLCLASS(ptr, size) SourceHook::GetCallClass(reinterpret_cast(ptr)) +#define SH_RELEASE_CALLCLASS(ptr) SourceHook::ReleaseCallClass(ptr) + +// New ADD / REMOVE macros. +#define SH_STATIC(func) fastdelegate::MakeDelegate(func) +#define SH_MEMBER(inst, func) fastdelegate::MakeDelegate(inst, func) #define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ post, handler) -#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) #define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) -#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - + post, handler) #define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) #define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) + __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) +#define SH_ADD_VPHOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ + __SourceHook_FHVPAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ + post, handler, false) + +#define SH_ADD_DVPHOOK(ifacetype, ifacefunc, vtableptr, handler, post) \ + __SourceHook_FHVPAdd##ifacetype##ifacefunc(reinterpret_cast(vtableptr), \ + post, handler, true) + +#define SH_ADD_MANUALVPHOOK(hookname, ifaceptr, handler, post) \ + __SourceHook_FHMVPAdd##hookname(reinterpret_cast(ifaceptr), post, handler, false) + +#define SH_ADD_MANUALDVPHOOK(hookname, vtableptr, handler, post) \ + __SourceHook_FHMVPAdd##hookname(reinterpret_cast(vtableptr), post, handler, true) + +#define SH_REMOVE_HOOK_ID(hookid) \ + (SH_GLOB_SHPTR->RemoveHookByID(SH_GLOB_PLUGPTR, hookid)) + +// Old macros +// !! These are now deprecated. Instead, use one of these: +// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) + +// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) +#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) + +// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) + +// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) + +#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) +#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ + SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) #define SH_NOATTRIB @@ -716,6 +839,8 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C /* Verify interface version */ \ if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ return 1; \ + if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ + return 1; \ \ if (action == HA_GetInfo) \ { \ @@ -760,7 +885,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ - bool __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ + int __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ { \ using namespace ::SourceHook; \ @@ -769,10 +894,24 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ return false; /* No non-virtual functions / virtual inheritance supported */ \ \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, mfi.thisptroffs, \ SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ new CSHDelegate(handler), post); \ } \ + int __SourceHook_FHVPAdd##ifacetype##ifacefunc(void *iface, bool post, \ + SH_FHCls(ifacetype,ifacefunc,overload)::FD handler, bool direct) \ + { \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(funcptr, mfi); \ + if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ + return false; /* No non-virtual functions / virtual inheritance supported */ \ + \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ + direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ + iface, mfi.thisptroffs, SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ + new CSHDelegate(handler), post); \ + } \ bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ { \ @@ -811,6 +950,8 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C /* Verify interface version */ \ if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ return 1; \ + if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ + return 1; \ \ if (action == HA_GetInfo) \ { \ @@ -843,13 +984,21 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ - bool __SourceHook_FHMAdd##hookname(void *iface, bool post, \ + int __SourceHook_FHMAdd##hookname(void *iface, bool post, \ SH_MFHCls(hookname)::FD handler) \ { \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, pthisptroffs, \ SH_MFHCls(hookname)::HookManPubFunc, \ new ::SourceHook::CSHDelegate(handler), post); \ } \ + int __SourceHook_FHMVPAdd##hookname(void *iface, bool post, \ + SH_MFHCls(hookname)::FD handler, bool direct) \ + { \ + return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ + direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ + iface, pthisptroffs, SH_MFHCls(hookname)::HookManPubFunc, \ + new ::SourceHook::CSHDelegate(handler), post); \ + } \ bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ SH_MFHCls(hookname)::FD handler) \ { \ @@ -3007,1990 +3156,2063 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C ////////////////////////////////////////////////////////////////////////// // SH_CALL -#if SH_COMP == SH_COMP_MSVC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ +#define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ { \ using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = origfunc; \ - \ - void *adjustedthisptr = reinterpret_cast(reinterpret_cast(m_CC->GetThisPtr()) + mfi.thisptroffs); \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ + m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ + RetType tmpret = (m_ThisPtr->*m_MFP)call; \ + m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ + return tmpret; \ } -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ +#define SH_MAKE_EXECUTABLECLASS_OB_void(call, prms) \ { \ using namespace ::SourceHook; \ - char *adjustedthisptr = reinterpret_cast(m_CC->GetThisPtr()) + m_ThisPtrOffs; \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.addr) \ - u.addr = (*reinterpret_cast(adjustedthisptr + m_VtblOffs))[m_VtblIdx]; \ \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ + m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ + (m_ThisPtr->*m_MFP)call; \ + m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ } -#elif SH_COMP == SH_COMP_GCC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ - \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = origfunc; \ - u.s.adjustor = mfi.thisptroffs; \ - \ - return (reinterpret_cast(m_CC->GetThisPtr())->*u.mfpnew)call; \ -} - -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - char *thisptr = reinterpret_cast(m_CC->GetThisPtr()); \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.s.addr) \ - u.s.addr = (*reinterpret_cast(thisptr + m_ThisPtrOffs + m_VtblOffs))[m_VtblIdx]; \ - \ - u.s.adjustor = m_ThisPtrOffs; \ - return (reinterpret_cast(thisptr)->*u.mfpnew)call; \ -} - -#endif - namespace SourceHook { - - // Support for 0 arguments - template class ExecutableClass0 + // Call Class Wrapper! + template struct CCW { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass0(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()() const - SH_MAKE_EXECUTABLECLASS_OB((), ()) - - - template RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - + typedef T type; + + // Get Real Pointer! + static inline T *GRP(T *p) + { + return p; + } }; - template class MExecutableClass0 + template struct CCW< CallClass > { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; + typedef T type; + + // Get Real Pointer! + static inline T *GRP(CallClass *p) + { + return p->ptr; + } + }; + + + // Support for 0 arguments + template class ExecutableClass0 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - MExecutableClass0(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - + ExecutableClass0(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + RetType operator()() const - SH_MAKE_MEXECUTABLECLASS_OB((), ()) - + SH_MAKE_EXECUTABLECLASS_OB((), ()) + template RetType operator()(Param1 p1) const - SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) + SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass0 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass0(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()() const + SH_MAKE_EXECUTABLECLASS_OB_void((), ()) + + + template void operator()(Param1 p1) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1), (Param1)) + + template void operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 1 arguments - template class ExecutableClass1 + template class ExecutableClass1 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass1(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass1 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass1(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1) const - SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) - + SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) + template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass1 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1), (Param1)) + + + template void operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 2 arguments - template class ExecutableClass2 + template class ExecutableClass2 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass2(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass2(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass2 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass2(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass2 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass2(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 3 arguments - template class ExecutableClass3 + template class ExecutableClass3 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass3(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass3(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass3 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass3(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass3 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass3(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 4 arguments - template class ExecutableClass4 + template class ExecutableClass4 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass4(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass4(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass4 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass4(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass4 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass4(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 5 arguments - template class ExecutableClass5 + template class ExecutableClass5 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass5(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass5(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass5 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass5(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass5 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass5(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 6 arguments - template class ExecutableClass6 + template class ExecutableClass6 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass6(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass6(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass6 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass6(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass6 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass6(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 7 arguments - template class ExecutableClass7 + template class ExecutableClass7 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass7(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass7(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass7 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass7(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass7 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass7(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 8 arguments - template class ExecutableClass8 + template class ExecutableClass8 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass8(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass8(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass8 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass8(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass8 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass8(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 9 arguments - template class ExecutableClass9 + template class ExecutableClass9 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass9(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass9(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass9 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass9(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass9 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass9(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 10 arguments - template class ExecutableClass10 + template class ExecutableClass10 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass10(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass10(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass10 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass10(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass10 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass10(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 11 arguments - template class ExecutableClass11 + template class ExecutableClass11 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass11(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass11(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass11 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass11(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass11 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass11(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 12 arguments - template class ExecutableClass12 + template class ExecutableClass12 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass12(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass12(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass12 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass12(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass12 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass12(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 13 arguments - template class ExecutableClass13 + template class ExecutableClass13 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass13(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass13(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass13 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass13(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass13 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass13(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 14 arguments - template class ExecutableClass14 + template class ExecutableClass14 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass14(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass14(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass14 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass14(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass14 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass14(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 15 arguments - template class ExecutableClass15 + template class ExecutableClass15 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass15(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass15(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass15 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass15(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass15 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass15(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 16 arguments - template class ExecutableClass16 + template class ExecutableClass16 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass16(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass16(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass16 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass16(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass16 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass16(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 17 arguments - template class ExecutableClass17 + template class ExecutableClass17 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass17(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass17(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass17 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass17(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass17 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass17(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 18 arguments - template class ExecutableClass18 + template class ExecutableClass18 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass18(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass18(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass18 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass18(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass18 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass18(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 19 arguments - template class ExecutableClass19 + template class ExecutableClass19 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass19(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass19(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass19 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass19(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) }; + template class ExecutableClass19 + { + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; + public: + ExecutableClass19(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) + + + template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; + // Support for 20 arguments - template class ExecutableClass20 + template class ExecutableClass20 { - CCType *m_CC; - MFPType m_MFP; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - ExecutableClass20(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } + ExecutableClass20(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - + }; - template class MExecutableClass20 + template class ExecutableClass20 { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; + ObjType *m_ThisPtr; + void *m_VfnPtr; + MFP m_MFP; + ISourceHook *m_pSH; + Plugin m_Plug; public: - MExecutableClass20(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - + ExecutableClass20(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), + m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } + + void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const + SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) + + }; } +#define SH__CALL_GET_VFNPTR_NORMAL \ + using namespace ::SourceHook; \ + MemFuncInfo mfi = {true, -1, 0, 0}; \ + GetFuncInfo(CCW::GRP(ptr), mfp, mfi); \ + void *vfnptr = reinterpret_cast( \ + *reinterpret_cast(reinterpret_cast(ptr) + mfi.thisptroffs + mfi.vtbloffs) + mfi.vtblindex); + +#define SH__CALL_GET_VFNPTR_MANUAL \ + using namespace ::SourceHook; \ + void *vfnptr = reinterpret_cast( \ + *reinterpret_cast( (reinterpret_cast(CCW::GRP(ptr)) + thisptroffs + vtbloffs) ) + vtblidx); \ + /* patch mfp */ \ + *reinterpret_cast(&mfp) = *reinterpret_cast(vfnptr); + // SH_CALL needs to deduce the return type -> it uses templates and function overloading // That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP // The only purpose of the mfp2 parameter is to extract the return type @@ -4998,464 +5220,590 @@ namespace SourceHook // Support for 0 arguments template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()) +SourceHook::ExecutableClass0::type, MFP, RetType> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()const) +SourceHook::ExecutableClass0::type, MFP, RetType> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)()const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass0 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass0 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass0(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass0( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 1 arguments template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)) +SourceHook::ExecutableClass1::type, MFP, RetType, Param1> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const) +SourceHook::ExecutableClass1::type, MFP, RetType, Param1> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass1 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass1 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass1(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass1( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 2 arguments template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)) +SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const) +SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass2 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass2 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass2(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass2( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 3 arguments template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)) +SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const) +SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass3 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass3 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass3(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass3( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 4 arguments template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)) +SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const) +SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass4 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass4 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass4(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass4( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 5 arguments template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)) +SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const) +SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass5 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass5 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass5(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass5( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 6 arguments template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)) +SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const) +SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass6 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass6 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass6(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass6( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 7 arguments template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) +SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const) +SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass7 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass7 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass7(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass7( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 8 arguments template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) +SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const) +SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass8 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass8 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass8(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass8( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 9 arguments template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) +SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const) +SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass9 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass9 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass9(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass9( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 10 arguments template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) +SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const) +SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass10 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass10 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass10(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass10( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 11 arguments template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) +SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const) +SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass11 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass11 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass11(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass11( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 12 arguments template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) +SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const) +SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass12 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass12 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass12(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass12( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 13 arguments template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) +SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const) +SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass13 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass13 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass13(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass13( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 14 arguments template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) +SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const) +SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass14 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass14 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass14(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass14( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 15 arguments template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) +SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const) +SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass15 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass15 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass15(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass15( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 16 arguments template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) +SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const) +SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass16 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass16 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass16(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass16( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 17 arguments template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) +SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const) +SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass17 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass17 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass17(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass17( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 18 arguments template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) +SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const) +SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass18 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass18 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass18(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass18( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 19 arguments template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) +SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const) +SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass19 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass19 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass19(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass19( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } // Support for 20 arguments template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) +SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const) +SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } -template -SourceHook::MExecutableClass20 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs) +template +SourceHook::ExecutableClass20 +SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::MExecutableClass20(ptr, vtbloffs, vtblidx, thisptroffs); + SH__CALL_GET_VFNPTR_MANUAL + return SourceHook::ExecutableClass20( + reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); } @@ -5465,344 +5813,429 @@ SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Par // Support for 0 arguments template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)) +SourceHook::ExecutableClass0::type, MFP, RetType> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)const) +SourceHook::ExecutableClass0::type, MFP, RetType> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 1 arguments template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)) +SourceHook::ExecutableClass1::type, MFP, RetType, Param1> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const) +SourceHook::ExecutableClass1::type, MFP, RetType, Param1> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 2 arguments template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)) +SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const) +SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 3 arguments template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)) +SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const) +SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 4 arguments template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)) +SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const) +SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 5 arguments template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)) +SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const) +SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 6 arguments template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)) +SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const) +SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 7 arguments template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)) +SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const) +SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 8 arguments template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)) +SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const) +SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 9 arguments template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)) +SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const) +SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 10 arguments template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)) +SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const) +SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 11 arguments template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)) +SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const) +SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 12 arguments template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)) +SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const) +SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 13 arguments template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)) +SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const) +SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 14 arguments template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)) +SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const) +SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 15 arguments template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)) +SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const) +SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 16 arguments template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)) +SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const) +SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 17 arguments template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)) +SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const) +SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 18 arguments template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)) +SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const) +SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 19 arguments template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)) +SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const) +SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } // Support for 20 arguments template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)) +SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const) +SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> +SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); + SH__CALL_GET_VFNPTR_NORMAL + return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), + mfp, vfnptr, shptr, plug); } #endif -#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp)) +#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) +#define SH_MCALL2(ptr, mfp, vtblidx, vtbloffs, thisptroffs) SH_MCALL3((ptr), (mfp), (mfp), (vtblidx), (vtbloffs), (thisptroffs), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) #define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) diff --git a/sourcehook/sourcehook_impl.h b/sourcehook/sourcehook_impl.h index eee3ad6..ac1c5fd 100644 --- a/sourcehook/sourcehook_impl.h +++ b/sourcehook/sourcehook_impl.h @@ -16,6 +16,7 @@ #include "sh_vector.h" #include "sh_tinyhash.h" #include "sh_stack.h" +#include "sh_listcat.h" /* @@ -89,6 +90,9 @@ Hooks --------------------------------------- Call classes + + !! deprecated !! - see below (new SH_CALL) + Call classes are identified by a this pointer and an instance size We use the instance size because a derived class instance and a base class instance could @@ -142,6 +146,28 @@ Return Values in Post Recalls HookLoopEnd we make sure that status is high enough so that the override return will be returned. crazy. All this stuff could be much less complicated if I didn't try to preserve binary compatibility :) + +VP Hooks + VP hooks are hooks which are called on a vfnptr, regardless of the this pointer with which it was called. They are + implemented as a special CIface instance with m_Ptr = NULL. All Hook Lists have a new "ListCatIterator" which + virtually concatenates the NULL-interface-hook-list with their normal hook list. + + + I'm afraid that with the addition of Recalls and VP Hooks, SourceHook is now a pretty complex and hacked-together + binary compatible beast which is pretty hard to maintain unless you've written it :) + +New SH_CALL + The addition of VP hooks messed up the Call Classes concept (see above) - call classes are bound to an + instance pointer; they only work on one of the hooked instances. But VP hooks are called on all instances. + + That's why now, SH_CALL takes an instance pointer instead of a callclass pointer. It basically does this: + 1) call SH_GLOB_PTR->SetIgnoreHooks(vfnptr) + 2) call this->*mfp + 3) call SH_GLOB_PTR->ResetIgnoreHooks(vfnptr) + + SourceHook stroes the "ignored vfnptr" and makes CVfnPtr::FindIface return NULL if the CVfnPtr instance + corresponds to the ignored vfnptr. This way the hook manager thinks that the instance isn't hooked, and calls + the original function. Everything works fine. This works even for VP hooks. */ namespace SourceHook @@ -160,6 +186,10 @@ namespace SourceHook char *DupProto(const char *src); void FreeProto(char *prot); public: + CProto() : m_Proto(NULL) + { + } + CProto(const char *szProto) : m_Proto(DupProto(szProto)) { } @@ -192,6 +222,11 @@ namespace SourceHook { return Equal(other.m_Proto, m_Proto); } + + const char *GetProto() const + { + return m_Proto; + } }; @@ -226,17 +261,79 @@ namespace SourceHook HookManagerPubFunc hookman; }; + // Associates hook ids with info about the hooks + // Also used to keep track of used hook ids + class CHookIDManager + { + public: + struct Entry + { + bool isfree; + + // hookman info + CProto proto; + int vtbl_offs; + int vtbl_idx; + + // vfnptr + void *vfnptr; + + // iface + void* adjustediface; + + // hook + Plugin plug; + int thisptr_offs; + ISHDelegate *handler; + bool post; + + Entry(const CProto &pprt, int pvo, int pvi, void *pvp, void *pai, Plugin pplug, int pto, + ISHDelegate *ph, bool ppost) + : isfree(false), proto(pprt), vtbl_offs(pvo), vtbl_idx(pvi), vfnptr(pvp), + adjustediface(pai), plug(pplug), thisptr_offs(pto), handler(ph), post(ppost) + { + } + Entry() + { + } + }; + private: + // Internally, hookid 1 is stored as m_Entries[0] + + CVector m_Entries; + public: + CHookIDManager(); + int New(const CProto &proto, int vtbl_offs, int vtbl_idx, void *vfnptr, void *adjustediface, + Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post); + bool Remove(int hookid); + const Entry * QueryHook(int hookid); + + // Finds all hooks with the given info, and fills the hookids into output. + void FindAllHooks(CVector &output, const CProto &proto, int vtbl_offs, int vtbl_idx, + void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post); + + // Removes all hooks with a specified vfnptr + bool RemoveAll(void *vfnptr); + }; + struct HookInfo { ISHDelegate *handler; //!< Pointer to the handler bool paused; //!< If true, the hook should not be executed Plugin plug; //!< The owner plugin int thisptr_offs; //!< This pointer offset + int hookid; //!< Unique ID given by CHookIDManager + + bool operator==(int otherid) + { + return hookid == otherid; + } }; class CHookList : public IHookList { public: + List *m_VPList; // left-hand list for ListCatIterator -> for VP hooks List m_List; friend class CIter; @@ -250,7 +347,7 @@ namespace SourceHook void SkipPaused(); public: - List::iterator m_Iter; + ListCatIterator m_Iter; CIter(CHookList *pList); @@ -293,6 +390,9 @@ namespace SourceHook IIter *GetIter(); void ReleaseIter(IIter *pIter); + + void SetVPList(List *newList); + void ClearVPList(); }; // I know, data hiding... But I'm a lazy bastard! @@ -315,6 +415,10 @@ namespace SourceHook { return m_Ptr == ptr; } + bool operator!=(void *ptr) + { + return m_Ptr != ptr; + } }; class CVfnPtr : public IVfnPtr @@ -328,8 +432,9 @@ namespace SourceHook IfaceList m_Ifaces; + void **m_pOneIgnore; public: - CVfnPtr(void *ptr); + CVfnPtr(void *ptr, void **pOneIgnore); virtual ~CVfnPtr(); void *GetVfnPtr(); @@ -446,7 +551,7 @@ namespace SourceHook void AddHookManager(Plugin plug, const CHookManagerInfo &hookman); }; - class CCallClassImpl : public GenericCallClass + class CCallClassImpl : public DeprecatedCallClass { public: @@ -520,6 +625,10 @@ namespace SourceHook void SetPluginPaused(Plugin plug, bool paused); HookLoopInfoStack m_HLIStack; + CHookIDManager m_HookIDMan; + + void *m_OneIgnore; //:TODO: + bool m_IgnoreActive; public: CSourceHookImpl(); virtual ~CSourceHookImpl(); @@ -608,14 +717,14 @@ namespace SourceHook * @param iface The interface pointer * @param size Size of the class instance */ - GenericCallClass *GetCallClass(void *iface, size_t size); + DeprecatedCallClass *GetCallClass(void *iface, size_t size); /** * @brief Release a callclass * * @param ptr Pointer to the callclass */ - virtual void ReleaseCallClass(GenericCallClass *ptr); + virtual void ReleaseCallClass(DeprecatedCallClass *ptr); virtual void SetRes(META_RES res); //!< Sets the meta result virtual META_RES GetPrevRes(); //!< Gets the meta result of the previously called handler @@ -650,6 +759,58 @@ namespace SourceHook virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr); + + /** + * @brief Add a (VP) hook. + * + * @return non-zero hook id on success, 0 otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param mode Can be either Hook_Normal or Hook_VP (vtable-wide hook) + * @param iface The interface pointer + * The representative interface pointer for VP hooks + * The vtable pointer for direct VP hooks !!! + * @param ifacesize The size of the class iface points to + * @param myHookMan A hook manager function that should be capable of handling the function + * @param handler A pointer to a FastDelegate containing the hook handler + * @param post Set to true if you want a post handler + */ + virtual int AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, + ISHDelegate *handler, bool post); + + /** + * @brief Remove a VP hook by ID. + * + * @return true on success, false otherwise + * + * @param plug The unique identifier of the plugin that calls this function + * @param hookid The hook id (returned by AddHookNew) + */ + virtual bool RemoveHookByID(Plugin plug, int hookid); + + /** + * @brief Makes sure that hooks are going to be ignored on the next call of vfnptr + * + * @param plug The unique identifier of the plugin that calls this function + * @param vfnptr The virtual function pointer of the function in question + */ + virtual void SetIgnoreHooks(Plugin plug, void *vfnptr); + + /** + * @brief Reverses SetIgnoreHooks' effect + * + * @param plug The unique identifier of the plugin that calls this function + * @param vfnptr The virtual function pointer of the function in question + */ + virtual void ResetIgnoreHooks(Plugin plug, void *vfnptr); + + /** + * @brief Finds the original entry of a virtual function pointer + * + * @param vfnptr The virtual function pointer + * @return The original entry if the virtual function pointer has been patched; NULL otherwise. + */ + virtual void *GetOrigVfnPtrEntry(void *vfnptr); }; } diff --git a/sourcehook/test/main.cpp b/sourcehook/test/main.cpp index 12a4706..aa0147d 100644 --- a/sourcehook/test/main.cpp +++ b/sourcehook/test/main.cpp @@ -80,6 +80,7 @@ DO_TEST(Recall); DO_TEST(Multi); DO_TEST(Ref); DO_TEST(RefRet); +DO_TEST(VPHooks); int main(int argc, char *argv[]) { diff --git a/sourcehook/test/msvc7/test.vcproj b/sourcehook/test/msvc7/test.vcproj index 1f9496a..be61217 100644 --- a/sourcehook/test/msvc7/test.vcproj +++ b/sourcehook/test/msvc7/test.vcproj @@ -289,6 +289,12 @@ + + + + + + + + + + diff --git a/sourcehook/test/test1.cpp b/sourcehook/test/test1.cpp index 6b99ea4..d55e7af 100644 --- a/sourcehook/test/test1.cpp +++ b/sourcehook/test/test1.cpp @@ -338,6 +338,11 @@ namespace } }; + // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! + class Whatever : public Test + { + }; + SH_DECL_HOOK1(Test, F299, SH_NOATTRIB, 0, bool, const char *); SH_DECL_HOOK0_void(Test, F1, SH_NOATTRIB, 0); SH_DECL_HOOK0_void(Test, F2, SH_NOATTRIB, 0); @@ -416,52 +421,46 @@ bool TestBasic(std::string &error) g_PLID = 1337; HandlersF1 f1_handlers; - Test test; + Whatever test; Test *pTest = &test; - // 1) Get a call class and call the member through it and normally - SourceHook::CallClass *cc = SH_GET_CALLCLASS(pTest); + // 1) SH_CALL it and call it normally - ADD_STATE(State_F1_CallClassGenerated); + return true; + SH_CALL(pTest, &Test::F1)(); + - SH_CALL(cc, &Test::F1)(); pTest->F1(); CHECK_STATES((&g_States, - new State_F1_CallClassGenerated, new State_F1_Called, new State_F1_Called, NULL), "Part 1"); // 2) Request a call class again - SourceHook::CallClass *cc2 = SH_GET_CALLCLASS(pTest); - ADD_STATE(State_F1_CallClassGenerated); - SH_CALL(cc, &Test::F1)(); - SH_CALL(cc2, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); - SH_RELEASE_CALLCLASS(cc2); - ADD_STATE(State_F1_CallClassReleased); - - SH_CALL(cc, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); CHECK_STATES((&g_States, - new State_F1_CallClassGenerated, new State_F1_Called, new State_F1_Called, new State_F1_Called, - new State_F1_CallClassReleased, + new State_F1_Called, new State_F1_Called, NULL), "Part 2"); // 3) Add a pre hook + // (one add memfunc in old format) g_F1Pre_WhatToDo = MRES_SUPERCEDE; - ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false))); + ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false) ? true : false)); - SH_CALL(cc, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); CHECK_STATES((&g_States, @@ -470,30 +469,26 @@ bool TestBasic(std::string &error) new State_F1_PreHandler_Called(&f1_handlers), NULL), "Part 3"); - // 4) Rerequest the callclass - SH_RELEASE_CALLCLASS(cc); + // 4) Test source-level compat with callclasses + SourceHook::CallClass *pCC = SH_GET_CALLCLASS(pTest); - ADD_STATE(State_F1_CallClassReleased); - cc2 = SH_GET_CALLCLASS(pTest); - ADD_STATE(State_F1_CallClassGenerated); - - SH_CALL(cc, &Test::F1)(); + SH_CALL(pCC, &Test::F1)(); pTest->F1(); + SH_RELEASE_CALLCLASS(pCC); + CHECK_STATES((&g_States, - new State_F1_CallClassReleased, - new State_F1_CallClassGenerated, new State_F1_Called, new State_F1_PreHandler_Called(&f1_handlers), NULL), "Part 4"); // 5) Check ignore / supercede g_F1Pre_WhatToDo = MRES_SUPERCEDE; - SH_CALL(cc, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); g_F1Pre_WhatToDo = MRES_IGNORED; - SH_CALL(cc, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); CHECK_STATES((&g_States, @@ -505,10 +500,11 @@ bool TestBasic(std::string &error) NULL), "Part 5"); // 6) remove the hook again + // (one remove memfunc in old format) SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false); ADD_STATE(State_F1_HookRemoved); - SH_CALL(cc, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); CHECK_STATES((&g_States, @@ -519,9 +515,9 @@ bool TestBasic(std::string &error) // 7) add a post hook now g_F1Post_WhatToDo = MRES_IGNORED; - ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Post, true))); + ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Post), true) ? true : false)); - SH_CALL(cc, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); CHECK_STATES((&g_States, @@ -533,13 +529,13 @@ bool TestBasic(std::string &error) // 8) And a pre hook again g_F1Pre_WhatToDo = MRES_IGNORED; - ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false))); + ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false) ? true : false)); - SH_CALL(cc, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); g_F1Pre_WhatToDo = MRES_SUPERCEDE; - SH_CALL(cc, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); CHECK_STATES((&g_States, @@ -554,12 +550,12 @@ bool TestBasic(std::string &error) NULL), "Part 8"); // 9) Remove all hooks - SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_REMOVE_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); ADD_STATE(State_F1_HookRemoved); - SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Post, true); + SH_REMOVE_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Post), true); ADD_STATE(State_F1_HookRemoved); - SH_CALL(cc, &Test::F1)(); + SH_CALL(pTest, &Test::F1)(); pTest->F1(); CHECK_STATES((&g_States, @@ -574,7 +570,7 @@ bool TestBasic(std::string &error) g_F299Pre_WhatToRet = false; ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); CHECK_STATES((&g_States, new State_F299_Called("hi"), @@ -583,9 +579,10 @@ bool TestBasic(std::string &error) new State_F299Ret(true), NULL), "Part 10.1"); + // (one add staticfunc in old format) SH_ADD_HOOK_STATICFUNC(Test, F299, pTest, F299_Pre, false); ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); CHECK_STATES((&g_States, new State_F299_PreHandlerCalled("hi"), @@ -595,9 +592,9 @@ bool TestBasic(std::string &error) new State_F299Ret(true), NULL), "Part 10.2"); - SH_ADD_HOOK_STATICFUNC(Test, F299, pTest, F299_Post, true); + SH_ADD_HOOK(Test, F299, pTest, SH_STATIC(F299_Post), true); ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); CHECK_STATES((&g_States, new State_F299_PreHandlerCalled("hi"), @@ -610,7 +607,7 @@ bool TestBasic(std::string &error) g_F299Pre_WhatToDo = MRES_OVERRIDE; ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); CHECK_STATES((&g_States, new State_F299_PreHandlerCalled("hi"), @@ -623,7 +620,7 @@ bool TestBasic(std::string &error) g_F299Pre_WhatToDo = MRES_SUPERCEDE; ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); CHECK_STATES((&g_States, new State_F299_PreHandlerCalled("hi"), @@ -633,9 +630,10 @@ bool TestBasic(std::string &error) new State_F299Ret(true), NULL), "Part 10.5"); + // (one remove staticfunc in old format) SH_REMOVE_HOOK_STATICFUNC(Test, F299, pTest, F299_Pre, false); ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); CHECK_STATES((&g_States, new State_F299_Called("hi"), @@ -645,9 +643,9 @@ bool TestBasic(std::string &error) new State_F299Ret(true), NULL), "Part 10.6"); - SH_REMOVE_HOOK_STATICFUNC(Test, F299, pTest, F299_Post, true); + SH_REMOVE_HOOK(Test, F299, pTest, SH_STATIC(F299_Post), true); ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); + ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); CHECK_STATES((&g_States, new State_F299_Called("hi"), @@ -656,39 +654,59 @@ bool TestBasic(std::string &error) new State_F299Ret(true), NULL), "Part 10.7"); - // 11) Release callclass - SH_RELEASE_CALLCLASS(cc); - ADD_STATE(State_F1_CallClassReleased); + // 11 1/2) Test removing hook by id + + g_F1Pre_WhatToDo = MRES_IGNORED; + + pTest->F1(); + int hookPre = SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + int hookPost = SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Post), true); + + pTest->F1(); + SH_REMOVE_HOOK_ID(hookPost); + pTest->F1(); + SH_REMOVE_HOOK_ID(hookPre); + pTest->F1(); CHECK_STATES((&g_States, - new State_F1_CallClassReleased, - NULL), "Part 11"); + new State_F1_Called, + + new State_F1_PreHandler_Called(&f1_handlers), + new State_F1_Called, + new State_F1_PostHandler_Called(&f1_handlers), + + new State_F1_PreHandler_Called(&f1_handlers), + new State_F1_Called, + + new State_F1_Called, + + NULL), "Part 11 1/2"); // 12) Test? Test. - SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_ADD_HOOK_MEMFUNC(Test, F2, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_ADD_HOOK_MEMFUNC(Test, F3, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F4, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_ADD_HOOK_MEMFUNC(Test, F5, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F6, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_ADD_HOOK_MEMFUNC(Test, F7, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F8, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F9, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F10, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); + SH_ADD_HOOK(Test, F2, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); + SH_ADD_HOOK(Test, F3, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_ADD_HOOK(Test, F4, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); + SH_ADD_HOOK(Test, F5, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_ADD_HOOK(Test, F6, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); + SH_ADD_HOOK(Test, F7, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_ADD_HOOK(Test, F8, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_ADD_HOOK(Test, F9, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_ADD_HOOK(Test, F10, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_REMOVE_HOOK_MEMFUNC(Test, F2, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_REMOVE_HOOK_MEMFUNC(Test, F3, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F4, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_REMOVE_HOOK_MEMFUNC(Test, F5, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F6, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_REMOVE_HOOK_MEMFUNC(Test, F7, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F8, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F9, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F10, pTest, &f1_handlers, &HandlersF1::Pre, false); + SH_REMOVE_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); + SH_REMOVE_HOOK(Test, F2, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); + SH_REMOVE_HOOK(Test, F3, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_REMOVE_HOOK(Test, F4, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); + SH_REMOVE_HOOK(Test, F5, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_REMOVE_HOOK(Test, F6, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); + SH_REMOVE_HOOK(Test, F7, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_REMOVE_HOOK(Test, F8, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_REMOVE_HOOK(Test, F9, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); + SH_REMOVE_HOOK(Test, F10, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_ADD_HOOK_STATICFUNC(Test, F60, pTest, F60_Pre, false); + SH_ADD_HOOK(Test, F60, pTest, SH_STATIC(F60_Pre), false); int a = 0; pTest->F60(a); diff --git a/sourcehook/test/test2.cpp b/sourcehook/test/test2.cpp index 1164e0f..46c988c 100644 --- a/sourcehook/test/test2.cpp +++ b/sourcehook/test/test2.cpp @@ -50,6 +50,11 @@ namespace } }; + // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! + class Whatever : public IGaben + { + }; + SH_DECL_HOOK0_void(IGaben, EatYams, SH_NOATTRIB, 0); SH_DECL_HOOK1(IGaben, EatYams, const, 1, bool, const char *); SH_DECL_HOOK2_void_vafmt(IGaben, Vafmt1, SH_NOATTRIB, 0, bool, int); @@ -92,14 +97,12 @@ bool TestVafmtAndOverload(std::string &error) GET_SHPTR(g_SHPtr); g_PLID = 1337; - IGaben gabgab; + Whatever gabgab; IGaben *pGab = &gabgab; - SourceHook::CallClass *cc = SH_GET_CALLCLASS(pGab); - // Part 1 - SH_CALL(cc, static_cast(&IGaben::EatYams))(); - SH_CALL(cc, static_cast(&IGaben::EatYams))("Here!"); + SH_CALL(pGab, static_cast(&IGaben::EatYams))(); + SH_CALL(pGab, static_cast(&IGaben::EatYams))("Here!"); SH_ADD_HOOK(IGaben, EatYams, pGab, EatYams0_Handler, false); SH_ADD_HOOK(IGaben, EatYams, pGab, EatYams1_Handler, false); @@ -121,9 +124,9 @@ bool TestVafmtAndOverload(std::string &error) // Part 2 pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); - SH_CALL(cc, &IGaben::Vafmt1)(true, 55, "Hello %s%d%s", "BA", 1, "L"); + SH_CALL(pGab, &IGaben::Vafmt1)(true, 55, "Hello %s%d%s", "BA", 1, "L"); pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); - SH_CALL(cc, &IGaben::Vafmt2)("Hello %s%d%s", "BA", 1, "LOPAN"); + SH_CALL(pGab, &IGaben::Vafmt2)("Hello %s%d%s", "BA", 1, "LOPAN"); CHECK_STATES((&g_States, new State_Vafmt_Called(1, "Hello BA1L"), @@ -165,7 +168,5 @@ bool TestVafmtAndOverload(std::string &error) new State_Vafmt_Called(2, "Hello BA1LOPAN"), NULL), "Part 4"); - SH_RELEASE_CALLCLASS(cc); - return true; } diff --git a/sourcehook/test/test3.cpp b/sourcehook/test/test3.cpp index 97d04c2..f78d61c 100644 --- a/sourcehook/test/test3.cpp +++ b/sourcehook/test/test3.cpp @@ -47,6 +47,8 @@ namespace } }; + class DerivedDerived : public Derived { }; + SH_DECL_HOOK0_void(Derived, Func1, SH_NOATTRIB, 0); SH_DECL_HOOK0_void(Derived, Func2, SH_NOATTRIB, 0); SH_DECL_HOOK0_void(Derived, Func3, SH_NOATTRIB, 0); @@ -72,7 +74,7 @@ bool TestThisPtrOffs(std::string &error) GET_SHPTR(g_SHPtr); g_PLID = 1337; - Derived inst; + DerivedDerived inst; Derived *pD = &inst; Base1 *pB1 = pD; Base2 *pB2 = pD; @@ -85,11 +87,10 @@ bool TestThisPtrOffs(std::string &error) // Get a callclass for pD // Verify whether the this pointers are correct // Also call them normally to make sure that we aren't messing it up ;) - SourceHook::CallClass *pD_CC = SH_GET_CALLCLASS(pD); - SH_CALL(pD_CC, &Derived::Func1)(); - SH_CALL(pD_CC, &Derived::Func2)(); - SH_CALL(pD_CC, &Derived::Func3)(); + SH_CALL(pD, &Derived::Func1)(); + SH_CALL(pD, &Derived::Func2)(); + SH_CALL(pD, &Derived::Func3)(); pD->Func1(); pD->Func2(); pD->Func3(); @@ -103,8 +104,8 @@ bool TestThisPtrOffs(std::string &error) new State_Func3_Called(pD), NULL), "Part 1"); - SH_CALL(pD_CC, &Base1::Func1)(); - SH_CALL(pD_CC, &Base2::Func2)(); + SH_CALL(pD, &Base1::Func1)(); + SH_CALL(pD, &Base2::Func2)(); CHECK_STATES((&g_States, new State_Func1_Called(pB1), @@ -114,11 +115,8 @@ bool TestThisPtrOffs(std::string &error) // 2) // Get callclasses for the other ones and verify it as well - SourceHook::CallClass *pB1_CC = SH_GET_CALLCLASS(pB1); - SourceHook::CallClass *pB2_CC = SH_GET_CALLCLASS(pB2); - - SH_CALL(pB1_CC, &Base1::Func1)(); - SH_CALL(pB2_CC, &Base2::Func2)(); + SH_CALL(pB1, &Base1::Func1)(); + SH_CALL(pB2, &Base2::Func2)(); CHECK_STATES((&g_States, new State_Func1_Called(pB1), @@ -129,9 +127,9 @@ bool TestThisPtrOffs(std::string &error) // 3) Add hooks on them (referring to them through pD1 / Derived) // Check whether the hooks are called with the correct this pointer - SH_ADD_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + SH_ADD_HOOK(Derived, Func1, pD, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(Derived, Func2, pD, SH_STATIC(Handler_Func2), false); + SH_ADD_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); pD->Func1(); pD->Func2(); @@ -153,17 +151,17 @@ bool TestThisPtrOffs(std::string &error) new State_Func2_Called(pB2), NULL), "Part 3"); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + SH_REMOVE_HOOK(Derived, Func1, pD, SH_STATIC(Handler_Func1), false); + SH_REMOVE_HOOK(Derived, Func2, pD, SH_STATIC(Handler_Func2), false); + SH_REMOVE_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); // 4) // Now add the hooks on Base1 and Base2 and check again // Note that the new implicit_cast should convert the pD to Base1*/Base2* :) - SH_ADD_HOOK_STATICFUNC(Base1, Func1, pD, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Base2, Func2, pD, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + SH_ADD_HOOK(Base1, Func1, pD, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(Base2, Func2, pD, SH_STATIC(Handler_Func2), false); + SH_ADD_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); pD->Func1(); pD->Func2(); @@ -186,18 +184,18 @@ bool TestThisPtrOffs(std::string &error) new State_Func2_Called(pB2), NULL), "Part 4"); - SH_REMOVE_HOOK_STATICFUNC(Base1, Func1, pD, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(Base2, Func2, pD, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + SH_REMOVE_HOOK(Base1, Func1, pD, SH_STATIC(Handler_Func1), false); + SH_REMOVE_HOOK(Base2, Func2, pD, SH_STATIC(Handler_Func2), false); + SH_REMOVE_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); // 5) // Add some hooks, and use callclasses // 5.1) First off, add all of them on pD - SH_ADD_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); + SH_ADD_HOOK(Derived, Func1, pD, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(Derived, Func2, pD, SH_STATIC(Handler_Func2), false); + SH_ADD_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); pD->Func1(); pD->Func2(); @@ -212,11 +210,11 @@ bool TestThisPtrOffs(std::string &error) new State_Func3_Called(pD), NULL), "Part 5.1"); - SH_CALL(pD_CC, &Derived::Func1)(); - SH_CALL(pD_CC, &Derived::Func2)(); - SH_CALL(pD_CC, &Derived::Func3)(); - SH_CALL(pB1_CC, &Base1::Func1)(); - SH_CALL(pB2_CC, &Base2::Func2)(); + SH_CALL(pD, &Derived::Func1)(); + SH_CALL(pD, &Derived::Func2)(); + SH_CALL(pD, &Derived::Func3)(); + SH_CALL(pB1, &Base1::Func1)(); + SH_CALL(pB2, &Base2::Func2)(); CHECK_STATES((&g_States, new State_Func1_Called(pB1), @@ -226,13 +224,9 @@ bool TestThisPtrOffs(std::string &error) new State_Func2_Called(pB2), NULL), "Part 5.2"); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); - - SH_RELEASE_CALLCLASS(pB1_CC); - SH_RELEASE_CALLCLASS(pB2_CC); - SH_RELEASE_CALLCLASS(pD_CC); + SH_REMOVE_HOOK(Derived, Func1, pD, SH_STATIC(Handler_Func1), false); + SH_REMOVE_HOOK(Derived, Func2, pD, SH_STATIC(Handler_Func2), false); + SH_REMOVE_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); return true; } diff --git a/sourcehook/test/test4.cpp b/sourcehook/test/test4.cpp index f2b0a88..483cab5 100644 --- a/sourcehook/test/test4.cpp +++ b/sourcehook/test/test4.cpp @@ -40,6 +40,11 @@ namespace } }; + // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! + class Whatever : public Test + { + }; + SH_DECL_HOOK0_void(Test, Func1, SH_NOATTRIB, 0); SH_DECL_HOOK0_void(Test, Func2, SH_NOATTRIB, 0); SH_DECL_HOOK0_void(Test, Func3, SH_NOATTRIB, 0); @@ -63,14 +68,14 @@ bool TestPlugSys(std::string &error) GET_SHPTR(g_SHPtr); g_PLID = 1; - Test inst; + Whatever inst; Test *pInst = &inst; // 1) // Add hooks, then issue a complete shutdown - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); + SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); pInst->Func1(); pInst->Func2(); @@ -101,23 +106,23 @@ bool TestPlugSys(std::string &error) // Add hooks from "different plugins", then shutdown the plugins g_PLID = 1; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); + SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); g_PLID = 2; - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); g_PLID = 3; - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); g_PLID = 1; - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); + SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); g_PLID = 2; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); g_PLID = 3; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); pInst->Func1(); pInst->Func2(); @@ -237,23 +242,23 @@ bool TestPlugSys(std::string &error) // Add hooks from "different plugins", then pause the plugins g_PLID = 1; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); + SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); g_PLID = 2; - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); g_PLID = 3; - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); g_PLID = 1; - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); + SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); g_PLID = 2; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); + SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); g_PLID = 3; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); + SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); pInst->Func1(); pInst->Func2(); diff --git a/sourcehook/test/testbail.cpp b/sourcehook/test/testbail.cpp index d86f0c3..46f7b9d 100644 --- a/sourcehook/test/testbail.cpp +++ b/sourcehook/test/testbail.cpp @@ -44,7 +44,7 @@ bool TestBail(std::string &error) g_Gabgab = new IGaben; - SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); + SH_ADD_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler1), false); ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); @@ -75,7 +75,7 @@ bool TestBail(std::string &error) new State_EatYams_Return(5), NULL), "Part 3"); - SH_REMOVE_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); + SH_REMOVE_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler1), false); ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); @@ -97,7 +97,7 @@ bool TestBail(std::string &error) new State_EatYams_Called(0xBEEF), NULL), "Part 5"); - SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); + SH_ADD_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler1), false); ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); diff --git a/sourcehook/test/testbail2.cpp b/sourcehook/test/testbail2.cpp index 3c5db52..d3f7f28 100644 --- a/sourcehook/test/testbail2.cpp +++ b/sourcehook/test/testbail2.cpp @@ -24,8 +24,8 @@ namespace N_TestBail { g_PLID = 2; - SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler2, false); - SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler3, false); + SH_ADD_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler2), false); + SH_ADD_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler3), false); int ret = g_Gabgab->EatYams(0xDEAD); diff --git a/sourcehook/test/testmanual.cpp b/sourcehook/test/testmanual.cpp index 0d1013a..ad89f43 100644 --- a/sourcehook/test/testmanual.cpp +++ b/sourcehook/test/testmanual.cpp @@ -52,6 +52,11 @@ namespace { ADD_STATE(State_Func5_Called(reinterpret_cast(this))); } + + }; + // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! + class Whatever : public TheWall + { }; SH_DECL_HOOK0_void(TheWall, Func1, SH_NOATTRIB, 0); @@ -106,11 +111,9 @@ bool TestManual(std::string &error) GET_SHPTR(g_SHPtr); g_PLID = 1337; - TheWall inst; + Whatever inst; TheWall *p = &inst; - SourceHook::ManualCallClass *cc = SH_GET_MCALLCLASS(p, sizeof(void*)); - // 1) // Call each function p->Func1(); @@ -129,14 +132,14 @@ bool TestManual(std::string &error) // 1.1) // Now call each function through the manual call class, using the hook decl and manually - SH_MCALL(cc, TheWall_Func1)(); - SH_MCALL2(cc, MFP_Func1(), 0, 0, 0)(); - SH_MCALL(cc, TheWall_Func2)(200); - SH_MCALL2(cc, MFP_Func2(), 1, 0, 0)(200); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func3)())); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func3(), 2, 0, 0)())); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func4)(400))); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func4(), 3, 0, 0)(400))); + SH_MCALL(p, TheWall_Func1)(); + SH_MCALL2(p, MFP_Func1(), 0, 0, 0)(); + SH_MCALL(p, TheWall_Func2)(200); + SH_MCALL2(p, MFP_Func2(), 1, 0, 0)(200); + ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func3)())); + ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func3(), 2, 0, 0)())); + ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func4)(400))); + ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func4(), 3, 0, 0)(400))); CHECK_STATES((&g_States, new State_Func1_Called(p), @@ -153,12 +156,23 @@ bool TestManual(std::string &error) new State_Return(4), NULL), "Part 1.1"); + // Compat: really get a manual call class! + SourceHook::ManualCallClass *pCC = SH_GET_MCALLCLASS(p, sizeof(void*)); + SH_MCALL(pCC, TheWall_Func1)(); + SH_MCALL2(pCC, MFP_Func1(), 0, 0, 0)(); + CHECK_STATES((&g_States, + new State_Func1_Called(p), + new State_Func1_Called(p), + NULL), "Part 1.2"); + + SH_RELEASE_CALLCLASS(pCC); + // 2) // Hook each function normally, call them - SH_ADD_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); + SH_ADD_HOOK(TheWall, Func1, p, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(TheWall, Func2, p, SH_STATIC(Handler_Func2), false); + SH_ADD_HOOK(TheWall, Func3, p, SH_STATIC(Handler_Func3), false); + SH_ADD_HOOK(TheWall, Func4, p, SH_STATIC(Handler_Func4), false); p->Func1(); p->Func2(200); @@ -181,14 +195,14 @@ bool TestManual(std::string &error) // Call them through the mcallclass // 2.1) // Now call each function through the manual call class, using the hook decl and manually - SH_MCALL(cc, TheWall_Func1)(); - SH_MCALL2(cc, MFP_Func1(), 0, 0, 0)(); - SH_MCALL(cc, TheWall_Func2)(200); - SH_MCALL2(cc, MFP_Func2(), 1, 0, 0)(200); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func3)())); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func3(), 2, 0, 0)())); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func4)(400))); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func4(), 3, 0, 0)(400))); + SH_MCALL(p, TheWall_Func1)(); + SH_MCALL2(p, MFP_Func1(), 0, 0, 0)(); + SH_MCALL(p, TheWall_Func2)(200); + SH_MCALL2(p, MFP_Func2(), 1, 0, 0)(200); + ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func3)())); + ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func3(), 2, 0, 0)())); + ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func4)(400))); + ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func4(), 3, 0, 0)(400))); CHECK_STATES((&g_States, new State_Func1_Called(p), @@ -206,18 +220,18 @@ bool TestManual(std::string &error) NULL), "Part 2.1"); // Unhook them - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); + SH_REMOVE_HOOK(TheWall, Func1, p, SH_STATIC(Handler_Func1), false); + SH_REMOVE_HOOK(TheWall, Func2, p, SH_STATIC(Handler_Func2), false); + SH_REMOVE_HOOK(TheWall, Func3, p, SH_STATIC(Handler_Func3), false); + SH_REMOVE_HOOK(TheWall, Func4, p, SH_STATIC(Handler_Func4), false); // 3) // Hook each function manually, call them - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func1, p, Handler_Func1, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); + SH_ADD_MANUALHOOK(TheWall_Func1, p, SH_STATIC(Handler_Func1), false); + SH_ADD_MANUALHOOK(TheWall_Func2, p, SH_STATIC(Handler_Func2), false); + SH_ADD_MANUALHOOK(TheWall_Func3, p, SH_STATIC(Handler_Func3), false); + SH_ADD_MANUALHOOK(TheWall_Func4, p, SH_STATIC(Handler_Func4), false); p->Func1(); p->Func2(200); @@ -242,14 +256,14 @@ bool TestManual(std::string &error) // Call them through the mcallclass // 3.1) // Now call each function through the manual call class, using the hook decl and manually - SH_MCALL(cc, TheWall_Func1)(); - SH_MCALL2(cc, MFP_Func1(), 0, 0, 0)(); - SH_MCALL(cc, TheWall_Func2)(200); - SH_MCALL2(cc, MFP_Func2(), 1, 0, 0)(200); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func3)())); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func3(), 2, 0, 0)())); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func4)(400))); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func4(), 3, 0, 0)(400))); + SH_MCALL(p, TheWall_Func1)(); + SH_MCALL2(p, MFP_Func1(), 0, 0, 0)(); + SH_MCALL(p, TheWall_Func2)(200); + SH_MCALL2(p, MFP_Func2(), 1, 0, 0)(200); + ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func3)())); + ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func3(), 2, 0, 0)())); + ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func4)(400))); + ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func4(), 3, 0, 0)(400))); CHECK_STATES((&g_States, new State_Func1_Called(p), @@ -267,10 +281,10 @@ bool TestManual(std::string &error) NULL), "Part 3.1"); // Unhook them - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func1, p, Handler_Func1, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); + SH_REMOVE_MANUALHOOK(TheWall_Func1, p, SH_STATIC(Handler_Func1), false); + SH_REMOVE_MANUALHOOK(TheWall_Func2, p, SH_STATIC(Handler_Func2), false); + SH_REMOVE_MANUALHOOK(TheWall_Func3, p, SH_STATIC(Handler_Func3), false); + SH_REMOVE_MANUALHOOK(TheWall_Func4, p, SH_STATIC(Handler_Func4), false); // 4) // Hook each function manually, then normally, call, unhook @@ -278,7 +292,7 @@ bool TestManual(std::string &error) AnotherBrick handler_inst; // Why this? - // 1) tests sh_add_manualhook_memfunc + // 1) tests sh_add_manualhook // 2) in my tests, the proto of the manual hook was not equal to the proto of the auto hook // (because there are no attribs for manual hooks). // sourcehook.cpp did a !strcmp(..), so it assigned a new hook manager even though there @@ -287,15 +301,15 @@ bool TestManual(std::string &error) // The problem with this is that returning MRES_SUPERCEDE (as AnotherBrick::Handler_Func1 // does) will supercede the second hook func from being called - thus bypassing the call // of the auto hook here. - SH_ADD_MANUALHOOK_MEMFUNC(TheWall_Func1, p, &handler_inst, &AnotherBrick::Handler_Func1, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); + SH_ADD_MANUALHOOK(TheWall_Func1, p, SH_MEMBER(&handler_inst, &AnotherBrick::Handler_Func1), false); + SH_ADD_MANUALHOOK(TheWall_Func2, p, SH_STATIC(Handler_Func2), false); + SH_ADD_MANUALHOOK(TheWall_Func3, p, SH_STATIC(Handler_Func3), false); + SH_ADD_MANUALHOOK(TheWall_Func4, p, SH_STATIC(Handler_Func4), false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); + SH_ADD_HOOK(TheWall, Func1, p, SH_STATIC(Handler_Func1), false); + SH_ADD_HOOK(TheWall, Func2, p, SH_STATIC(Handler_Func2), false); + SH_ADD_HOOK(TheWall, Func3, p, SH_STATIC(Handler_Func3), false); + SH_ADD_HOOK(TheWall, Func4, p, SH_STATIC(Handler_Func4), false); p->Func1(); p->Func2(200); @@ -319,19 +333,19 @@ bool TestManual(std::string &error) new State_Return(4), NULL), "Part 4"); - SH_REMOVE_MANUALHOOK_MEMFUNC(TheWall_Func1, p, &handler_inst, &AnotherBrick::Handler_Func1, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); + SH_REMOVE_MANUALHOOK(TheWall_Func1, p, SH_MEMBER(&handler_inst, &AnotherBrick::Handler_Func1), false); + SH_REMOVE_MANUALHOOK(TheWall_Func2, p, SH_STATIC(Handler_Func2), false); + SH_REMOVE_MANUALHOOK(TheWall_Func3, p, SH_STATIC(Handler_Func3), false); + SH_REMOVE_MANUALHOOK(TheWall_Func4, p, SH_STATIC(Handler_Func4), false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); + SH_REMOVE_HOOK(TheWall, Func1, p, SH_STATIC(Handler_Func1), false); + SH_REMOVE_HOOK(TheWall, Func2, p, SH_STATIC(Handler_Func2), false); + SH_REMOVE_HOOK(TheWall, Func3, p, SH_STATIC(Handler_Func3), false); + SH_REMOVE_HOOK(TheWall, Func4, p, SH_STATIC(Handler_Func4), false); // 5) Reconfigure TheWall_Func1 to actually hook Func5: SH_MANUALHOOK_RECONFIGURE(TheWall_Func1, 4, 0, 0); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func1, p, Handler_Func1, false); + SH_ADD_MANUALHOOK(TheWall_Func1, p, SH_STATIC(Handler_Func1), false); p->Func5(); diff --git a/sourcehook/test/testmulti.cpp b/sourcehook/test/testmulti.cpp index 2e4ca9a..af5555c 100644 --- a/sourcehook/test/testmulti.cpp +++ b/sourcehook/test/testmulti.cpp @@ -53,7 +53,7 @@ bool TestMulti(std::string &error) for (unsigned int i=0; i<10; i++) - SH_ADD_HOOK_STATICFUNC(VMultiTest, HookTarget, pv[i], HookFunction, false); + SH_ADD_HOOK(VMultiTest, HookTarget, pv[i], SH_STATIC(HookFunction), false); pv[0]->HookTarget(); @@ -72,7 +72,7 @@ bool TestMulti(std::string &error) } } - SH_REMOVE_HOOK_STATICFUNC(VMultiTest, HookTarget, pv[0], HookFunction, false); + SH_REMOVE_HOOK(VMultiTest, HookTarget, pv[0], SH_STATIC(HookFunction), false); for (unsigned int i=1; i<10; i++) pv[i]->HookTarget(); @@ -96,7 +96,7 @@ bool TestMulti(std::string &error) for (unsigned int i=1; i<10; i++) { - SH_REMOVE_HOOK_STATICFUNC(VMultiTest, HookTarget, pv[1], HookFunction, false); + SH_REMOVE_HOOK(VMultiTest, HookTarget, pv[1], SH_STATIC(HookFunction), false); delete pv[i]; } diff --git a/sourcehook/test/testrecall.cpp b/sourcehook/test/testrecall.cpp index a80ad1b..5277b17 100644 --- a/sourcehook/test/testrecall.cpp +++ b/sourcehook/test/testrecall.cpp @@ -48,6 +48,11 @@ namespace } }; + // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! + struct Whatever : Test + { + }; + void Handler1_Func1(int a) { ADD_STATE(State_H1_Func1(a)); @@ -119,12 +124,12 @@ bool TestRecall(std::string &error) GET_SHPTR(g_SHPtr); g_PLID = 1337; - Test inst; + Whatever inst; Test *ptr = &inst; - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler1_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, HandlerPost_Func1, true); + SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler1_Func1), false); + SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); + SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(HandlerPost_Func1), true); ptr->Func1(77); @@ -135,10 +140,10 @@ bool TestRecall(std::string &error) new State_HP_Func1(0, ptr), NULL), "Part 1"); - SH_REMOVE_HOOK_STATICFUNC(Test, Func1, ptr, Handler1_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); + SH_REMOVE_HOOK(Test, Func1, ptr, SH_STATIC(Handler1_Func1), false); + SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); + SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); + SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); ptr->Func1(77); @@ -151,8 +156,8 @@ bool TestRecall(std::string &error) new State_HP_Func1(57, ptr), NULL), "Part 2"); - SH_REMOVE_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(Test, Func1, ptr, HandlerPost_Func1, true); + SH_REMOVE_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); + SH_REMOVE_HOOK(Test, Func1, ptr, SH_STATIC(HandlerPost_Func1), true); ptr->Func1(77); @@ -162,8 +167,8 @@ bool TestRecall(std::string &error) // Func2 - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func2, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost_Func2, true); + SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(Handler1_Func2), false); + SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost_Func2), true); int a = ptr->Func2(77); CHECK_STATES((&g_States, @@ -175,8 +180,8 @@ bool TestRecall(std::string &error) CHECK_COND(a == 500, "Part 4.1"); // Func2, with other handler - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func2, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, Handler2_Func2, false); + SH_REMOVE_HOOK(Test, Func2, ptr, SH_STATIC(Handler1_Func2), false); + SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(Handler2_Func2), false); a = ptr->Func2(77); CHECK_STATES((&g_States, @@ -191,9 +196,9 @@ bool TestRecall(std::string &error) // 1) WITH OVERRIDE - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func22, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1A_Func22, true); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); + SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(Handler1_Func22), false); + SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost1A_Func22), true); + SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost2_Func22), true); a = ptr->Func2(10, 11); CHECK_STATES((&g_States, @@ -206,11 +211,11 @@ bool TestRecall(std::string &error) CHECK_COND(a == 0, "Part 5.1"); // 2) WITH IGNORE - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1A_Func22, true); - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); + SH_REMOVE_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost1A_Func22), true); + SH_REMOVE_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost2_Func22), true); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1_Func22, true); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); + SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost1_Func22), true); + SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost2_Func22), true); a = ptr->Func2(10, 11); CHECK_STATES((&g_States, diff --git a/sourcehook/test/testreentr.cpp b/sourcehook/test/testreentr.cpp index b4f0ec5..e0b6974 100644 --- a/sourcehook/test/testreentr.cpp +++ b/sourcehook/test/testreentr.cpp @@ -82,6 +82,7 @@ namespace return 1; } }; + struct C2 { virtual void F() @@ -167,6 +168,15 @@ namespace } }; + struct C1_Derived : public C1 {}; + struct C2_Derived : public C2 {}; + struct C3_Derived : public C3 {}; + struct C4_Derived : public C4 {}; + struct C5_Derived : public C5 {}; + struct C6_Derived : public C6 {}; + struct C7_Derived : public C7 {}; + struct C8_Derived : public C8 {}; + SH_DECL_HOOK0_void(C1, F, SH_NOATTRIB, 0); SH_DECL_HOOK0(C1, G, SH_NOATTRIB, 0, int); SH_DECL_HOOK0_void(C2, F, SH_NOATTRIB, 0); @@ -258,9 +268,9 @@ namespace void Handler_C7_F() { if (g_TestID == 1 || g_TestID == 2) - SH_REMOVE_HOOK_STATICFUNC(C4, G, g_pC4, Handler2_C4_G, false); + SH_REMOVE_HOOK(C4, G, g_pC4, SH_STATIC(Handler2_C4_G), false); if (g_TestID == 2) - SH_REMOVE_HOOK_STATICFUNC(C4, G, g_pC4, Handler_C4_G, false); + SH_REMOVE_HOOK(C4, G, g_pC4, SH_STATIC(Handler_C4_G), false); ADD_STATE(State_H_C7_F(META_IFACEPTR(C7))); g_pC7->G(); @@ -282,14 +292,14 @@ namespace return 8; } - C1 g_C1; - C2 g_C2; - C3 g_C3; - C4 g_C4; - C5 g_C5; - C6 g_C6; - C7 g_C7; - C8 g_C8; + C1_Derived g_C1; + C2_Derived g_C2; + C3_Derived g_C3; + C4_Derived g_C4; + C5_Derived g_C5; + C6_Derived g_C6; + C7_Derived g_C7; + C8_Derived g_C8; } bool TestReentr(std::string &error) @@ -306,22 +316,22 @@ bool TestReentr(std::string &error) g_pC7 = &g_C7; g_pC8 = &g_C8; - SH_ADD_HOOK_STATICFUNC(C1, F, g_pC1, Handler_C1_F, false); - SH_ADD_HOOK_STATICFUNC(C1, G, g_pC1, Handler_C1_G, false); - SH_ADD_HOOK_STATICFUNC(C2, F, g_pC2, Handler_C2_F, false); - SH_ADD_HOOK_STATICFUNC(C2, G, g_pC2, Handler_C2_G, false); - SH_ADD_HOOK_STATICFUNC(C3, F, g_pC3, Handler_C3_F, false); - SH_ADD_HOOK_STATICFUNC(C3, G, g_pC3, Handler_C3_G, false); - SH_ADD_HOOK_STATICFUNC(C4, F, g_pC4, Handler_C4_F, false); - SH_ADD_HOOK_STATICFUNC(C4, G, g_pC4, Handler_C4_G, false); - SH_ADD_HOOK_STATICFUNC(C5, F, g_pC5, Handler_C5_F, false); - SH_ADD_HOOK_STATICFUNC(C5, G, g_pC5, Handler_C5_G, false); - SH_ADD_HOOK_STATICFUNC(C6, F, g_pC6, Handler_C6_F, false); - SH_ADD_HOOK_STATICFUNC(C6, G, g_pC6, Handler_C6_G, false); - SH_ADD_HOOK_STATICFUNC(C7, F, g_pC7, Handler_C7_F, false); - SH_ADD_HOOK_STATICFUNC(C7, G, g_pC7, Handler_C7_G, false); - SH_ADD_HOOK_STATICFUNC(C8, F, g_pC8, Handler_C8_F, false); - SH_ADD_HOOK_STATICFUNC(C8, G, g_pC8, Handler_C8_G, false); + SH_ADD_HOOK(C1, F, g_pC1, SH_STATIC(Handler_C1_F), false); + SH_ADD_HOOK(C1, G, g_pC1, SH_STATIC(Handler_C1_G), false); + SH_ADD_HOOK(C2, F, g_pC2, SH_STATIC(Handler_C2_F), false); + SH_ADD_HOOK(C2, G, g_pC2, SH_STATIC(Handler_C2_G), false); + SH_ADD_HOOK(C3, F, g_pC3, SH_STATIC(Handler_C3_F), false); + SH_ADD_HOOK(C3, G, g_pC3, SH_STATIC(Handler_C3_G), false); + SH_ADD_HOOK(C4, F, g_pC4, SH_STATIC(Handler_C4_F), false); + SH_ADD_HOOK(C4, G, g_pC4, SH_STATIC(Handler_C4_G), false); + SH_ADD_HOOK(C5, F, g_pC5, SH_STATIC(Handler_C5_F), false); + SH_ADD_HOOK(C5, G, g_pC5, SH_STATIC(Handler_C5_G), false); + SH_ADD_HOOK(C6, F, g_pC6, SH_STATIC(Handler_C6_F), false); + SH_ADD_HOOK(C6, G, g_pC6, SH_STATIC(Handler_C6_G), false); + SH_ADD_HOOK(C7, F, g_pC7, SH_STATIC(Handler_C7_F), false); + SH_ADD_HOOK(C7, G, g_pC7, SH_STATIC(Handler_C7_G), false); + SH_ADD_HOOK(C8, F, g_pC8, SH_STATIC(Handler_C8_F), false); + SH_ADD_HOOK(C8, G, g_pC8, SH_STATIC(Handler_C8_G), false); g_pC1->F(); @@ -361,7 +371,7 @@ bool TestReentr(std::string &error) NULL), "1"); - SH_ADD_HOOK_STATICFUNC(C4, G, g_pC4, Handler2_C4_G, false); + SH_ADD_HOOK(C4, G, g_pC4, SH_STATIC(Handler2_C4_G), false); g_pC1->F(); @@ -517,7 +527,7 @@ bool TestReentr(std::string &error) - SH_ADD_HOOK_STATICFUNC(C4, G, g_pC4, Handler2_C4_G, false); + SH_ADD_HOOK(C4, G, g_pC4, SH_STATIC(Handler2_C4_G), false); g_TestID = 2; @@ -578,22 +588,22 @@ bool TestReentr(std::string &error) new State_C1_F(g_pC1), NULL), "7"); - SH_REMOVE_HOOK_STATICFUNC(C1, F, g_pC1, Handler_C1_F, false); - SH_REMOVE_HOOK_STATICFUNC(C1, G, g_pC1, Handler_C1_G, false); - SH_REMOVE_HOOK_STATICFUNC(C2, F, g_pC2, Handler_C2_F, false); - SH_REMOVE_HOOK_STATICFUNC(C2, G, g_pC2, Handler_C2_G, false); - SH_REMOVE_HOOK_STATICFUNC(C3, F, g_pC3, Handler_C3_F, false); - SH_REMOVE_HOOK_STATICFUNC(C3, G, g_pC3, Handler_C3_G, false); - SH_REMOVE_HOOK_STATICFUNC(C4, F, g_pC4, Handler_C4_F, false); - SH_REMOVE_HOOK_STATICFUNC(C4, G, g_pC4, Handler_C4_G, false); - SH_REMOVE_HOOK_STATICFUNC(C5, F, g_pC5, Handler_C5_F, false); - SH_REMOVE_HOOK_STATICFUNC(C5, G, g_pC5, Handler_C5_G, false); - SH_REMOVE_HOOK_STATICFUNC(C6, F, g_pC6, Handler_C6_F, false); - SH_REMOVE_HOOK_STATICFUNC(C6, G, g_pC6, Handler_C6_G, false); - SH_REMOVE_HOOK_STATICFUNC(C7, F, g_pC7, Handler_C7_F, false); - SH_REMOVE_HOOK_STATICFUNC(C7, G, g_pC7, Handler_C7_G, false); - SH_REMOVE_HOOK_STATICFUNC(C8, F, g_pC8, Handler_C8_F, false); - SH_REMOVE_HOOK_STATICFUNC(C8, G, g_pC8, Handler_C8_G, false); + SH_REMOVE_HOOK(C1, F, g_pC1, SH_STATIC(Handler_C1_F), false); + SH_REMOVE_HOOK(C1, G, g_pC1, SH_STATIC(Handler_C1_G), false); + SH_REMOVE_HOOK(C2, F, g_pC2, SH_STATIC(Handler_C2_F), false); + SH_REMOVE_HOOK(C2, G, g_pC2, SH_STATIC(Handler_C2_G), false); + SH_REMOVE_HOOK(C3, F, g_pC3, SH_STATIC(Handler_C3_F), false); + SH_REMOVE_HOOK(C3, G, g_pC3, SH_STATIC(Handler_C3_G), false); + SH_REMOVE_HOOK(C4, F, g_pC4, SH_STATIC(Handler_C4_F), false); + SH_REMOVE_HOOK(C4, G, g_pC4, SH_STATIC(Handler_C4_G), false); + SH_REMOVE_HOOK(C5, F, g_pC5, SH_STATIC(Handler_C5_F), false); + SH_REMOVE_HOOK(C5, G, g_pC5, SH_STATIC(Handler_C5_G), false); + SH_REMOVE_HOOK(C6, F, g_pC6, SH_STATIC(Handler_C6_F), false); + SH_REMOVE_HOOK(C6, G, g_pC6, SH_STATIC(Handler_C6_G), false); + SH_REMOVE_HOOK(C7, F, g_pC7, SH_STATIC(Handler_C7_F), false); + SH_REMOVE_HOOK(C7, G, g_pC7, SH_STATIC(Handler_C7_G), false); + SH_REMOVE_HOOK(C8, F, g_pC8, SH_STATIC(Handler_C8_F), false); + SH_REMOVE_HOOK(C8, G, g_pC8, SH_STATIC(Handler_C8_G), false); return true; } diff --git a/sourcehook/test/testref.cpp b/sourcehook/test/testref.cpp index db5062a..d718f3a 100644 --- a/sourcehook/test/testref.cpp +++ b/sourcehook/test/testref.cpp @@ -76,6 +76,7 @@ namespace return sth.Func(); } }; + class CHelloDerived : public CHello { }; class CHook { @@ -99,12 +100,10 @@ bool TestRef(std::string &error) CDerived der; CDerived2 der2(11); CDerived2 der3(12); - CHello hello; + CHelloDerived hello; CHello *pHello = &hello; CHook hook; - SourceHook::CallClass *cc = SH_GET_CALLCLASS(&hello); - ADD_STATE(State_Result(pHello->Func(base))); ADD_STATE(State_Result(pHello->Func(der))); ADD_STATE(State_Result(pHello->Func(der2))); @@ -117,10 +116,10 @@ bool TestRef(std::string &error) new State_Result(12), NULL), "Part 1"); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(base))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der2))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der3))); + ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(base))); + ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der))); + ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der2))); + ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der3))); CHECK_STATES((&g_States, new State_Result(0), @@ -129,7 +128,7 @@ bool TestRef(std::string &error) new State_Result(12), NULL), "Part 2"); - SH_ADD_HOOK_MEMFUNC(CHello, Func, &hello, &hook, &CHook::Func, false); + SH_ADD_HOOK(CHello, Func, &hello, SH_MEMBER(&hook, &CHook::Func), false); ADD_STATE(State_Result(pHello->Func(base))); ADD_STATE(State_Result(pHello->Func(der))); @@ -147,10 +146,10 @@ bool TestRef(std::string &error) new State_Result(20), NULL), "Part 3"); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(base))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der2))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der3))); + ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(base))); + ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der))); + ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der2))); + ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der3))); CHECK_STATES((&g_States, new State_Result(0), diff --git a/sourcehook/test/testrefret.cpp b/sourcehook/test/testrefret.cpp index 6853cf8..d4c19d8 100644 --- a/sourcehook/test/testrefret.cpp +++ b/sourcehook/test/testrefret.cpp @@ -48,6 +48,10 @@ namespace return m_Var2; } }; + + class Whatever : public Test + { + }; class CHook { @@ -98,7 +102,7 @@ bool TestRefRet(std::string &error) GET_SHPTR(g_SHPtr); g_PLID = 1; - Test test; + Whatever test; Test *pTest = &test; CHook hook; @@ -111,7 +115,7 @@ bool TestRefRet(std::string &error) NULL), "Part 1"); // Now add Func1_Pre1, which supercedes and returns hook.m_Var - SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Pre1, false); + SH_ADD_HOOK(Test, Func1, &test, SH_MEMBER(&hook, &CHook::Func1_Pre1), false); int &ret2 = pTest->Func1(); ADD_STATE(State_Func1_Ret(&ret2)); @@ -123,7 +127,7 @@ bool TestRefRet(std::string &error) NULL), "Part 2"); // Now add Func1_Post1, which only reports orig ret and override ret - SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Post1, true); + SH_ADD_HOOK(Test, Func1, &test, SH_MEMBER(&hook, &CHook::Func1_Post1), true); int &ret3 = pTest->Func1(); ADD_STATE(State_Func1_Ret(&ret3)); @@ -139,8 +143,8 @@ bool TestRefRet(std::string &error) // Now add Func1_Pre2, which supercedes and returns g_Var (it also sets the override ret from pre1 to 1337) // and add Func1_Post2, which overrides and returns hook.m_Var again. - SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Pre2, false); - SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Post2, true); + SH_ADD_HOOK(Test, Func1, &test, SH_MEMBER(&hook, &CHook::Func1_Pre2), false); + SH_ADD_HOOK(Test, Func1, &test, SH_MEMBER(&hook, &CHook::Func1_Post2), true); int &ret4 = pTest->Func1(); ADD_STATE(State_Func1_Ret(&ret4)); @@ -160,8 +164,7 @@ bool TestRefRet(std::string &error) CHECK_COND(hook.m_Var == 1337, "Part 4.1"); // Through a callclass - SourceHook::CallClass *cc1 = SH_GET_CALLCLASS(&test); - int &ret5 = SH_CALL(cc1, &Test::Func1)(); + int &ret5 = SH_CALL(pTest, &Test::Func1)(); ADD_STATE(State_Func1_Ret(&ret5)); CHECK_STATES((&g_States, @@ -169,7 +172,6 @@ bool TestRefRet(std::string &error) new State_Func1_Ret(&test.m_Var1), NULL), "Part 5"); - SH_RELEASE_CALLCLASS(cc1); //////////////////////////////////////////////////////////////////////////////////////// // Func2 tests @@ -181,8 +183,8 @@ bool TestRefRet(std::string &error) new State_Func2_Ret(&test.m_Var2), NULL), "Part 6"); - SH_ADD_HOOK_MEMFUNC(Test, Func2, &test, &hook, &CHook::Func2_Pre1, false); - SH_ADD_HOOK_MEMFUNC(Test, Func2, &test, &hook, &CHook::Func2_Post1, true); + SH_ADD_HOOK(Test, Func2, &test, SH_MEMBER(&hook, &CHook::Func2_Pre1), false); + SH_ADD_HOOK(Test, Func2, &test, SH_MEMBER(&hook, &CHook::Func2_Post1), true); const int &ret22 = pTest->Func2(500); ADD_STATE(State_Func2_Ret(&ret22)); From 4b9abfe0aff9899b727086e3977f4945ece12bcb Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 28 Sep 2007 21:41:41 +0000 Subject: [PATCH 16/25] forgot to add files from shv5 --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40437 --- sourcehook/sh_listcat.h | 147 ++++++++++++++ sourcehook/test/testvphooks.cpp | 347 ++++++++++++++++++++++++++++++++ 2 files changed, 494 insertions(+) create mode 100644 sourcehook/sh_listcat.h create mode 100644 sourcehook/test/testvphooks.cpp diff --git a/sourcehook/sh_listcat.h b/sourcehook/sh_listcat.h new file mode 100644 index 0000000..8eb74ca --- /dev/null +++ b/sourcehook/sh_listcat.h @@ -0,0 +1,147 @@ +/* ======== SourceMM ======== +* Copyright (C) 2004-2007 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +// Used for VP-Hooks + +#ifndef _INCLUDE_SMM_LISTCAT_H +#define _INCLUDE_SMM_LISTCAT_H + +#include "sh_list.h" + +namespace SourceHook +{ + + // Only a very special-case forward iterator! + template + class ListCatIterator + { + List *m_pListLeft; + List *m_pListRight; + typename List::iterator m_Iter; + + void CheckLeftEmptyOnBegin() + { + // If the left list is empty and right is valid, GoToBegin sets m_Iter to m_Left + // End() checks for equality to m_Right.end() so it returns false + // then Next() corrupts by incrementing! + + // To avoid this, we skip left if it's empty. + if (m_pListLeft && m_pListLeft->empty() && m_pListRight) + { + m_Iter = m_pListRight->begin(); + } + } + public: + // At least one list has to be non-null! + ListCatIterator(List *pListLeft, List *pListRight) : m_pListLeft(pListLeft), m_pListRight(pListRight), + m_Iter(pListLeft ? pListLeft->begin() : pListRight->begin()) + { + CheckLeftEmptyOnBegin(); + } + + void GoToBegin() + { + m_Iter = m_pListLeft ? m_pListLeft->begin() : m_pListRight->begin(); + CheckLeftEmptyOnBegin(); + } + + bool End() + { + return m_pListRight ? (m_Iter == m_pListRight->end()) + : (m_Iter == m_pListLeft->end()); + } + + //pre increment + ListCatIterator & operator++() + { + ++m_Iter; + if (m_pListLeft && m_Iter == m_pListLeft->end()) + { + if (m_pListRight) + m_Iter = m_pListRight->begin(); + } + return *this; + } + //post increment + ListCatIterator operator++(int) + { + ListCatIterator old(*this); + + ++m_Iter; + if (m_pListLeft && m_Iter == m_pListLeft->end()) + { + if (m_pListRight) + m_Iter = m_pListRight->begin(); + } + + return old; + } + + const T & operator * () const + { + return *m_Iter; + } + T & operator * () + { + return *m_Iter; + } + + T * operator -> () + { + return &(*m_Iter); + } + const T * operator -> () const + { + return &(*m_Iter); + } + + bool operator != (const typename List::iterator &where) const + { + return (m_Iter != where); + } + bool operator ==(const typename List::iterator &where) const + { + return (m_Iter == where); + } + + ListCatIterator & operator = (const typename List::iterator &where) + { + m_Iter = where; + + if (m_pListLeft && m_Iter == m_pListLeft->end()) + { + if (m_pListRight) + m_Iter = m_pListRight->begin(); + + // :HACK HACK: RemoveHookById is not aware of ListCatIterator (yet? :TODO: Change it!) + // So we have to do this here... (look for the "Move all iterators pointing at this" section) + --m_Iter; + } + + return *this; + } + + ListCatIterator & operator = (const ListCatIterator &other) + { + m_Iter = other.m_Iter; + m_pListLeft = other.m_pListLeft; + m_pListRight = other.m_pListRight; + return *this; + } + + void SetListLeft(List *pList) + { + m_pListLeft = pList; + } + }; +} + +#endif + diff --git a/sourcehook/test/testvphooks.cpp b/sourcehook/test/testvphooks.cpp new file mode 100644 index 0000000..8d03bfd --- /dev/null +++ b/sourcehook/test/testvphooks.cpp @@ -0,0 +1,347 @@ +#include +#include "sourcehook.h" +#include "sourcehook_test.h" +#include "testevents.h" + +// TEST VP HOOKS +// Test vfnptr-wide hooks +// Also contains a test for removing hooks on deleted instances (by id) + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + class IBase; + + MAKE_STATE_1(State_D1_Func1, IBase *); + MAKE_STATE_1(State_D2_Func1, IBase *); + MAKE_STATE_1(State_Func1_Pre, IBase *); + MAKE_STATE_1(State_Func1_Post, IBase *); + + MAKE_STATE_1(State_D1_Func2, IBase *); + MAKE_STATE_1(State_D2_Func2, IBase *); + MAKE_STATE_1(State_Func2_Pre, IBase *); + MAKE_STATE_1(State_Func2_Post, IBase *); + + MAKE_STATE_2(State_D1_Func3, IBase *, int); + MAKE_STATE_2(State_D2_Func3, IBase *, int); + MAKE_STATE_2(State_Func3_Pre, IBase *, int); + MAKE_STATE_2(State_Func3_Post, IBase *, int); + + class IBase + { + public: + virtual void Func1() = 0; + virtual void Func2() = 0; + virtual void Func3(int x) = 0; + }; + + class CDerived1 : public IBase + { + public: + virtual void Func1() + { + ADD_STATE(State_D1_Func1(this)); + } + virtual void Func2() + { + ADD_STATE(State_D1_Func2(this)); + } + virtual void Func3(int x) + { + ADD_STATE(State_D1_Func3(this, x)); + } + }; + + class CDerived2 : public IBase + { + public: + virtual void Func1() + { + ADD_STATE(State_D2_Func1(this)); + } + virtual void Func2() + { + ADD_STATE(State_D2_Func2(this)); + } + virtual void Func3(int x) + { + ADD_STATE(State_D2_Func3(this, x)); + } + }; + + void Handler_Func1_Pre() + { + ADD_STATE(State_Func1_Pre(META_IFACEPTR(IBase))); + } + void Handler_Func1_Post() + { + ADD_STATE(State_Func1_Post(META_IFACEPTR(IBase))); + } + int g_F2_Pre_HookToRemove = 0; + void Handler_Func2_Pre() + { + ADD_STATE(State_Func2_Pre(META_IFACEPTR(IBase))); + SH_REMOVE_HOOK_ID(g_F2_Pre_HookToRemove); + } + void Handler_Func2_Post() + { + ADD_STATE(State_Func2_Post(META_IFACEPTR(IBase))); + } + + + void Handler_Func3_Pre(int x) + { + ADD_STATE(State_Func3_Pre(META_IFACEPTR(IBase), x)); + + RETURN_META_NEWPARAMS(MRES_IGNORED, &IBase::Func3, (x+1)); + } + void Handler_Func3_Post(int x) + { + ADD_STATE(State_Func3_Post(META_IFACEPTR(IBase), x)); + } + + SH_DECL_HOOK0_void(IBase, Func1, SH_NOATTRIB, 0); + SH_DECL_HOOK0_void(IBase, Func2, SH_NOATTRIB, 0); + SH_DECL_HOOK1_void(IBase, Func3, SH_NOATTRIB, 0, int); + + SH_DECL_MANUALHOOK1_void(IBase_Func3_Manual, 2, 0, 0, int); +} + +bool TestVPHooks(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1337; + + CDerived1 d1i1; + CDerived1 d1i2; + CDerived2 d2i1; + + IBase *p_d1i1 = &d1i1; + IBase *p_d1i2 = &d1i2; + IBase *p_d2i1 = &d2i1; + + int hook1 = SH_ADD_VPHOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); + + p_d1i1->Func1(); + p_d1i2->Func1(); + p_d2i1->Func1(); + + CHECK_STATES((&g_States, + new State_Func1_Pre(p_d1i1), + new State_D1_Func1(p_d1i1), + + new State_Func1_Pre(p_d1i2), + new State_D1_Func1(p_d1i2), + + new State_D2_Func1(p_d2i1), + NULL), "Part 1"); + + SH_CALL(p_d1i1, &IBase::Func1)(); + SH_CALL(p_d1i2, &IBase::Func1)(); + SH_CALL(p_d2i1, &IBase::Func1)(); + + CHECK_STATES((&g_States, + new State_D1_Func1(p_d1i1), + + new State_D1_Func1(p_d1i2), + + new State_D2_Func1(p_d2i1), + NULL), "Part 1.1"); + + SH_REMOVE_HOOK_ID(hook1); + + p_d1i1->Func1(); + p_d1i2->Func1(); + p_d2i1->Func1(); + + CHECK_STATES((&g_States, + new State_D1_Func1(p_d1i1), + + new State_D1_Func1(p_d1i2), + + new State_D2_Func1(p_d2i1), + NULL), "Part 2"); + + + + // Normal hook, then vp hook + + int hook2 = SH_ADD_HOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); + hook1 = SH_ADD_VPHOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); + + p_d1i1->Func1(); + p_d1i2->Func1(); + p_d2i1->Func1(); + + CHECK_STATES((&g_States, + new State_Func1_Pre(p_d1i1), + new State_Func1_Pre(p_d1i1), + new State_D1_Func1(p_d1i1), + + new State_Func1_Pre(p_d1i2), + new State_D1_Func1(p_d1i2), + + new State_D2_Func1(p_d2i1), + NULL), "Part 3"); + + SH_REMOVE_HOOK_ID(hook1); + + p_d1i1->Func1(); + p_d1i2->Func1(); + p_d2i1->Func1(); + + CHECK_STATES((&g_States, + new State_Func1_Pre(p_d1i1), + new State_D1_Func1(p_d1i1), + + new State_D1_Func1(p_d1i2), + + new State_D2_Func1(p_d2i1), + NULL), "Part 4"); + + SH_REMOVE_HOOK_ID(hook2); + + p_d1i1->Func1(); + p_d1i2->Func1(); + p_d2i1->Func1(); + + CHECK_STATES((&g_States, + new State_D1_Func1(p_d1i1), + + new State_D1_Func1(p_d1i2), + + new State_D2_Func1(p_d2i1), + NULL), "Part 5"); + + // Test this: + // Normal hook AND vp hook on Func2 + // Func2's pre handler removes the VP hook. It has to work anyway :) + + hook1 = SH_ADD_VPHOOK(IBase, Func2, p_d1i1, SH_STATIC(Handler_Func2_Pre), false); + hook2 = SH_ADD_HOOK(IBase, Func2, p_d1i1, SH_STATIC(Handler_Func2_Pre), false); + + g_F2_Pre_HookToRemove = hook1; + p_d1i1->Func2(); + p_d1i1->Func2(); + + CHECK_STATES((&g_States, + new State_Func2_Pre(p_d1i1), + new State_Func2_Pre(p_d1i1), + new State_D1_Func2(p_d1i1), + + new State_Func2_Pre(p_d1i1), + new State_D1_Func2(p_d1i1), + + NULL), "Part 6"); + + SH_REMOVE_HOOK_ID(hook1); + + // Hook function 3: + // Using manualhook, VP + hook1 = SH_ADD_MANUALVPHOOK(IBase_Func3_Manual, p_d1i1, SH_STATIC(Handler_Func3_Pre), false); + + // Normally, VP + hook2 = SH_ADD_VPHOOK(IBase, Func3, p_d1i1, SH_STATIC(Handler_Func3_Pre), false); + + // Normally, no VP + int hook3 = SH_ADD_HOOK(IBase, Func3, p_d1i1, SH_STATIC(Handler_Func3_Pre), false); + + p_d1i1->Func3(1); + + CHECK_STATES((&g_States, + new State_Func3_Pre(p_d1i1, 1), // manual vp hook + new State_Func3_Pre(p_d1i1, 2), // normal vp hook + new State_Func3_Pre(p_d1i1, 3), // normal non-vp hook + + new State_D1_Func3(p_d1i1, 4), // function + + NULL), "Part 7.1"); + + p_d1i2->Func3(1); + + CHECK_STATES((&g_States, + new State_Func3_Pre(p_d1i2, 1), // manual vp hook + new State_Func3_Pre(p_d1i2, 2), // normal vp hook + + new State_D1_Func3(p_d1i2, 3), // function + + NULL), "Part 7.2"); + + SH_REMOVE_HOOK_ID(hook1); + SH_REMOVE_HOOK_ID(hook2); + SH_REMOVE_HOOK_ID(hook3); + + // Test direct VP hook + + p_d1i1->Func1(); + p_d1i2->Func1(); + + // get vtable manually + void *pVtable = *reinterpret_cast(p_d1i1); + + hook1 = SH_ADD_DVPHOOK(IBase, Func1, pVtable, SH_STATIC(Handler_Func1_Pre), false); + + p_d1i1->Func1(); + p_d1i2->Func1(); + + CHECK_STATES((&g_States, + new State_D1_Func1(p_d1i1), + new State_D1_Func1(p_d1i2), + + new State_Func1_Pre(p_d1i1), + new State_D1_Func1(p_d1i1), + new State_Func1_Pre(p_d1i2), + new State_D1_Func1(p_d1i2), + NULL), "Part 8.1"); + + SH_REMOVE_HOOK_ID(hook1); + + // Now try manual dvp hooks + p_d1i1->Func3(1); + p_d1i2->Func3(1); + + hook1 = SH_ADD_MANUALDVPHOOK(IBase_Func3_Manual, pVtable, SH_STATIC(Handler_Func3_Pre), false); + + p_d1i1->Func3(1); + p_d1i2->Func3(1); + + CHECK_STATES((&g_States, + new State_D1_Func3(p_d1i1, 1), + new State_D1_Func3(p_d1i2, 1), + + new State_Func3_Pre(p_d1i1, 1), // manual vp hook + new State_D1_Func3(p_d1i1, 2), // function + + new State_Func3_Pre(p_d1i2, 1), // normal vp hook + new State_D1_Func3(p_d1i2, 2), // function + + NULL), "Part 8.2"); + + + // Test removing normal hooks even though the instance is deleted + IBase *pOther = new CDerived1; + SH_ADD_HOOK(IBase, Func1, pOther, SH_STATIC(Handler_Func1_Pre), false); + delete pOther; + // The following line may not crash! + SH_REMOVE_HOOK(IBase, Func1, pOther, SH_STATIC(Handler_Func1_Pre), false); + + + // Now test GetOrigVfnPtrEntry + void *origfuncptr = (*reinterpret_cast(p_d1i1))[0]; + + CHECK_COND(SH_GET_ORIG_VFNPTR_ENTRY(p_d1i1, &IBase::Func1) == origfuncptr, "Part 9.1"); + + SH_ADD_HOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); + + CHECK_COND(SH_GET_ORIG_VFNPTR_ENTRY(p_d1i1, &IBase::Func1) == origfuncptr, "Part 9.2"); + + SH_REMOVE_HOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); + + CHECK_COND(SH_GET_ORIG_VFNPTR_ENTRY(p_d1i1, &IBase::Func1) == origfuncptr, "Part 9.3"); + + return true; +} + From de6a1637840ae19dae55acca8f03cdbec652b3d7 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 29 Sep 2007 04:07:06 +0000 Subject: [PATCH 17/25] fixed a shutdown crash bug, updated makefile for linux --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40438 --- sourcemm/Makefile | 15 ++++++++++++--- sourcemm/metamod.cpp | 9 +++++++-- sourcemm/metamod.h | 1 + sourcemm/metamod_plugins.cpp | 11 +++++------ 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/sourcemm/Makefile b/sourcemm/Makefile index f713ab2..24880e1 100644 --- a/sourcemm/Makefile +++ b/sourcemm/Makefile @@ -16,9 +16,10 @@ BINARY = server_i486.so HL2PUB = $(HL2SDK)/public HL2LIB = $(HL2SDK)/linux_sdk -OBJECTS = oslink.cpp metamod_util.cpp metamod.cpp +OBJECTS = metamod.cpp metamod_util.cpp metamod_console.cpp metamod_oslink.cpp metamod_plugins.cpp \ + sourcehook.cpp episode1/console.cpp episode1/provider_ep1.cpp -LINK = -static-libgcc +LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook @@ -33,7 +34,9 @@ endif GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse +CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp \ + -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca \ + -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse ifeq "$(GCC_VERSION)" "4" CFLAGS += $(GCC4_FLAGS) @@ -46,6 +49,9 @@ $(BIN_DIR)/%.o: %.cpp all: mkdir -p $(BIN_DIR) + mkdir -p $(BIN_DIR)/episode1 + ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so + ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so ln -sf $(SMM_ROOT)/sourcehook/sourcehook.cpp sourcehook.cpp $(MAKE) sourcemm rm -rf $(BINARY) @@ -60,7 +66,10 @@ debug: default: all clean: + rm -rf Release/episode1/*.o rm -rf Release/*.o rm -rf Release/$(BINARY) + rm -rf Debug/episode1/*.o rm -rf Debug/*.o rm -rf Debug/$(BINARY) + diff --git a/sourcemm/metamod.cpp b/sourcemm/metamod.cpp index d55b72a..a943738 100644 --- a/sourcemm/metamod.cpp +++ b/sourcemm/metamod.cpp @@ -1154,11 +1154,16 @@ void MetamodSource::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCo g_PluginMngr.RemovePluginCvar(plugin, pCommand); } + CPluginManager::CPlugin *pOrig = g_PluginMngr.FindByAPI(plugin); + UnregisterConCommandBase(pOrig ? pOrig->m_Id : 0, pCommand); +} + +void MetamodSource::UnregisterConCommandBase(PluginId id, ConCommandBase *pCommand) +{ PluginIter iter; CPluginManager::CPlugin *pPlugin; List::iterator event; IMetamodListener *pML; - CPluginManager::CPlugin *pOrig = g_PluginMngr.FindByAPI(plugin); for (iter=g_PluginMngr._begin(); iter!=g_PluginMngr._end(); iter++) { pPlugin = (*iter); @@ -1176,7 +1181,7 @@ void MetamodSource::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCo event++) { pML = (*event); - pML->OnUnlinkConCommandBase(pOrig ? pOrig->m_Id : 0, pCommand); + pML->OnUnlinkConCommandBase(id, pCommand); } } diff --git a/sourcemm/metamod.h b/sourcemm/metamod.h index 57c6741..eaff4ed 100644 --- a/sourcemm/metamod.h +++ b/sourcemm/metamod.h @@ -74,6 +74,7 @@ public: public: const char *GetGameBinaryPath(); const char *GetPluginsFile(); + void UnregisterConCommandBase(PluginId id, ConCommandBase *pCommand); }; void LogMessage(const char *msg, ...); diff --git a/sourcemm/metamod_plugins.cpp b/sourcemm/metamod_plugins.cpp index 29ee2bf..a71b72c 100644 --- a/sourcemm/metamod_plugins.cpp +++ b/sourcemm/metamod_plugins.cpp @@ -489,6 +489,8 @@ bool CPluginManager::_Unload(CPluginManager::CPlugin *pl, bool force, char *erro //Make sure to detach it from sourcehook! g_SourceHook.UnloadPlugin(pl->m_Id); + pl->m_Events.clear(); + UnregAllConCmds(pl); //Clean up the DLL @@ -710,22 +712,19 @@ void CPluginManager::RemovePluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) void CPluginManager::UnregAllConCmds(CPlugin *pl) { -#if 0 SourceHook::List::iterator i; /* :TODO: */ for (i=pl->m_Cvars.begin(); i!=pl->m_Cvars.end(); i++) { - g_SMConVarAccessor.Unregister(pl->m_Id, (*i) ); + g_Metamod.UnregisterConCommandBase(pl->m_Id, (*i) ); } - pl->m_Cvars.clear(); for (i=pl->m_Cmds.begin(); i!=pl->m_Cmds.end(); i++) { - g_SMConVarAccessor.Unregister(pl->m_Id, (*i) ); + g_Metamod.UnregisterConCommandBase(pl->m_Id, (*i) ); } - pl->m_Cmds.clear(); -#endif } + From 73f5615aa3895502bb57f4605108a8ac3803464a Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 29 Sep 2007 04:09:05 +0000 Subject: [PATCH 18/25] renamed makefile updated changelog removed doxyfile... out of place --HG-- branch : sourcemm-1.6.0 rename : sourcemm/Makefile => sourcemm/Makefile.ep1 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40439 --- sourcemm/{Makefile => Makefile.ep1} | 0 sourcemm/SourceMM.Doxyfile | 257 ---------------------------- sourcemm/changelog.txt | 2 + 3 files changed, 2 insertions(+), 257 deletions(-) rename sourcemm/{Makefile => Makefile.ep1} (100%) delete mode 100644 sourcemm/SourceMM.Doxyfile diff --git a/sourcemm/Makefile b/sourcemm/Makefile.ep1 similarity index 100% rename from sourcemm/Makefile rename to sourcemm/Makefile.ep1 diff --git a/sourcemm/SourceMM.Doxyfile b/sourcemm/SourceMM.Doxyfile deleted file mode 100644 index b7f2df7..0000000 --- a/sourcemm/SourceMM.Doxyfile +++ /dev/null @@ -1,257 +0,0 @@ -# Doxyfile 1.4.2 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = SourceMM -PROJECT_NUMBER = 1.00 -OUTPUT_DIRECTORY = c:\temp\smm-dox -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = YES -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = "C:/Documents and Settings/dvander.WHITENIGHT/Desktop/code/" -STRIP_FROM_INC_PATH = -SHORT_NAMES = YES -JAVADOC_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -DISTRIBUTE_GROUP_DOC = NO -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 8 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -SUBGROUPING = YES -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = YES -EXTRACT_PRIVATE = YES -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = NO -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 38 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = YES -FILE_VERSION_FILTER = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = "C:/Documents and Settings/dvander.WHITENIGHT/Desktop/code/sourcemm" -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = test \ - sample_mm -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = YES -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = NO -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -VERBATIM_HEADERS = NO -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = NO -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = NO -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = NO -USE_PDFLATEX = NO -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = NO -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = NO -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 1000 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = YES diff --git a/sourcemm/changelog.txt b/sourcemm/changelog.txt index 8d4fa60..ada6263 100644 --- a/sourcemm/changelog.txt +++ b/sourcemm/changelog.txt @@ -1,4 +1,6 @@ 2007/??/?? 1.6.0: + - Metamod:Source has no received a large internal rewrite to improve coding + standards and to separate internal logic from engine specifics. - Added API for getting highest supported IServerPluginCallbacks interface version. - Added OnUnlinkConCommandBase to IMetamodListner to notify when Metamod:Source From 337e319616cd98ba0ed90f7bdef51ad7db4ff2fb Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 29 Sep 2007 15:01:32 +0000 Subject: [PATCH 19/25] - fixed shutdown crash - fixed makefile for linux --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40440 --- sourcemm/Makefile.ep1 | 4 ++-- sourcemm/episode1/console.cpp | 31 ++++++++++++++++++++++++++++++ sourcemm/episode1/provider_ep1.cpp | 6 ++++++ sourcemm/episode1/provider_ep1.h | 1 + sourcemm/metamod.cpp | 8 ++------ sourcemm/metamod_provider.h | 2 ++ 6 files changed, 44 insertions(+), 8 deletions(-) diff --git a/sourcemm/Makefile.ep1 b/sourcemm/Makefile.ep1 index 24880e1..e051cb5 100644 --- a/sourcemm/Makefile.ep1 +++ b/sourcemm/Makefile.ep1 @@ -53,7 +53,7 @@ all: ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so ln -sf $(SMM_ROOT)/sourcehook/sourcehook.cpp sourcehook.cpp - $(MAKE) sourcemm + $(MAKE) -f Makefile.ep1 sourcemm rm -rf $(BINARY) ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) @@ -61,7 +61,7 @@ sourcemm: $(OBJ_LINUX) $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) debug: - $(MAKE) all DEBUG=true + $(MAKE) -f Makefile.ep1 all DEBUG=true default: all diff --git a/sourcemm/episode1/console.cpp b/sourcemm/episode1/console.cpp index e6d7c83..5903672 100644 --- a/sourcemm/episode1/console.cpp +++ b/sourcemm/episode1/console.cpp @@ -80,6 +80,37 @@ void SMConVarAccessor::MarkCommandsAsGameDLL() } } +void SMConVarAccessor::UnregisterGameDLLCommands() +{ + ConCommandBase *begin = icvar->GetCommands(); + ConCommandBase *iter = begin; + ConCommandBase *prev = NULL; + while (iter) + { + /* Watch out for the ETERNAL COMMAND! */ + if (iter != &s_EternalCommand && iter->IsBitSet(FCVAR_GAMEDLL)) + { + /* Remove it! */ + if (iter == begin) + { + s_EternalCommand.BringToFront(); + iter = const_cast(iter->GetNext()); + s_EternalCommand.SetNext(iter); + prev = &s_EternalCommand; + continue; + } + else + { + iter = const_cast(iter->GetNext()); + prev->SetNext(iter); + continue; + } + } + prev = iter; + iter = const_cast(iter->GetNext()); + } +} + void SMConVarAccessor::Unregister(ConCommandBase *pCommand) { ConCommandBase *ptr = icvar->GetCommands(); diff --git a/sourcemm/episode1/provider_ep1.cpp b/sourcemm/episode1/provider_ep1.cpp index c535a54..27c2d52 100644 --- a/sourcemm/episode1/provider_ep1.cpp +++ b/sourcemm/episode1/provider_ep1.cpp @@ -85,6 +85,12 @@ void BaseProvider::Notify_DLLInit_Pre(void *gamedll, ConCommandBaseMgr::OneTimeInit(&g_SMConVarAccessor); } +void BaseProvider::Notify_DLLShutdown_Pre() +{ + g_SMConVarAccessor.MarkCommandsAsGameDLL(); + g_SMConVarAccessor.UnregisterGameDLLCommands(); +} + bool BaseProvider::IsRemotePrintingAvailable() { return (echo_msg_func != NULL); diff --git a/sourcemm/episode1/provider_ep1.h b/sourcemm/episode1/provider_ep1.h index acd0a39..c09ae06 100644 --- a/sourcemm/episode1/provider_ep1.h +++ b/sourcemm/episode1/provider_ep1.h @@ -28,6 +28,7 @@ public: virtual void Notify_DLLInit_Pre(void *gamedll, CreateInterfaceFn engineFactory, CreateInterfaceFn serverFactory); + void Notify_DLLShutdown_Pre(); virtual void ServerCommand(const char *cmd); virtual ConVar *CreateConVar(const char *name, const char *defval, diff --git a/sourcemm/metamod.cpp b/sourcemm/metamod.cpp index a943738..6818e22 100644 --- a/sourcemm/metamod.cpp +++ b/sourcemm/metamod.cpp @@ -54,7 +54,6 @@ struct game_dll_t CreateInterfaceFn factory; }; -SourceHook::CallClass *g_GameDllPatch; String mod_path; String metamod_path; String full_bin_path; @@ -662,8 +661,6 @@ bool Handler_DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsF physics_factory = physicsFactory; gpGlobals = pGlobals; - g_GameDllPatch = SH_GET_CALLCLASS(server); - provider->Notify_DLLInit_Pre(server, engineFactory, gamedll_info.factory); metamod_version = provider->CreateConVar("metamod_version", @@ -724,10 +721,9 @@ void Handler_DLLShutdown() /* Unload plugins */ g_PluginMngr.UnloadAll(); - SH_CALL(g_GameDllPatch, &IServerGameDLL::DLLShutdown)(); + provider->Notify_DLLShutdown_Pre(); - SH_RELEASE_CALLCLASS(g_GameDllPatch); - g_GameDllPatch = NULL; + SH_CALL(server, &IServerGameDLL::DLLShutdown)(); g_SourceHook.CompleteShutdown(); diff --git a/sourcemm/metamod_provider.h b/sourcemm/metamod_provider.h index b2c5347..ff01159 100644 --- a/sourcemm/metamod_provider.h +++ b/sourcemm/metamod_provider.h @@ -163,6 +163,8 @@ namespace SourceMM CreateInterfaceFn engineFactory, CreateInterfaceFn serverFactory) =0; + virtual void Notify_DLLShutdown_Pre() =0; + /** * @brief Wrapper around IVEngineServer::ServerCommand() * From 8028dc4d42a0de5c0ca7c9d8b40cd159f4a61bc6 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 29 Sep 2007 15:35:59 +0000 Subject: [PATCH 20/25] re-added vsp listener support --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40441 --- sourcemm/ISmmAPI.h | 13 ++++ sourcemm/Makefile.ep1 | 2 +- sourcemm/episode1/provider_ep1.cpp | 5 +- sourcemm/episode1/vsp_listener.cpp | 111 +++++++++++++++++++++++++++++ sourcemm/episode1/vsp_listener.h | 37 ++++++++++ sourcemm/metamod.cpp | 36 ++++++++-- sourcemm/metamod.h | 2 + sourcemm/metamod_plugins.h | 1 + 8 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 sourcemm/episode1/vsp_listener.cpp create mode 100644 sourcemm/episode1/vsp_listener.h diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h index e872262..466e129 100644 --- a/sourcemm/ISmmAPI.h +++ b/sourcemm/ISmmAPI.h @@ -343,6 +343,19 @@ public: // Added in 1.6.0 (1:7) * @return A SOURCE_ENGINE_* constant value. */ virtual int GetSourceEngineBuild() =0; + + /** + * @brief Returns the VSP listener loaded. + * + * This is useful for late-loading plugins which need to decide whether + * to add a listener or not (or need to get the pointer at all). + * + * @param Optional pointer to store the VSP version. + * @return IServerPluginCallbacks pointer, or NULL if an + * IMetamodListener event has yet to occur for + * EnableVSPListener(). + */ + virtual IServerPluginCallbacks *GetVSPInfo(int *pVersion) =0; }; diff --git a/sourcemm/Makefile.ep1 b/sourcemm/Makefile.ep1 index e051cb5..9f8e12b 100644 --- a/sourcemm/Makefile.ep1 +++ b/sourcemm/Makefile.ep1 @@ -17,7 +17,7 @@ HL2PUB = $(HL2SDK)/public HL2LIB = $(HL2SDK)/linux_sdk OBJECTS = metamod.cpp metamod_util.cpp metamod_console.cpp metamod_oslink.cpp metamod_plugins.cpp \ - sourcehook.cpp episode1/console.cpp episode1/provider_ep1.cpp + sourcehook.cpp episode1/console.cpp episode1/provider_ep1.cpp episode1/vsp_listener.cpp LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc diff --git a/sourcemm/episode1/provider_ep1.cpp b/sourcemm/episode1/provider_ep1.cpp index 27c2d52..77667fb 100644 --- a/sourcemm/episode1/provider_ep1.cpp +++ b/sourcemm/episode1/provider_ep1.cpp @@ -9,6 +9,7 @@ #include "provider_ep1.h" #include "console.h" #include "metamod_console.h" +#include "vsp_listener.h" /* Types */ typedef void (*CONPRINTF_FUNC)(const char *, ...); @@ -33,6 +34,7 @@ ICvar *icvar = NULL; ISmmAPI *metamod_api = NULL; IVEngineServer *engine = NULL; IServerGameClients *gameclients = NULL; +VSPListener g_VspListener; BaseProvider g_Ep1Provider; IMetamodSourceProvider *provider = &g_Ep1Provider; @@ -303,7 +305,8 @@ ConVar *BaseProvider::CreateConVar(const char *name, IServerPluginCallbacks *BaseProvider::GetVSPCallbacks(const char *iface) { - return NULL; + g_VspListener.SetLoadable(true); + return &g_VspListener; } class GlobCommand : public IMetamodSourceCommandInfo diff --git a/sourcemm/episode1/vsp_listener.cpp b/sourcemm/episode1/vsp_listener.cpp new file mode 100644 index 0000000..4a89902 --- /dev/null +++ b/sourcemm/episode1/vsp_listener.cpp @@ -0,0 +1,111 @@ +#include "vsp_listener.h" +#include "svn_version.h" +#include "metamod.h" + +using namespace SourceMM; + +VSPListener::VSPListener() +{ + m_bLoaded = false; + m_bLoadable = false; +} + +void VSPListener::ClientActive(edict_t *pEntity) +{ +} + +PLUGIN_RESULT VSPListener::ClientCommand(edict_t *pEntity) +{ + return PLUGIN_CONTINUE; +} + +PLUGIN_RESULT VSPListener::ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) +{ + return PLUGIN_CONTINUE; +} + +void VSPListener::ClientDisconnect(edict_t *pEntity) +{ +} + +void VSPListener::ClientPutInServer(edict_t *pEntity, char const *playername) +{ +} + +void VSPListener::ClientSettingsChanged(edict_t *pEdict) +{ +} + +void VSPListener::SetCommandClient(int index) +{ +} + +void VSPListener::GameFrame(bool simulating) +{ +} + +const char *VSPListener::GetPluginDescription() +{ + return "Metamod:Source Interface v" SVN_FILE_VERSION_STRING; +} + +bool VSPListener::IsLoaded() +{ + return m_bLoaded; +} + +void VSPListener::LevelInit(char const *pMapName) +{ +} + +void VSPListener::LevelShutdown() +{ +} + +PLUGIN_RESULT VSPListener::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) +{ + return PLUGIN_CONTINUE; +} + +void VSPListener::Pause() +{ +} + +void VSPListener::UnPause() +{ +} + +void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) +{ +} + +void VSPListener::Unload() +{ +} + +void VSPListener::SetLoadable(bool set) +{ + m_bLoadable = set; +} + +bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) +{ + if (!m_bLoadable) + { + Warning("Do not manually load Metamod:Source as a Valve Server Plugin\n"); + return false; + } + + if (m_bLoaded) + { + return false; + } + + m_bLoaded = true; + SetLoadable(false); + + g_Metamod.NotifyVSPListening(this); + + return true; +} + diff --git a/sourcemm/episode1/vsp_listener.h b/sourcemm/episode1/vsp_listener.h new file mode 100644 index 0000000..228e902 --- /dev/null +++ b/sourcemm/episode1/vsp_listener.h @@ -0,0 +1,37 @@ +#ifndef _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ +#define _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ + +#include "iserverplugin.h" + +class VSPListener : public IServerPluginCallbacks +{ +public: + VSPListener(); +public: + virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory); + virtual void Unload(); + virtual void Pause(); + virtual void UnPause(); + virtual const char *GetPluginDescription(); + virtual void LevelInit(char const *pMapName); + virtual void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); + virtual void GameFrame(bool simulating); + virtual void LevelShutdown(void); + virtual void ClientActive(edict_t *pEntity); + virtual void ClientDisconnect(edict_t *pEntity); + virtual void ClientPutInServer(edict_t *pEntity, char const *playername); + virtual void SetCommandClient(int index); + virtual void ClientSettingsChanged(edict_t *pEdict); + virtual PLUGIN_RESULT ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); + virtual PLUGIN_RESULT ClientCommand(edict_t *pEntity); + virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID); +public: + bool IsLoaded(); + void SetLoadable(bool loadable); +private: + bool m_bLoaded; + bool m_bLoadable; +}; + +#endif //_INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ + diff --git a/sourcemm/metamod.cpp b/sourcemm/metamod.cpp index 6818e22..daf5780 100644 --- a/sourcemm/metamod.cpp +++ b/sourcemm/metamod.cpp @@ -80,6 +80,7 @@ SourceHook::CSourceHookImpl g_SourceHook; SourceHook::ISourceHook *g_SHPtr = &g_SourceHook; PluginId g_PLID = Pl_Console; META_RES last_meta_res; +IServerPluginCallbacks *vsp_callbacks = NULL; MetamodSource g_Metamod; @@ -187,19 +188,19 @@ SMM_API void *CreateInterface(const char *iface, int *ret) if (strncmp(iface, "ISERVERPLUGINCALLBACKS", 22) == 0) { - IServerPluginCallbacks *pCallbacks = provider->GetVSPCallbacks(iface); + vsp_callbacks = provider->GetVSPCallbacks(iface); - if (pCallbacks && vsp_version == 0) + if (vsp_callbacks != NULL && vsp_version == 0) { vsp_version = atoi(&iface[22]); } - if (pCallbacks && ret) + if (ret) { - *ret = pCallbacks ? IFACE_OK : IFACE_FAILED; + *ret = (vsp_callbacks != NULL) ? IFACE_OK : IFACE_FAILED; } - return pCallbacks; + return vsp_callbacks; } if (!parsed_game_info) @@ -221,6 +222,15 @@ SMM_API void *CreateInterface(const char *iface, int *ret) /* Get value of -game from command line, defaulting to hl2 as engine seems to do */ game_dir = provider->GetCommandLineValue("-game", "hl2"); + if (strcasecmp(game_dir, "ship") == 0) + { + engine_build = SOURCE_ENGINE_ORIGINAL; + } + else + { + engine_build = SOURCE_ENGINE_EPISODEONE; + } + /* Get absolute path */ abspath(game_path, game_dir); mod_path.assign(game_path); @@ -1203,3 +1213,19 @@ int MetamodSource::GetSourceEngineBuild() { return engine_build; } + +void MetamodSource::NotifyVSPListening(IServerPluginCallbacks *callbacks) +{ + ITER_EVENT(OnVSPListening, (callbacks)); +} + +IServerPluginCallbacks *MetamodSource::GetVSPInfo(int *pVersion) +{ + if (pVersion) + { + *pVersion = vsp_version; + } + + return vsp_callbacks; +} + diff --git a/sourcemm/metamod.h b/sourcemm/metamod.h index eaff4ed..cb03391 100644 --- a/sourcemm/metamod.h +++ b/sourcemm/metamod.h @@ -71,10 +71,12 @@ public: const char *GetUserMessage(int index, int *size=NULL); int GetVSPVersion(); int GetSourceEngineBuild(); + IServerPluginCallbacks *GetVSPInfo(int *pVersion); public: const char *GetGameBinaryPath(); const char *GetPluginsFile(); void UnregisterConCommandBase(PluginId id, ConCommandBase *pCommand); + void NotifyVSPListening(IServerPluginCallbacks *callbacks); }; void LogMessage(const char *msg, ...); diff --git a/sourcemm/metamod_plugins.h b/sourcemm/metamod_plugins.h index dbc038d..d4ba6af 100644 --- a/sourcemm/metamod_plugins.h +++ b/sourcemm/metamod_plugins.h @@ -147,3 +147,4 @@ typedef SourceHook::List::iterator PluginIt extern SourceMM::CPluginManager g_PluginMngr; #endif //_INCLUDE_CPLUGIN_H + From 59722a32a64cf184b01e4169361ce8ff3b953fe9 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 29 Sep 2007 16:16:24 +0000 Subject: [PATCH 21/25] added file headers and svn props --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40442 --- sourcemm/IPluginManager.h | 35 +++++++++++++++++------- sourcemm/ISmmAPI.h | 35 +++++++++++++++++------- sourcemm/ISmmPlugin.h | 35 +++++++++++++++++------- sourcemm/episode1/console.cpp | 27 +++++++++++++++++++ sourcemm/episode1/console.h | 27 +++++++++++++++++++ sourcemm/episode1/msvc8/sourcemm.vcproj | 16 ++++++++--- sourcemm/episode1/provider_ep1.cpp | 28 +++++++++++++++++++ sourcemm/episode1/provider_ep1.h | 27 +++++++++++++++++++ sourcemm/episode1/vsp_listener.cpp | 27 +++++++++++++++++++ sourcemm/episode1/vsp_listener.h | 27 +++++++++++++++++++ sourcemm/metamod.cpp | 32 ++++++++++++++++------ sourcemm/metamod.h | 29 +++++++++++++++----- sourcemm/metamod_console.cpp | 29 +++++++++++++++----- sourcemm/metamod_console.h | 29 +++++++++++++++----- sourcemm/metamod_oslink.cpp | 36 ++++++++++++++++--------- sourcemm/metamod_oslink.h | 30 ++++++++++++++++----- sourcemm/metamod_plugins.cpp | 29 +++++++++++++++----- sourcemm/metamod_plugins.h | 35 +++++++++++++++++------- sourcemm/metamod_provider.h | 27 +++++++++++++++++++ sourcemm/metamod_util.cpp | 29 +++++++++++++++----- sourcemm/metamod_util.h | 29 +++++++++++++++----- 21 files changed, 516 insertions(+), 102 deletions(-) diff --git a/sourcemm/IPluginManager.h b/sourcemm/IPluginManager.h index fd0662f..c528008 100644 --- a/sourcemm/IPluginManager.h +++ b/sourcemm/IPluginManager.h @@ -1,12 +1,29 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ #ifndef _INCLUDE_PLUGINMANAGER_H #define _INCLUDE_PLUGINMANAGER_H diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h index 466e129..b5719f5 100644 --- a/sourcemm/ISmmAPI.h +++ b/sourcemm/ISmmAPI.h @@ -1,12 +1,29 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ #ifndef _INCLUDE_ISMM_API_H #define _INCLUDE_ISMM_API_H diff --git a/sourcemm/ISmmPlugin.h b/sourcemm/ISmmPlugin.h index 99769e5..746eefe 100644 --- a/sourcemm/ISmmPlugin.h +++ b/sourcemm/ISmmPlugin.h @@ -1,12 +1,29 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ #ifndef _INCLUDE_ISMM_PLUGIN_H #define _INCLUDE_ISMM_PLUGIN_H diff --git a/sourcemm/episode1/console.cpp b/sourcemm/episode1/console.cpp index 5903672..1f64a2a 100644 --- a/sourcemm/episode1/console.cpp +++ b/sourcemm/episode1/console.cpp @@ -1,3 +1,30 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + #include "console.h" #include "provider_ep1.h" diff --git a/sourcemm/episode1/console.h b/sourcemm/episode1/console.h index 3e388d7..6f22cdb 100644 --- a/sourcemm/episode1/console.h +++ b/sourcemm/episode1/console.h @@ -1,3 +1,30 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + #ifndef _INCLUDE_CONSOLE_MMS_H_ #define _INCLUDE_CONSOLE_MMS_H_ diff --git a/sourcemm/episode1/msvc8/sourcemm.vcproj b/sourcemm/episode1/msvc8/sourcemm.vcproj index ae17204..2f620e3 100644 --- a/sourcemm/episode1/msvc8/sourcemm.vcproj +++ b/sourcemm/episode1/msvc8/sourcemm.vcproj @@ -265,6 +265,10 @@ RelativePath="..\..\metamod_console.h" > + + @@ -277,10 +281,6 @@ RelativePath="..\..\metamod_util.h" > - - + + + + #include "convar_smm.h" #include diff --git a/sourcemm/episode1/provider_ep1.h b/sourcemm/episode1/provider_ep1.h index c09ae06..0a22f10 100644 --- a/sourcemm/episode1/provider_ep1.h +++ b/sourcemm/episode1/provider_ep1.h @@ -1,3 +1,30 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + #ifndef _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ #define _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ diff --git a/sourcemm/episode1/vsp_listener.cpp b/sourcemm/episode1/vsp_listener.cpp index 4a89902..9097732 100644 --- a/sourcemm/episode1/vsp_listener.cpp +++ b/sourcemm/episode1/vsp_listener.cpp @@ -1,3 +1,30 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + #include "vsp_listener.h" #include "svn_version.h" #include "metamod.h" diff --git a/sourcemm/episode1/vsp_listener.h b/sourcemm/episode1/vsp_listener.h index 228e902..558be21 100644 --- a/sourcemm/episode1/vsp_listener.h +++ b/sourcemm/episode1/vsp_listener.h @@ -1,3 +1,30 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + #ifndef _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ #define _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ diff --git a/sourcemm/metamod.cpp b/sourcemm/metamod.cpp index daf5780..8c6e55e 100644 --- a/sourcemm/metamod.cpp +++ b/sourcemm/metamod.cpp @@ -1,13 +1,28 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== * - * License: zlib/libpng + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: * - * Author(s): David "BAILOPAN" Anderson - * Contributor(s): Scott "Damaged Soul" Ehlert - * : Pavol "PM OnoTo" Marko - * ============================ + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ */ #if defined _DEBUG @@ -21,6 +36,7 @@ #include "metamod_plugins.h" #include "metamod_util.h" #include "metamod_console.h" +#include "metamod_oslink.h" #if defined DEBUG2 #undef DEBUG2 #define _DEBUG diff --git a/sourcemm/metamod.h b/sourcemm/metamod.h index cb03391..291101c 100644 --- a/sourcemm/metamod.h +++ b/sourcemm/metamod.h @@ -1,11 +1,28 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== * - * License: zlib/libpng + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: * - * Author(s): David "BAILOPAN" Anderson - * ============================ + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ */ #ifndef _INCLUDE_SOURCEMM_H diff --git a/sourcemm/metamod_console.cpp b/sourcemm/metamod_console.cpp index 18183d4..3c81b94 100644 --- a/sourcemm/metamod_console.cpp +++ b/sourcemm/metamod_console.cpp @@ -1,11 +1,28 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== * - * License: zlib/libpng + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: * - * Author(s): David "BAILOPAN" Anderson - * ============================ + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ */ #if defined _DEBUG diff --git a/sourcemm/metamod_console.h b/sourcemm/metamod_console.h index b0d15ba..de5c868 100644 --- a/sourcemm/metamod_console.h +++ b/sourcemm/metamod_console.h @@ -1,11 +1,28 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== * - * License: zlib/libpng + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: * - * Author(s): David "BAILOPAN" Anderson - * ============================ + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ */ #ifndef _INCLUDE_CONCOMMANDS_H diff --git a/sourcemm/metamod_oslink.cpp b/sourcemm/metamod_oslink.cpp index 9a8ca10..42f1517 100644 --- a/sourcemm/metamod_oslink.cpp +++ b/sourcemm/metamod_oslink.cpp @@ -1,16 +1,28 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - /** - * @brief Implements OS-dependant functions from oslink.h - * @file oslink.cpp + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ */ #include "metamod_oslink.h" diff --git a/sourcemm/metamod_oslink.h b/sourcemm/metamod_oslink.h index 77e4b75..8dcf4ca 100644 --- a/sourcemm/metamod_oslink.h +++ b/sourcemm/metamod_oslink.h @@ -1,11 +1,28 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== * - * License: zlib/libpng + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: * - * Author(s): David "BAILOPAN" Anderson - * ============================ + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ */ #ifndef _INCLUDE_OSLINK_H @@ -37,6 +54,7 @@ #define ALT_SEP_CHAR '/' #define PATH_SIZE MAX_PATH #define SERVER_DLL "server.dll" + #define strcasecmp stricmp #elif defined __linux__ #define OS_LINUX #include diff --git a/sourcemm/metamod_plugins.cpp b/sourcemm/metamod_plugins.cpp index a71b72c..4bb0bbe 100644 --- a/sourcemm/metamod_plugins.cpp +++ b/sourcemm/metamod_plugins.cpp @@ -1,11 +1,28 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== * - * License: zlib/libpng + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: * - * Author(s): David "BAILOPAN" Anderson - * ============================ + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ */ #if defined _DEBUG diff --git a/sourcemm/metamod_plugins.h b/sourcemm/metamod_plugins.h index d4ba6af..f2e11c3 100644 --- a/sourcemm/metamod_plugins.h +++ b/sourcemm/metamod_plugins.h @@ -1,12 +1,29 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ #ifndef _INCLUDE_CPLUGIN_H #define _INCLUDE_CPLUGIN_H diff --git a/sourcemm/metamod_provider.h b/sourcemm/metamod_provider.h index ff01159..f7f324e 100644 --- a/sourcemm/metamod_provider.h +++ b/sourcemm/metamod_provider.h @@ -1,3 +1,30 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + #ifndef _INCLUDE_METAMOD_SOURCE_SUPPORT_H_ #define _INCLUDE_METAMOD_SOURCE_SUPPORT_H_ diff --git a/sourcemm/metamod_util.cpp b/sourcemm/metamod_util.cpp index 48f2d3d..730eddf 100644 --- a/sourcemm/metamod_util.cpp +++ b/sourcemm/metamod_util.cpp @@ -1,11 +1,28 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== * - * License: zlib/libpng + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: * - * Author(s): David "BAILOPAN" Anderson - * ============================ + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ */ #include diff --git a/sourcemm/metamod_util.h b/sourcemm/metamod_util.h index d02dd40..de507ee 100644 --- a/sourcemm/metamod_util.h +++ b/sourcemm/metamod_util.h @@ -1,11 +1,28 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== * - * License: zlib/libpng + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: * - * Author(s): David "BAILOPAN" Anderson - * ============================ + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ */ #ifndef _INCLUDE_UTIL_H From 51160e117e693107751a18784b03830b67f0335c Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 4 Oct 2007 19:04:56 +0000 Subject: [PATCH 22/25] mm:s now works on tf2. yay! --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40449 --- sourcemm/episode1/console.cpp | 288 ++++++------ sourcemm/episode1/console.h | 52 +-- sourcemm/episode1/vsp_listener.cpp | 226 ++++----- sourcemm/episode1/vsp_listener.h | 78 ++-- sourcemm/episode2/console.cpp | 57 +++ sourcemm/episode2/console.h | 55 +++ sourcemm/episode2/msvc8/sourcemm.sln | 20 + sourcemm/episode2/msvc8/sourcemm.vcproj | 333 +++++++++++++ sourcemm/episode2/provider_ep2.cpp | 598 ++++++++++++++++++++++++ sourcemm/episode2/provider_ep2.h | 89 ++++ sourcemm/episode2/vsp_listener.cpp | 141 ++++++ sourcemm/episode2/vsp_listener.h | 73 +++ sourcemm/metamod.cpp | 13 +- 13 files changed, 1693 insertions(+), 330 deletions(-) create mode 100644 sourcemm/episode2/console.cpp create mode 100644 sourcemm/episode2/console.h create mode 100644 sourcemm/episode2/msvc8/sourcemm.sln create mode 100644 sourcemm/episode2/msvc8/sourcemm.vcproj create mode 100644 sourcemm/episode2/provider_ep2.cpp create mode 100644 sourcemm/episode2/provider_ep2.h create mode 100644 sourcemm/episode2/vsp_listener.cpp create mode 100644 sourcemm/episode2/vsp_listener.h diff --git a/sourcemm/episode1/console.cpp b/sourcemm/episode1/console.cpp index 1f64a2a..64cb498 100644 --- a/sourcemm/episode1/console.cpp +++ b/sourcemm/episode1/console.cpp @@ -23,147 +23,147 @@ * 3. This notice may not be removed or altered from any source distribution. * * Version: $Id$ - */ - -#include "console.h" -#include "provider_ep1.h" - -using namespace SourceHook; - -SMConVarAccessor g_SMConVarAccessor; - -class CAlwaysRegisterableCommand : public ConCommandBase -{ -public: - CAlwaysRegisterableCommand() - { - Create("metamod_eternal", NULL, FCVAR_UNREGISTERED|FCVAR_GAMEDLL); - } - bool IsRegistered( void ) const - { - return false; - } - void BringToFront() - { - // First, let's try to find us! - ConCommandBase *pPtr = icvar->GetCommands(); - - if (pPtr == this) - { - // We are already at the beginning; Nothing to do - return; - } - - while (pPtr) - { - if (pPtr == this) - { - break; - } - ConCommandBase *pPrev = NULL; - while (pPtr) - { - if (pPtr == this) - { - break; - } - pPrev = pPtr; - pPtr = const_cast(pPtr->GetNext()); - } - if (pPrev && pPtr == this) - { - pPrev->SetNext(m_pNext); // Remove us from the list - } - // Now, register us - SetNext(NULL); - icvar->RegisterConCommandBase(this); - } - } -} s_EternalCommand; - -bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) -{ - m_RegisteredCommands.push_back(pCommand); - pCommand->SetNext(NULL); - icvar->RegisterConCommandBase(pCommand); - - return true; -} - -bool SMConVarAccessor::Register(ConCommandBase *pCommand) -{ - pCommand->SetNext(NULL); - icvar->RegisterConCommandBase(pCommand); - - return true; -} - -void SMConVarAccessor::MarkCommandsAsGameDLL() -{ - for (List::iterator iter = m_RegisteredCommands.begin(); - iter != m_RegisteredCommands.end(); ++iter) - { - (*iter)->AddFlags(FCVAR_GAMEDLL); - } -} - -void SMConVarAccessor::UnregisterGameDLLCommands() -{ - ConCommandBase *begin = icvar->GetCommands(); - ConCommandBase *iter = begin; - ConCommandBase *prev = NULL; - while (iter) - { - /* Watch out for the ETERNAL COMMAND! */ - if (iter != &s_EternalCommand && iter->IsBitSet(FCVAR_GAMEDLL)) - { - /* Remove it! */ - if (iter == begin) - { - s_EternalCommand.BringToFront(); - iter = const_cast(iter->GetNext()); - s_EternalCommand.SetNext(iter); - prev = &s_EternalCommand; - continue; - } - else - { - iter = const_cast(iter->GetNext()); - prev->SetNext(iter); - continue; - } - } - prev = iter; - iter = const_cast(iter->GetNext()); - } -} - -void SMConVarAccessor::Unregister(ConCommandBase *pCommand) -{ - ConCommandBase *ptr = icvar->GetCommands(); - - if (ptr == pCommand) - { - s_EternalCommand.BringToFront(); - s_EternalCommand.SetNext(const_cast(pCommand->GetNext())); - } - else - { - /* Find us and unregister us */ - ConCommandBase *pPrev = NULL; - while (ptr) - { - if (ptr == pCommand) - { - break; - } - pPrev = ptr; - ptr = const_cast(ptr->GetNext()); - } - if (pPrev && ptr == pCommand) - { - pPrev->SetNext(const_cast(pCommand->GetNext())); - } - } -} - + */ + +#include "console.h" +#include "provider_ep1.h" + +using namespace SourceHook; + +SMConVarAccessor g_SMConVarAccessor; + +class CAlwaysRegisterableCommand : public ConCommandBase +{ +public: + CAlwaysRegisterableCommand() + { + Create("metamod_eternal", NULL, FCVAR_UNREGISTERED|FCVAR_GAMEDLL); + } + bool IsRegistered( void ) const + { + return false; + } + void BringToFront() + { + // First, let's try to find us! + ConCommandBase *pPtr = icvar->GetCommands(); + + if (pPtr == this) + { + // We are already at the beginning; Nothing to do + return; + } + + while (pPtr) + { + if (pPtr == this) + { + break; + } + ConCommandBase *pPrev = NULL; + while (pPtr) + { + if (pPtr == this) + { + break; + } + pPrev = pPtr; + pPtr = const_cast(pPtr->GetNext()); + } + if (pPrev && pPtr == this) + { + pPrev->SetNext(m_pNext); // Remove us from the list + } + // Now, register us + SetNext(NULL); + icvar->RegisterConCommandBase(this); + } + } +} s_EternalCommand; + +bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) +{ + m_RegisteredCommands.push_back(pCommand); + pCommand->SetNext(NULL); + icvar->RegisterConCommandBase(pCommand); + + return true; +} + +bool SMConVarAccessor::Register(ConCommandBase *pCommand) +{ + pCommand->SetNext(NULL); + icvar->RegisterConCommandBase(pCommand); + + return true; +} + +void SMConVarAccessor::MarkCommandsAsGameDLL() +{ + for (List::iterator iter = m_RegisteredCommands.begin(); + iter != m_RegisteredCommands.end(); ++iter) + { + (*iter)->AddFlags(FCVAR_GAMEDLL); + } +} + +void SMConVarAccessor::UnregisterGameDLLCommands() +{ + ConCommandBase *begin = icvar->GetCommands(); + ConCommandBase *iter = begin; + ConCommandBase *prev = NULL; + while (iter) + { + /* Watch out for the ETERNAL COMMAND! */ + if (iter != &s_EternalCommand && iter->IsBitSet(FCVAR_GAMEDLL)) + { + /* Remove it! */ + if (iter == begin) + { + s_EternalCommand.BringToFront(); + iter = const_cast(iter->GetNext()); + s_EternalCommand.SetNext(iter); + prev = &s_EternalCommand; + continue; + } + else + { + iter = const_cast(iter->GetNext()); + prev->SetNext(iter); + continue; + } + } + prev = iter; + iter = const_cast(iter->GetNext()); + } +} + +void SMConVarAccessor::Unregister(ConCommandBase *pCommand) +{ + ConCommandBase *ptr = icvar->GetCommands(); + + if (ptr == pCommand) + { + s_EternalCommand.BringToFront(); + s_EternalCommand.SetNext(const_cast(pCommand->GetNext())); + } + else + { + /* Find us and unregister us */ + ConCommandBase *pPrev = NULL; + while (ptr) + { + if (ptr == pCommand) + { + break; + } + pPrev = ptr; + ptr = const_cast(ptr->GetNext()); + } + if (pPrev && ptr == pCommand) + { + pPrev->SetNext(const_cast(pCommand->GetNext())); + } + } +} + diff --git a/sourcemm/episode1/console.h b/sourcemm/episode1/console.h index 6f22cdb..a446be6 100644 --- a/sourcemm/episode1/console.h +++ b/sourcemm/episode1/console.h @@ -23,29 +23,29 @@ * 3. This notice may not be removed or altered from any source distribution. * * Version: $Id$ - */ - -#ifndef _INCLUDE_CONSOLE_MMS_H_ -#define _INCLUDE_CONSOLE_MMS_H_ - -#include -#include -#include "convar_smm.h" -#include - -class SMConVarAccessor : public IConCommandBaseAccessor -{ -public: - bool RegisterConCommandBase(ConCommandBase *pCommand); - bool Register(ConCommandBase *pCommand); - void MarkCommandsAsGameDLL(); - void Unregister(ConCommandBase *pCommand); - void UnregisterGameDLLCommands(); -private: - SourceHook::List m_RegisteredCommands; -}; - -extern SMConVarAccessor g_SMConVarAccessor; - -#endif //_INCLUDE_CONSOLE_MMS_H_ - + */ + +#ifndef _INCLUDE_CONSOLE_MMS_H_ +#define _INCLUDE_CONSOLE_MMS_H_ + +#include +#include +#include "convar_smm.h" +#include + +class SMConVarAccessor : public IConCommandBaseAccessor +{ +public: + bool RegisterConCommandBase(ConCommandBase *pCommand); + bool Register(ConCommandBase *pCommand); + void MarkCommandsAsGameDLL(); + void Unregister(ConCommandBase *pCommand); + void UnregisterGameDLLCommands(); +private: + SourceHook::List m_RegisteredCommands; +}; + +extern SMConVarAccessor g_SMConVarAccessor; + +#endif //_INCLUDE_CONSOLE_MMS_H_ + diff --git a/sourcemm/episode1/vsp_listener.cpp b/sourcemm/episode1/vsp_listener.cpp index 9097732..370a66d 100644 --- a/sourcemm/episode1/vsp_listener.cpp +++ b/sourcemm/episode1/vsp_listener.cpp @@ -23,116 +23,116 @@ * 3. This notice may not be removed or altered from any source distribution. * * Version: $Id$ - */ - -#include "vsp_listener.h" -#include "svn_version.h" -#include "metamod.h" - -using namespace SourceMM; - -VSPListener::VSPListener() -{ - m_bLoaded = false; - m_bLoadable = false; -} - -void VSPListener::ClientActive(edict_t *pEntity) -{ -} - -PLUGIN_RESULT VSPListener::ClientCommand(edict_t *pEntity) -{ - return PLUGIN_CONTINUE; -} - -PLUGIN_RESULT VSPListener::ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::ClientDisconnect(edict_t *pEntity) -{ -} - -void VSPListener::ClientPutInServer(edict_t *pEntity, char const *playername) -{ -} - -void VSPListener::ClientSettingsChanged(edict_t *pEdict) -{ -} - -void VSPListener::SetCommandClient(int index) -{ -} - -void VSPListener::GameFrame(bool simulating) -{ -} - -const char *VSPListener::GetPluginDescription() -{ - return "Metamod:Source Interface v" SVN_FILE_VERSION_STRING; -} - -bool VSPListener::IsLoaded() -{ - return m_bLoaded; -} - -void VSPListener::LevelInit(char const *pMapName) -{ -} - -void VSPListener::LevelShutdown() -{ -} - -PLUGIN_RESULT VSPListener::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::Pause() -{ -} - -void VSPListener::UnPause() -{ -} - -void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) -{ -} - -void VSPListener::Unload() -{ -} - -void VSPListener::SetLoadable(bool set) -{ - m_bLoadable = set; -} - -bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) -{ - if (!m_bLoadable) - { - Warning("Do not manually load Metamod:Source as a Valve Server Plugin\n"); - return false; - } - - if (m_bLoaded) - { - return false; - } - - m_bLoaded = true; - SetLoadable(false); - - g_Metamod.NotifyVSPListening(this); - - return true; -} - + */ + +#include "vsp_listener.h" +#include "svn_version.h" +#include "metamod.h" + +using namespace SourceMM; + +VSPListener::VSPListener() +{ + m_bLoaded = false; + m_bLoadable = false; +} + +void VSPListener::ClientActive(edict_t *pEntity) +{ +} + +PLUGIN_RESULT VSPListener::ClientCommand(edict_t *pEntity) +{ + return PLUGIN_CONTINUE; +} + +PLUGIN_RESULT VSPListener::ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) +{ + return PLUGIN_CONTINUE; +} + +void VSPListener::ClientDisconnect(edict_t *pEntity) +{ +} + +void VSPListener::ClientPutInServer(edict_t *pEntity, char const *playername) +{ +} + +void VSPListener::ClientSettingsChanged(edict_t *pEdict) +{ +} + +void VSPListener::SetCommandClient(int index) +{ +} + +void VSPListener::GameFrame(bool simulating) +{ +} + +const char *VSPListener::GetPluginDescription() +{ + return "Metamod:Source Interface v" SVN_FILE_VERSION_STRING; +} + +bool VSPListener::IsLoaded() +{ + return m_bLoaded; +} + +void VSPListener::LevelInit(char const *pMapName) +{ +} + +void VSPListener::LevelShutdown() +{ +} + +PLUGIN_RESULT VSPListener::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) +{ + return PLUGIN_CONTINUE; +} + +void VSPListener::Pause() +{ +} + +void VSPListener::UnPause() +{ +} + +void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) +{ +} + +void VSPListener::Unload() +{ +} + +void VSPListener::SetLoadable(bool set) +{ + m_bLoadable = set; +} + +bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) +{ + if (!m_bLoadable) + { + Warning("Do not manually load Metamod:Source as a Valve Server Plugin\n"); + return false; + } + + if (m_bLoaded) + { + return false; + } + + m_bLoaded = true; + SetLoadable(false); + + g_Metamod.NotifyVSPListening(this); + + return true; +} + diff --git a/sourcemm/episode1/vsp_listener.h b/sourcemm/episode1/vsp_listener.h index 558be21..8b5af85 100644 --- a/sourcemm/episode1/vsp_listener.h +++ b/sourcemm/episode1/vsp_listener.h @@ -23,42 +23,42 @@ * 3. This notice may not be removed or altered from any source distribution. * * Version: $Id$ - */ - -#ifndef _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ -#define _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ - -#include "iserverplugin.h" - -class VSPListener : public IServerPluginCallbacks -{ -public: - VSPListener(); -public: - virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory); - virtual void Unload(); - virtual void Pause(); - virtual void UnPause(); - virtual const char *GetPluginDescription(); - virtual void LevelInit(char const *pMapName); - virtual void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); - virtual void GameFrame(bool simulating); - virtual void LevelShutdown(void); - virtual void ClientActive(edict_t *pEntity); - virtual void ClientDisconnect(edict_t *pEntity); - virtual void ClientPutInServer(edict_t *pEntity, char const *playername); - virtual void SetCommandClient(int index); - virtual void ClientSettingsChanged(edict_t *pEdict); - virtual PLUGIN_RESULT ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); - virtual PLUGIN_RESULT ClientCommand(edict_t *pEntity); - virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID); -public: - bool IsLoaded(); - void SetLoadable(bool loadable); -private: - bool m_bLoaded; - bool m_bLoadable; -}; - -#endif //_INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ - + */ + +#ifndef _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ +#define _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ + +#include "iserverplugin.h" + +class VSPListener : public IServerPluginCallbacks +{ +public: + VSPListener(); +public: + virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory); + virtual void Unload(); + virtual void Pause(); + virtual void UnPause(); + virtual const char *GetPluginDescription(); + virtual void LevelInit(char const *pMapName); + virtual void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); + virtual void GameFrame(bool simulating); + virtual void LevelShutdown(void); + virtual void ClientActive(edict_t *pEntity); + virtual void ClientDisconnect(edict_t *pEntity); + virtual void ClientPutInServer(edict_t *pEntity, char const *playername); + virtual void SetCommandClient(int index); + virtual void ClientSettingsChanged(edict_t *pEdict); + virtual PLUGIN_RESULT ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); + virtual PLUGIN_RESULT ClientCommand(edict_t *pEntity); + virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID); +public: + bool IsLoaded(); + void SetLoadable(bool loadable); +private: + bool m_bLoaded; + bool m_bLoadable; +}; + +#endif //_INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ + diff --git a/sourcemm/episode2/console.cpp b/sourcemm/episode2/console.cpp new file mode 100644 index 0000000..61c7aef --- /dev/null +++ b/sourcemm/episode2/console.cpp @@ -0,0 +1,57 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + +#include "console.h" +#include "provider_ep2.h" + +using namespace SourceHook; + +SMConVarAccessor g_SMConVarAccessor; + +static int s_nDLLIdentifier = 0x3058132; // A unique identifier indicating which DLL this convar came from + +bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) +{ + pCommand->SetNext(NULL); + icvar->RegisterConCommand(pCommand); + + return true; +} + +bool SMConVarAccessor::Register(ConCommandBase *pCommand) +{ + pCommand->SetNext(NULL); + icvar->RegisterConCommand(pCommand); + + return true; +} + +void SMConVarAccessor::Unregister(ConCommandBase *pCommand) +{ + icvar->UnregisterConCommand(pCommand); +} + diff --git a/sourcemm/episode2/console.h b/sourcemm/episode2/console.h new file mode 100644 index 0000000..004cb8f --- /dev/null +++ b/sourcemm/episode2/console.h @@ -0,0 +1,55 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + +#ifndef _INCLUDE_CONSOLE_MMS_H_ +#define _INCLUDE_CONSOLE_MMS_H_ + +#if defined _DEBUG +#define DEBUG2 +#undef _DEBUG +#endif +#include +#include +#include "convar.h" +#include +#if defined DEBUG2 +#undef DEBUG2 +#define _DEBUG +#endif + +class SMConVarAccessor : public IConCommandBaseAccessor +{ +public: + bool RegisterConCommandBase(ConCommandBase *pCommand); + bool Register(ConCommandBase *pCommand); + void Unregister(ConCommandBase *pCommand); +}; + +extern SMConVarAccessor g_SMConVarAccessor; + +#endif //_INCLUDE_CONSOLE_MMS_H_ + diff --git a/sourcemm/episode2/msvc8/sourcemm.sln b/sourcemm/episode2/msvc8/sourcemm.sln new file mode 100644 index 0000000..b338452 --- /dev/null +++ b/sourcemm/episode2/msvc8/sourcemm.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.ActiveCfg = Debug|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.Build.0 = Debug|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.ActiveCfg = Release|Win32 + {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/sourcemm/episode2/msvc8/sourcemm.vcproj b/sourcemm/episode2/msvc8/sourcemm.vcproj new file mode 100644 index 0000000..db2ff0d --- /dev/null +++ b/sourcemm/episode2/msvc8/sourcemm.vcproj @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sourcemm/episode2/provider_ep2.cpp b/sourcemm/episode2/provider_ep2.cpp new file mode 100644 index 0000000..f82052e --- /dev/null +++ b/sourcemm/episode2/provider_ep2.cpp @@ -0,0 +1,598 @@ + +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + +#if defined _DEBUG +#define DEBUG2 +#undef _DEBUG +#endif +#include +#include +#include +#include +#include +#include +#include +#include "../metamod_util.h" +#include "provider_ep2.h" +#include "console.h" +#include "metamod_console.h" +#include "vsp_listener.h" +#if defined DEBUG2 +#undef DEBUG2 +#define _DEBUG +#endif + +/* Types */ +typedef void (*CONPRINTF_FUNC)(const char *, ...); +struct UsrMsgInfo +{ + int size; + String name; +}; +/* Imports */ +#undef CommandLine +DLL_IMPORT ICommandLine *CommandLine(); +/* Functions */ +CONPRINTF_FUNC ExtractRemotePrinter(void *addr); +bool CacheUserMessages(); +void ClientCommand(edict_t *pEdict, const CCommand &args); +void LocalCommand_Meta(const CCommand &args); +void _ServerCommand(); +/* Variables */ +bool usermsgs_extracted = false; +CVector usermsgs_list; +CONPRINTF_FUNC echo_msg_func = NULL; +ICvar *icvar = NULL; +ISmmAPI *metamod_api = NULL; +IVEngineServer *engine = NULL; +IServerGameClients *gameclients = NULL; +VSPListener g_VspListener; +BaseProvider g_Ep1Provider; +IMetamodSourceProvider *provider = &g_Ep1Provider; +List conbases_unreg; +ConCommand meta_local_cmd("meta", LocalCommand_Meta, "Metamod:Source control options"); + +SH_DECL_HOOK2_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *, const CCommand &); + +void BaseProvider::ConsolePrint(const char *str) +{ + if (echo_msg_func != NULL) + { + ConMsg("%s", str); + } + else + { + Msg("%s", str); + } +} + +void BaseProvider::Notify_DLLInit_Pre(void *gamedll, + CreateInterfaceFn engineFactory, + CreateInterfaceFn serverFactory) +{ + server = (IServerGameDLL *)gamedll; + engine = (IVEngineServer *)((engineFactory)(INTERFACEVERSION_VENGINESERVER, NULL)); + if (!engine) + { + DisplayError("Could not find IVEngineServer! Metamod cannot load."); + return; + } + icvar = (ICvar *)((engineFactory)(CVAR_INTERFACE_VERSION, NULL)); + if (!icvar) + { + DisplayError("Could not find ICvar! Metamod cannot load."); + return; + } + + if ((gameclients = (IServerGameClients *)(serverFactory("ServerGameClients003", NULL))) + == NULL) + { + gameclients = (IServerGameClients *)(serverFactory("ServerGameClients004", NULL)); + } + + RegisterConCommandBase(&meta_local_cmd); + conbases_unreg.push_back(&meta_local_cmd); + + echo_msg_func = ExtractRemotePrinter(engineFactory); + usermsgs_extracted = CacheUserMessages(); + + if (gameclients) + { + SH_ADD_HOOK_STATICFUNC(IServerGameClients, ClientCommand, gameclients, ClientCommand, false); + } +} + +void BaseProvider::Notify_DLLShutdown_Pre() +{ + List::iterator iter; + + for (iter = conbases_unreg.begin(); + iter != conbases_unreg.end(); + iter++) + { + UnregisterConCommandBase((*iter)); + } +} + +bool BaseProvider::IsRemotePrintingAvailable() +{ + return (echo_msg_func != NULL); +} + +void BaseProvider::ClientConsolePrint(edict_t *client, const char *message) +{ + engine->ClientPrintf(client, message); +} + +void BaseProvider::ServerCommand(const char *cmd) +{ + engine->ServerCommand(cmd); +} + +const char *BaseProvider::GetConVarString(ConVar *convar) +{ + if (convar == NULL) + { + return NULL; + } + + return convar->GetString(); +} + +bool BaseProvider::IsConCommandBaseACommand(ConCommandBase *pCommand) +{ + return pCommand->IsCommand(); +} + + +bool BaseProvider::IsSourceEngineBuildCompatible(int build) +{ + return (build == SOURCE_ENGINE_ORIGINAL + || build == SOURCE_ENGINE_EPISODEONE); +} + +const char *BaseProvider::GetCommandLineValue(const char *key, const char *defval) +{ + if (key[0] == '-' || key[0] == '+') + { + return CommandLine_Tier0()->ParmValue(key, defval); + } + else if (icvar) + { + const char *val; + if ((val = icvar->GetCommandLineValue(key)) == NULL) + { + return defval; + } + + return val; + } + + return NULL; +} + +int BaseProvider::TryServerGameDLL(const char *iface) +{ + if (strncmp(iface, "ServerGameDLL", 13) != 0) + { + return 0; + } + + return atoi(&iface[13]); +} + +bool BaseProvider::LogMessage(const char *buffer) +{ + if (!engine) + { + return false; + } + + engine->LogPrint(buffer); + + return true; +} + +bool BaseProvider::GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo) +{ + SourceHook::MemFuncInfo mfi = {true, -1, 0, 0}; + + if (hook == ProvidedHook_LevelInit) + { + SourceHook::GetFuncInfo(&IServerGameDLL::LevelInit, mfi); + } + else if (hook == ProvidedHook_LevelShutdown) + { + SourceHook::GetFuncInfo(&IServerGameDLL::LevelShutdown, mfi); + } + else if (hook == ProvidedHook_GameInit) + { + SourceHook::GetFuncInfo(&IServerGameDLL::GameInit, mfi); + } + else if (hook == ProvidedHook_DLLShutdown) + { + SourceHook::GetFuncInfo(&IServerGameDLL::DLLShutdown, mfi); + } + else if (hook == ProvidedHook_DLLInit) + { + SourceHook::GetFuncInfo(&IServerGameDLL::DLLInit, mfi); + } + + *pInfo = mfi; + + return (mfi.thisptroffs >= 0); +} + +void BaseProvider::DisplayError(const char *fmt, ...) +{ + va_list ap; + char buffer[2048]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + Error(buffer); +} + +void BaseProvider::DisplayWarning(const char *fmt, ...) +{ + va_list ap; + char buffer[2048]; + + va_start(ap, fmt); + UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + Warning(buffer); +} + +IConCommandBaseAccessor *BaseProvider::GetConCommandBaseAccessor() +{ + return &g_SMConVarAccessor; +} + +bool BaseProvider::RegisterConCommandBase(ConCommandBase *pCommand) +{ + return g_SMConVarAccessor.Register(pCommand); +} + +void BaseProvider::UnregisterConCommandBase(ConCommandBase *pCommand) +{ + return g_SMConVarAccessor.Unregister(pCommand); +} + +int BaseProvider::GetUserMessageCount() +{ + if (!usermsgs_extracted) + { + return -1; + } + + return (int)usermsgs_list.size(); +} + +int BaseProvider::FindUserMessage(const char *name, int *size) +{ + for (size_t i = 0; i < usermsgs_list.size(); i++) + { + if (usermsgs_list[i].name.compare(name) == 0) + { + if (size) + { + *size = usermsgs_list[i].size; + } + return (int)i; + } + } + + return -1; +} + +const char *BaseProvider::GetUserMessage(int index, int *size) +{ + if (!usermsgs_extracted || index < 0 || index >= (int)usermsgs_list.size()) + { + return NULL; + } + + if (size) + { + *size = usermsgs_list[index].size; + } + + return usermsgs_list[index].name.c_str(); +} + +const char *BaseProvider::GetGameDescription() +{ + return server->GetGameDescription(); +} + +ConVar *BaseProvider::CreateConVar(const char *name, + const char *defval, + const char *help, + int flags) +{ + int newflags = 0; + if (flags & ConVarFlag_Notify) + { + newflags |= FCVAR_NOTIFY; + } + if (flags & ConVarFlag_Replicated) + { + newflags |= FCVAR_REPLICATED; + } + if (flags & ConVarFlag_SpOnly) + { + newflags |= FCVAR_SPONLY; + } + + ConVar *pVar = new ConVar(name, defval, newflags, help); + + RegisterConCommandBase(pVar); + conbases_unreg.push_back(pVar); + + return pVar; +} + +IServerPluginCallbacks *BaseProvider::GetVSPCallbacks(const char *iface) +{ + g_VspListener.SetLoadable(true); + return &g_VspListener; +} + +class GlobCommand : public IMetamodSourceCommandInfo +{ +public: + GlobCommand(const CCommand *cmd) : m_cmd(cmd) + { + } +public: + unsigned int GetArgCount() + { + return m_cmd->ArgC(); + } + + const char *GetArg(unsigned int num) + { + return m_cmd->Arg(num); + } + + const char *GetArgString() + { + return m_cmd->ArgS(); + } +private: + const CCommand *m_cmd; +}; + +void LocalCommand_Meta(const CCommand &args) +{ + GlobCommand cmd(&args); + Command_Meta(&cmd); +} + +void ClientCommand(edict_t *pEdict, const CCommand &_cmd) +{ + GlobCommand cmd(&_cmd); + + if (strcmp(cmd.GetArg(0), "meta") == 0) + { + Command_ClientMeta(pEdict, &cmd); + } +} + +bool vcmp(const void *_addr1, const void *_addr2, size_t len) +{ + unsigned char *addr1 = (unsigned char *)_addr1; + unsigned char *addr2 = (unsigned char *)_addr2; + + for (size_t i=0; i UserMsgDict; + +/* This is the ugliest function in all of SourceMM */ +bool CacheUserMessages() +{ + /* Get address of original GetUserMessageInfo() */ + char *vfunc = (char *)SH_GET_ORIG_VFNPTR_ENTRY(server, &IServerGameDLL::GetUserMessageInfo); + + /* Oh dear, we have a relative jump on our hands + * PVK II on Windows made me do this, but I suppose it doesn't hurt to check this on Linux too... + */ + if (*vfunc == '\xE9') + { + /* Get address from displacement... + * + * Add 5 because it's relative to next instruction: + * Opcode <1 byte> + 32-bit displacement <4 bytes> + */ + vfunc += *reinterpret_cast(vfunc + 1) + 5; + } + + CUtlDict *dict = NULL; + + if (vcmp(vfunc, MSGCLASS_SIG, MSGCLASS_SIGLEN)) + { + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + } + else if (vcmp(vfunc, MSGCLASS2_SIG, MSGCLASS2_SIGLEN)) + { + #ifdef OS_WIN32 + /* If we get here, the code is possibly inlined like in Dystopia */ + + /* Get the address of the CUtlRBTree */ + char *rbtree = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); + + /* CUtlDict should be 8 bytes before the CUtlRBTree (hacktacular!) */ + dict = reinterpret_cast(rbtree - 8); + #elif defined OS_LINUX + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + #endif + #ifdef OS_WIN32 + } + else if (vcmp(vfunc, MSGCLASS3_SIG, MSGCLASS3_SIGLEN)) + { + /* Get address of CUserMessages instance */ + char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS3_OFFS); + + /* Get address of CUserMessages::m_UserMessages */ + dict = reinterpret_cast(*userMsgClass); + #endif + } + + if (dict) + { + int msg_count = dict->Count(); + + /* Ensure that count is within bounds of an unsigned byte, because that's what engine supports */ + if (msg_count < 0 || msg_count > 255) + { + return false; + } + + UserMessage *msg; + UsrMsgInfo u_msg; + + /* Cache messages in our CUtlDict */ + for (int i = 0; i < msg_count; i++) + { + msg = dict->Element(i); + u_msg.name = msg->name; + u_msg.size = msg->size; + usermsgs_list.push_back(u_msg); + } + + return true; + } + + return false; +} + diff --git a/sourcemm/episode2/provider_ep2.h b/sourcemm/episode2/provider_ep2.h new file mode 100644 index 0000000..c042e11 --- /dev/null +++ b/sourcemm/episode2/provider_ep2.h @@ -0,0 +1,89 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + +#ifndef _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ +#define _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ + +#if defined _DEBUG +#define DEBUG2 +#undef _DEBUG +#endif +#include +#include +#include +#include "ISmmAPI.h" +#include "metamod_provider.h" +#include "metamod_oslink.h" +#if defined DEBUG2 +#undef DEBUG2 +#define _DEBUG +#endif + +using namespace SourceMM; +using namespace SourceHook; + +class BaseProvider : public IMetamodSourceProvider +{ +public: + virtual bool IsSourceEngineBuildCompatible(int build); + virtual bool GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo); + virtual bool LogMessage(const char *buffer); + virtual const char *GetCommandLineValue(const char *key, const char *defval); + virtual void ConsolePrint(const char *msg); + virtual bool IsRemotePrintingAvailable(); + virtual void ClientConsolePrint(edict_t *client, const char *msg); + virtual IServerPluginCallbacks *GetVSPCallbacks(const char *iface); + virtual void DisplayError(const char *fmt, ...); + virtual void DisplayWarning(const char *fmt, ...); + virtual int TryServerGameDLL(const char *iface); + virtual void Notify_DLLInit_Pre(void *gamedll, + CreateInterfaceFn engineFactory, + CreateInterfaceFn serverFactory); + void Notify_DLLShutdown_Pre(); + virtual void ServerCommand(const char *cmd); + virtual ConVar *CreateConVar(const char *name, + const char *defval, + const char *help, + int flags); + virtual const char *GetConVarString(ConVar *convar); + virtual const char *GetGameDescription(); + virtual IConCommandBaseAccessor *GetConCommandBaseAccessor(); + virtual bool RegisterConCommandBase(ConCommandBase *pCommand); + virtual void UnregisterConCommandBase(ConCommandBase *pCommand); + virtual bool IsConCommandBaseACommand(ConCommandBase *pCommand); + virtual int GetUserMessageCount(); + virtual int FindUserMessage(const char *name, int *size=NULL); + virtual const char *GetUserMessage(int index, int *size=NULL); +}; + +extern IVEngineServer *engine; +extern IServerGameDLL *server; +extern IServerGameClients *gameclients; +extern ICvar *icvar; + +#endif //_INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ + diff --git a/sourcemm/episode2/vsp_listener.cpp b/sourcemm/episode2/vsp_listener.cpp new file mode 100644 index 0000000..3adf2b5 --- /dev/null +++ b/sourcemm/episode2/vsp_listener.cpp @@ -0,0 +1,141 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + +#include "vsp_listener.h" +#include "svn_version.h" +#include "metamod.h" + +using namespace SourceMM; + +VSPListener::VSPListener() +{ + m_bLoaded = false; + m_bLoadable = false; +} + +void VSPListener::ClientActive(edict_t *pEntity) +{ +} + +PLUGIN_RESULT VSPListener::ClientCommand(edict_t *pEntity, const CCommand &cmd) +{ + return PLUGIN_CONTINUE; +} + +PLUGIN_RESULT VSPListener::ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) +{ + return PLUGIN_CONTINUE; +} + +void VSPListener::ClientDisconnect(edict_t *pEntity) +{ +} + +void VSPListener::ClientPutInServer(edict_t *pEntity, char const *playername) +{ +} + +void VSPListener::ClientSettingsChanged(edict_t *pEdict) +{ +} + +void VSPListener::SetCommandClient(int index) +{ +} + +void VSPListener::GameFrame(bool simulating) +{ +} + +const char *VSPListener::GetPluginDescription() +{ + return "Metamod:Source Interface v" SVN_FILE_VERSION_STRING; +} + +bool VSPListener::IsLoaded() +{ + return m_bLoaded; +} + +void VSPListener::LevelInit(char const *pMapName) +{ +} + +void VSPListener::LevelShutdown() +{ +} + +PLUGIN_RESULT VSPListener::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) +{ + return PLUGIN_CONTINUE; +} + +void VSPListener::Pause() +{ +} + +void VSPListener::UnPause() +{ +} + +void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) +{ +} + +void VSPListener::Unload() +{ +} + +void VSPListener::SetLoadable(bool set) +{ + m_bLoadable = set; +} + +bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) +{ + if (!m_bLoadable) + { + provider->DisplayWarning("Do not manually load Metamod:Source as a Valve Server Plugin\n"); + return false; + } + + if (m_bLoaded) + { + return false; + } + + m_bLoaded = true; + SetLoadable(false); + + g_Metamod.NotifyVSPListening(this); + + return true; +} + +void VSPListener::OnQueryCvarValueFinished(QueryCvarCookie_t iCookie, edict_t *pPlayerEntity, EQueryCvarValueStatus eStatus, const char *pCvarName, const char *pCvarValue ) +{ +} diff --git a/sourcemm/episode2/vsp_listener.h b/sourcemm/episode2/vsp_listener.h new file mode 100644 index 0000000..443606f --- /dev/null +++ b/sourcemm/episode2/vsp_listener.h @@ -0,0 +1,73 @@ +/** + * vim: set ts=4 : + * ====================================================== + * Metamod:Source + * Copyright (C) 2004-2007 AlliedModders LLC and authors. + * All rights reserved. + * ====================================================== + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Version: $Id$ + */ + +#ifndef _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ +#define _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ + +#if defined _DEBUG +#define DEBUG2 +#undef _DEBUG +#endif +#include "iserverplugin.h" +#if defined DEBUG2 +#undef DEBUG2 +#define _DEBUG +#endif + +class VSPListener : public IServerPluginCallbacks +{ +public: + VSPListener(); +public: + virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory); + virtual void Unload(); + virtual void Pause(); + virtual void UnPause(); + virtual const char *GetPluginDescription(); + virtual void LevelInit(char const *pMapName); + virtual void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); + virtual void GameFrame(bool simulating); + virtual void LevelShutdown(void); + virtual void ClientActive(edict_t *pEntity); + virtual void ClientDisconnect(edict_t *pEntity); + virtual void ClientPutInServer(edict_t *pEntity, char const *playername); + virtual void SetCommandClient(int index); + virtual void ClientSettingsChanged(edict_t *pEdict); + virtual PLUGIN_RESULT ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); + virtual PLUGIN_RESULT ClientCommand(edict_t *pEntity, const CCommand &cmd); + virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID); + virtual void OnQueryCvarValueFinished( QueryCvarCookie_t iCookie, edict_t *pPlayerEntity, EQueryCvarValueStatus eStatus, const char *pCvarName, const char *pCvarValue ); +public: + bool IsLoaded(); + void SetLoadable(bool loadable); +private: + bool m_bLoaded; + bool m_bLoadable; +}; + +#endif //_INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ + diff --git a/sourcemm/metamod.cpp b/sourcemm/metamod.cpp index 8c6e55e..8097f4d 100644 --- a/sourcemm/metamod.cpp +++ b/sourcemm/metamod.cpp @@ -238,14 +238,7 @@ SMM_API void *CreateInterface(const char *iface, int *ret) /* Get value of -game from command line, defaulting to hl2 as engine seems to do */ game_dir = provider->GetCommandLineValue("-game", "hl2"); - if (strcasecmp(game_dir, "ship") == 0) - { - engine_build = SOURCE_ENGINE_ORIGINAL; - } - else - { - engine_build = SOURCE_ENGINE_EPISODEONE; - } + engine_build = SOURCE_ENGINE_ORANGEBOX; /* Get absolute path */ abspath(game_path, game_dir); @@ -707,6 +700,10 @@ bool Handler_DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsF if (!pluginFile) { pluginFile = provider->GetConVarString(mm_pluginsfile); + if (pluginFile == NULL) + { + pluginFile = "addons/metamod/metaplugins.ini"; + } } char full_path[260]; From 82fc6210bae73537ea017c99c6759e74b2bb92e7 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 4 Oct 2007 19:18:19 +0000 Subject: [PATCH 23/25] fixed usermessages not printing removed old ConMsg extraction code --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40450 --- sourcemm/episode2/provider_ep2.cpp | 54 ++---------------------------- sourcemm/metamod_console.cpp | 2 +- 2 files changed, 3 insertions(+), 53 deletions(-) diff --git a/sourcemm/episode2/provider_ep2.cpp b/sourcemm/episode2/provider_ep2.cpp index f82052e..00dd8f6 100644 --- a/sourcemm/episode2/provider_ep2.cpp +++ b/sourcemm/episode2/provider_ep2.cpp @@ -58,7 +58,6 @@ struct UsrMsgInfo #undef CommandLine DLL_IMPORT ICommandLine *CommandLine(); /* Functions */ -CONPRINTF_FUNC ExtractRemotePrinter(void *addr); bool CacheUserMessages(); void ClientCommand(edict_t *pEdict, const CCommand &args); void LocalCommand_Meta(const CCommand &args); @@ -66,7 +65,6 @@ void _ServerCommand(); /* Variables */ bool usermsgs_extracted = false; CVector usermsgs_list; -CONPRINTF_FUNC echo_msg_func = NULL; ICvar *icvar = NULL; ISmmAPI *metamod_api = NULL; IVEngineServer *engine = NULL; @@ -81,14 +79,7 @@ SH_DECL_HOOK2_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *, void BaseProvider::ConsolePrint(const char *str) { - if (echo_msg_func != NULL) - { - ConMsg("%s", str); - } - else - { - Msg("%s", str); - } + ConMsg("%s", str); } void BaseProvider::Notify_DLLInit_Pre(void *gamedll, @@ -118,7 +109,6 @@ void BaseProvider::Notify_DLLInit_Pre(void *gamedll, RegisterConCommandBase(&meta_local_cmd); conbases_unreg.push_back(&meta_local_cmd); - echo_msg_func = ExtractRemotePrinter(engineFactory); usermsgs_extracted = CacheUserMessages(); if (gameclients) @@ -141,7 +131,7 @@ void BaseProvider::Notify_DLLShutdown_Pre() bool BaseProvider::IsRemotePrintingAvailable() { - return (echo_msg_func != NULL); + return true; } void BaseProvider::ClientConsolePrint(edict_t *client, const char *message) @@ -428,46 +418,6 @@ bool vcmp(const void *_addr1, const void *_addr2, size_t len) return true; } -/* :TODO: I hope we can get rid of this in the future */ -CONPRINTF_FUNC ExtractRemotePrinter(void *addr) -{ - char path[256+10]; - if (!GetFileOfAddress(addr, path, sizeof(path))) - { - return NULL; - } - - char *ptr = NULL; -#if defined __linux__ - ptr = strstr(path, "engine_i486.so"); -#else - ptr = strstr(path, "engine.dll"); -#endif - - if (ptr == NULL) - { - return NULL; - } - -#if defined __linux__ - strcpy(ptr, "tier0_i486.so"); -#else - strcpy(ptr, "tier0.dll"); -#endif - - HINSTANCE handle = dlmount(path); - if (handle == NULL) - { - return NULL; - } - - void *func = dlsym(handle, "ConMsg"); - - dlclose(handle); - - return (CONPRINTF_FUNC)func; -} - ////////////////////////////////////////////////////////////////////// // EVEN MORE HACKS HERE! YOU HAVE BEEN WARNED! // // Signatures necessary in finding the pointer to the CUtlDict that // diff --git a/sourcemm/metamod_console.cpp b/sourcemm/metamod_console.cpp index 3c81b94..d84b8fa 100644 --- a/sourcemm/metamod_console.cpp +++ b/sourcemm/metamod_console.cpp @@ -88,7 +88,7 @@ bool Command_Meta(IMetamodSourceCommandInfo *info) // Display user messages int messages = g_Metamod.GetUserMessageCount(); - if (messages == -1) + if (messages != -1) { const char *msgname; int msgsize; From 57caecd7b7703ecac50fbe9fc10043b35baee569 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 4 Oct 2007 19:46:28 +0000 Subject: [PATCH 24/25] added linux support to ob build --HG-- branch : sourcemm-1.6.0 extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.6.0%40452 --- sourcemm/Makefile.ep2 | 78 +++++++++++++++++++++++++++++++++++ sourcemm/episode2/console.cpp | 2 - 2 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 sourcemm/Makefile.ep2 diff --git a/sourcemm/Makefile.ep2 b/sourcemm/Makefile.ep2 new file mode 100644 index 0000000..d9fe514 --- /dev/null +++ b/sourcemm/Makefile.ep2 @@ -0,0 +1,78 @@ +#(C)2004-2007 SourceMM Development Team +# Makefile written by David "BAILOPAN" Anderson + +HL2SDK = ../../../hl2sdk-ob +SMM_ROOT = .. +SRCDS = ~/srcds + +### EDIT BELOW FOR OTHER PROJECTS ### + +OPT_FLAGS = -O2 -funroll-loops -s -pipe +GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden +DEBUG_FLAGS = -g -ggdb3 +CPP = gcc-4.1 +BINARY = server_i486.so + +HL2PUB = $(HL2SDK)/public +HL2LIB = $(HL2SDK)/linux_sdk + +OBJECTS = metamod.cpp metamod_util.cpp metamod_console.cpp metamod_oslink.cpp metamod_plugins.cpp \ + sourcehook.cpp episode2/console.cpp episode2/provider_ep2.cpp episode2/vsp_listener.cpp \ + episode2/convar.cpp + +LINK = vstdlib_i486.so tier0_i486.so -static-libgcc + +INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ + -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug + CFLAGS = $(DEBUG_FLAGS) +else + BIN_DIR = Release + CFLAGS = $(OPT_FLAGS) +endif + +GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) + +CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp \ + -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca \ + -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse \ + -fno-strict-aliasing + +ifeq "$(GCC_VERSION)" "4" + CFLAGS += $(GCC4_FLAGS) +endif + +OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +$(BIN_DIR)/%.o: %.cpp + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +all: + mkdir -p $(BIN_DIR) + mkdir -p $(BIN_DIR)/episode2 + ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so + ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so + ln -sf $(SMM_ROOT)/sourcehook/sourcehook.cpp sourcehook.cpp + ln -sf $(HL2SDK)/tier1/convar.cpp episode2/convar.cpp + $(MAKE) -f Makefile.ep2 sourcemm + rm -rf $(BINARY) + ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) + +sourcemm: $(OBJ_LINUX) + $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) + +debug: + $(MAKE) -f Makefile.ep2 all DEBUG=true + +default: all + +clean: + rm -rf Release/episode2/*.o + rm -rf Release/*.o + rm -rf Release/$(BINARY) + rm -rf Debug/episode2/*.o + rm -rf Debug/*.o + rm -rf Debug/$(BINARY) + diff --git a/sourcemm/episode2/console.cpp b/sourcemm/episode2/console.cpp index 61c7aef..ca0e9db 100644 --- a/sourcemm/episode2/console.cpp +++ b/sourcemm/episode2/console.cpp @@ -32,8 +32,6 @@ using namespace SourceHook; SMConVarAccessor g_SMConVarAccessor; -static int s_nDLLIdentifier = 0x3058132; // A unique identifier indicating which DLL this convar came from - bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) { pCommand->SetNext(NULL); From 272a9c0e1a1c47e308abde07329c0d540b342296 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 16 Oct 2007 20:03:12 +0000 Subject: [PATCH 25/25] removed 1.6.0 branch --HG-- branch : sourcemm-1.6.0 --- installer/Attach.cfg | 38 - installer/Attach.dpr | 68 - installer/Attach.exe | Bin 281600 -> 0 bytes installer/HL2Launch.cfg | 38 - installer/HL2Launch.dpr | 189 - installer/HL2Launch.exe | Bin 43008 -> 0 bytes installer/MMS_Installer.cfg | 38 - installer/MMS_Installer.dpr | 72 - installer/MMS_Installer.exe | Bin 637952 -> 0 bytes installer/MMS_Installer.res | Bin 171456 -> 0 bytes installer/UnitFunctions.pas | 126 - installer/UnitInstall.pas | 561 - installer/UnitPackSystem.pas | 211 - installer/UnitSelectModPath.dfm | Bin 1148 -> 0 bytes installer/UnitSelectModPath.pas | 26 - installer/UnitfrmMain.dfm | 11577 ---------------- installer/UnitfrmMain.pas | 730 - installer/UnitfrmProxy.dfm | Bin 1584 -> 0 bytes installer/UnitfrmProxy.pas | 72 - installer/del.bat | 15 - installer/files/Readme.txt | 7 - installer/install.bmp | Bin 154542 -> 0 bytes installer/upx.exe | Bin 126464 -> 0 bytes modules.versions | 9 - sourcehook/FastDelegate.h | 3811 ----- sourcehook/generate/FastDelegate.h | 3811 ----- sourcehook/generate/FastDelegate.hxx | 1054 -- sourcehook/generate/generate | 7 - sourcehook/generate/generate.bat | 10 - sourcehook/generate/sh_memfuncinfo.h | 912 -- sourcehook/generate/sh_memfuncinfo.hxx | 332 - sourcehook/generate/shworker.bin | Bin 59291 -> 0 bytes sourcehook/generate/shworker.exe | Bin 352256 -> 0 bytes sourcehook/generate/shworker/Makefile | 13 - sourcehook/generate/shworker/fd_hopter.cpp | 370 - .../generate/shworker/msvc7/shworker.vcproj | 137 - .../generate/shworker/msvc8/shworker.vcproj | 208 - sourcehook/generate/shworker/shworker.cpp | 767 - sourcehook/generate/sourcehook.h | 6537 --------- sourcehook/generate/sourcehook.hxx | 1503 -- sourcehook/sh_list.h | 291 - sourcehook/sh_listcat.h | 147 - sourcehook/sh_memfuncinfo.h | 912 -- sourcehook/sh_memory.h | 186 - sourcehook/sh_stack.h | 237 - sourcehook/sh_string.h | 401 - sourcehook/sh_tinyhash.h | 534 - sourcehook/sh_vector.h | 490 - sourcehook/sourcehook.cpp | 1463 -- sourcehook/sourcehook.h | 6537 --------- sourcehook/sourcehook_impl.h | 817 -- sourcehook/test/Makefile | 63 - sourcehook/test/main.cpp | 132 - sourcehook/test/msvc7/test.vcproj | 374 - sourcehook/test/msvc8/test.vcproj | 513 - sourcehook/test/sourcehook_test.h | 27 - sourcehook/test/test1.cpp | 718 - sourcehook/test/test2.cpp | 172 - sourcehook/test/test3.cpp | 232 - sourcehook/test/test4.cpp | 425 - sourcehook/test/testbail.cpp | 115 - sourcehook/test/testbail.h | 39 - sourcehook/test/testbail2.cpp | 36 - sourcehook/test/testevents.h | 153 - sourcehook/test/testlist.cpp | 282 - sourcehook/test/testmanual.cpp | 369 - sourcehook/test/testmulti.cpp | 106 - sourcehook/test/testrecall.cpp | 231 - sourcehook/test/testreentr.cpp | 609 - sourcehook/test/testref.cpp | 162 - sourcehook/test/testrefret.cpp | 202 - sourcehook/test/testvphooks.cpp | 347 - sourcemm/IPluginManager.h | 154 - sourcemm/ISmmAPI.h | 393 - sourcemm/ISmmPlugin.h | 455 - sourcemm/LICENSE.txt | 29 - sourcemm/Makefile.ep1 | 75 - sourcemm/Makefile.ep2 | 78 - sourcemm/changelog.txt | 148 - sourcemm/episode1/console.cpp | 169 - sourcemm/episode1/console.h | 51 - sourcemm/episode1/convar_smm.h | 523 - sourcemm/episode1/msvc8/sourcemm.sln | 20 - sourcemm/episode1/msvc8/sourcemm.vcproj | 337 - sourcemm/episode1/provider_ep1.cpp | 590 - sourcemm/episode1/provider_ep1.h | 81 - sourcemm/episode1/vsp_listener.cpp | 138 - sourcemm/episode1/vsp_listener.h | 64 - sourcemm/episode2/console.cpp | 55 - sourcemm/episode2/console.h | 55 - sourcemm/episode2/msvc8/sourcemm.sln | 20 - sourcemm/episode2/msvc8/sourcemm.vcproj | 333 - sourcemm/episode2/provider_ep2.cpp | 548 - sourcemm/episode2/provider_ep2.h | 89 - sourcemm/episode2/vsp_listener.cpp | 141 - sourcemm/episode2/vsp_listener.h | 73 - sourcemm/metamod.cpp | 1244 -- sourcemm/metamod.h | 105 - sourcemm/metamod_console.cpp | 733 - sourcemm/metamod_console.h | 36 - sourcemm/metamod_oslink.cpp | 101 - sourcemm/metamod_oslink.h | 109 - sourcemm/metamod_plugins.cpp | 747 - sourcemm/metamod_plugins.h | 167 - sourcemm/metamod_provider.h | 294 - sourcemm/metamod_util.cpp | 425 - sourcemm/metamod_util.h | 98 - sourcemm/svn_version.h | 13 - sourcemm/svn_version.tpl | 13 - sourcemm/version.rc | 101 - update_tool/Makefile | 68 - update_tool/README.txt | 90 - update_tool/api_link.asm | 138 - update_tool/msvc8/update_tool.sln | 20 - update_tool/msvc8/update_tool.vcproj | 203 - update_tool/sourcemm_update_tool.vdf | 6 - update_tool/sourcemm_updater.conf | 9 - update_tool/update_tool.cpp | 366 - 118 files changed, 60276 deletions(-) delete mode 100644 installer/Attach.cfg delete mode 100644 installer/Attach.dpr delete mode 100644 installer/Attach.exe delete mode 100644 installer/HL2Launch.cfg delete mode 100644 installer/HL2Launch.dpr delete mode 100644 installer/HL2Launch.exe delete mode 100644 installer/MMS_Installer.cfg delete mode 100644 installer/MMS_Installer.dpr delete mode 100644 installer/MMS_Installer.exe delete mode 100644 installer/MMS_Installer.res delete mode 100644 installer/UnitFunctions.pas delete mode 100644 installer/UnitInstall.pas delete mode 100644 installer/UnitPackSystem.pas delete mode 100644 installer/UnitSelectModPath.dfm delete mode 100644 installer/UnitSelectModPath.pas delete mode 100644 installer/UnitfrmMain.dfm delete mode 100644 installer/UnitfrmMain.pas delete mode 100644 installer/UnitfrmProxy.dfm delete mode 100644 installer/UnitfrmProxy.pas delete mode 100644 installer/del.bat delete mode 100644 installer/files/Readme.txt delete mode 100644 installer/install.bmp delete mode 100644 installer/upx.exe delete mode 100644 modules.versions delete mode 100644 sourcehook/FastDelegate.h delete mode 100644 sourcehook/generate/FastDelegate.h delete mode 100644 sourcehook/generate/FastDelegate.hxx delete mode 100755 sourcehook/generate/generate delete mode 100644 sourcehook/generate/generate.bat delete mode 100644 sourcehook/generate/sh_memfuncinfo.h delete mode 100644 sourcehook/generate/sh_memfuncinfo.hxx delete mode 100755 sourcehook/generate/shworker.bin delete mode 100644 sourcehook/generate/shworker.exe delete mode 100644 sourcehook/generate/shworker/Makefile delete mode 100644 sourcehook/generate/shworker/fd_hopter.cpp delete mode 100644 sourcehook/generate/shworker/msvc7/shworker.vcproj delete mode 100644 sourcehook/generate/shworker/msvc8/shworker.vcproj delete mode 100644 sourcehook/generate/shworker/shworker.cpp delete mode 100644 sourcehook/generate/sourcehook.h delete mode 100755 sourcehook/generate/sourcehook.hxx delete mode 100644 sourcehook/sh_list.h delete mode 100644 sourcehook/sh_listcat.h delete mode 100644 sourcehook/sh_memfuncinfo.h delete mode 100644 sourcehook/sh_memory.h delete mode 100644 sourcehook/sh_stack.h delete mode 100755 sourcehook/sh_string.h delete mode 100644 sourcehook/sh_tinyhash.h delete mode 100755 sourcehook/sh_vector.h delete mode 100644 sourcehook/sourcehook.cpp delete mode 100644 sourcehook/sourcehook.h delete mode 100644 sourcehook/sourcehook_impl.h delete mode 100644 sourcehook/test/Makefile delete mode 100644 sourcehook/test/main.cpp delete mode 100644 sourcehook/test/msvc7/test.vcproj delete mode 100644 sourcehook/test/msvc8/test.vcproj delete mode 100644 sourcehook/test/sourcehook_test.h delete mode 100644 sourcehook/test/test1.cpp delete mode 100644 sourcehook/test/test2.cpp delete mode 100644 sourcehook/test/test3.cpp delete mode 100644 sourcehook/test/test4.cpp delete mode 100644 sourcehook/test/testbail.cpp delete mode 100644 sourcehook/test/testbail.h delete mode 100644 sourcehook/test/testbail2.cpp delete mode 100644 sourcehook/test/testevents.h delete mode 100644 sourcehook/test/testlist.cpp delete mode 100644 sourcehook/test/testmanual.cpp delete mode 100644 sourcehook/test/testmulti.cpp delete mode 100644 sourcehook/test/testrecall.cpp delete mode 100644 sourcehook/test/testreentr.cpp delete mode 100644 sourcehook/test/testref.cpp delete mode 100644 sourcehook/test/testrefret.cpp delete mode 100644 sourcehook/test/testvphooks.cpp delete mode 100644 sourcemm/IPluginManager.h delete mode 100644 sourcemm/ISmmAPI.h delete mode 100644 sourcemm/ISmmPlugin.h delete mode 100644 sourcemm/LICENSE.txt delete mode 100644 sourcemm/Makefile.ep1 delete mode 100644 sourcemm/Makefile.ep2 delete mode 100644 sourcemm/changelog.txt delete mode 100644 sourcemm/episode1/console.cpp delete mode 100644 sourcemm/episode1/console.h delete mode 100644 sourcemm/episode1/convar_smm.h delete mode 100644 sourcemm/episode1/msvc8/sourcemm.sln delete mode 100644 sourcemm/episode1/msvc8/sourcemm.vcproj delete mode 100644 sourcemm/episode1/provider_ep1.cpp delete mode 100644 sourcemm/episode1/provider_ep1.h delete mode 100644 sourcemm/episode1/vsp_listener.cpp delete mode 100644 sourcemm/episode1/vsp_listener.h delete mode 100644 sourcemm/episode2/console.cpp delete mode 100644 sourcemm/episode2/console.h delete mode 100644 sourcemm/episode2/msvc8/sourcemm.sln delete mode 100644 sourcemm/episode2/msvc8/sourcemm.vcproj delete mode 100644 sourcemm/episode2/provider_ep2.cpp delete mode 100644 sourcemm/episode2/provider_ep2.h delete mode 100644 sourcemm/episode2/vsp_listener.cpp delete mode 100644 sourcemm/episode2/vsp_listener.h delete mode 100644 sourcemm/metamod.cpp delete mode 100644 sourcemm/metamod.h delete mode 100644 sourcemm/metamod_console.cpp delete mode 100644 sourcemm/metamod_console.h delete mode 100644 sourcemm/metamod_oslink.cpp delete mode 100644 sourcemm/metamod_oslink.h delete mode 100644 sourcemm/metamod_plugins.cpp delete mode 100644 sourcemm/metamod_plugins.h delete mode 100644 sourcemm/metamod_provider.h delete mode 100644 sourcemm/metamod_util.cpp delete mode 100644 sourcemm/metamod_util.h delete mode 100644 sourcemm/svn_version.h delete mode 100644 sourcemm/svn_version.tpl delete mode 100755 sourcemm/version.rc delete mode 100644 update_tool/Makefile delete mode 100644 update_tool/README.txt delete mode 100644 update_tool/api_link.asm delete mode 100644 update_tool/msvc8/update_tool.sln delete mode 100644 update_tool/msvc8/update_tool.vcproj delete mode 100644 update_tool/sourcemm_update_tool.vdf delete mode 100644 update_tool/sourcemm_updater.conf delete mode 100644 update_tool/update_tool.cpp diff --git a/installer/Attach.cfg b/installer/Attach.cfg deleted file mode 100644 index 662b86f..0000000 --- a/installer/Attach.cfg +++ /dev/null @@ -1,38 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J- --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"c:\programme\borland\delphi7\Projects\Bpl" --LN"c:\programme\borland\delphi7\Projects\Bpl" --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/installer/Attach.dpr b/installer/Attach.dpr deleted file mode 100644 index 1056bb3..0000000 --- a/installer/Attach.dpr +++ /dev/null @@ -1,68 +0,0 @@ -program Attach; - -{$APPTYPE CONSOLE} - -uses - SysUtils, Classes, UnitPackSystem; - -var eStream: TMemoryStream; - eFiles: TStringList; - Version: String; -begin - WriteLn('// File attacher for the MM:S installer'); - WriteLn('// by Basic-Master'); - WriteLn(''); - WriteLn('// Looking up files...'); - { Check files } - if FileExists(ExtractFilePath(ParamStr(0)) + 'files\hl2launch.exe') then - WriteLn('// Found files\hl2launch.exe') - else begin - WriteLn('// Error: Couldn''t find files\hl2launch.exe!'); - ReadLn; - exit; - end; - if FileExists(ExtractFilePath(ParamStr(0)) + 'files\server.dll') then - WriteLn('// Found files\server.dll') - else begin - WriteLn('// Error: Couldn''t find files\server.dll!'); - ReadLn; - exit; - end; - if FileExists(ExtractFilePath(ParamStr(0)) + 'files\server_i486.so') then - WriteLn('// Found files\server_i486.so') - else begin - WriteLn('// Error: Couldn''t find files\server_i486.so!'); - ReadLn; - exit; - end; - if FileExists(ExtractFilePath(ParamStr(0)) + 'MMS_Installer.exe') then - WriteLn('// Found MMS_Installer.exe') - else begin - WriteLn('// Error: Couldn''t find MMS_Installer.exe!'); - ReadLn; - exit; - end; - { Get version number } - WriteLn('// Please enter the version number:'); - ReadLn(Version); - if (Trim(Version) = '') then begin - WriteLn('// Error: Invalid version number!'); - ReadLn; - exit; - end; - { Compress files } - WriteLn('// Compressing files...'); - eFiles := TStringList.Create; - eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\hl2launch.exe'); - eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\server.dll'); - eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\server_i486.so'); - eStream := TMemoryStream.Create; - CompressFiles(eFiles, ExtractFilePath(ParamStr(0)) + 'temp.zip'); - eStream.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'temp.zip'); - WriteLn('// Attaching output to MMS_Installer.exe...'); - AttachToFile(ExtractFilePath(ParamStr(0)) + 'MMS_Installer.exe', eStream, Version); - DeleteFile(ExtractFilePath(ParamStr(0)) + 'temp.zip'); - eStream.Free; - WriteLn('// Done.'); - ReadLn; -end. diff --git a/installer/Attach.exe b/installer/Attach.exe deleted file mode 100644 index d46d25b1eb68420be438b22a716efff34509cfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281600 zcmeFYcTiK``|q3H2uY9tLArElL6BmAgpSnEiy)vh6(K?bD4l>1wg`UoBNjdiAA1EW zC@2AxqNre_iGWzZAOu8+64*ESeeds_xpQaEoImcIzwVx4t+n@ht!F*&XJxW8to8Ur zFd;Aq1cHDNAs`5WG)dahivd~xpT_^HghC(>Nf3g@UF-|3CaCudt*WY^q+RKnthCg` zwAj6xdpYTB%^mTYX`B>IPD)&Snr7&(6pKx=I34T%mD&H3eN0yf#2X5SC~tS#_}}x6 zLn;eppfF_!0|9|(N}g7sAq{;p5J)W=0vVUolITE4l1dUd3GrXof7cKQ{y%+^r||#k zk$?1jKqcbbwvX^hB{+UEZWG9VDXgL~L{4i65)Bez8{m|63RfiYdad5Bz<9s1*S4!^K;~xV^GicQbQyeOgoo14F zo|}-;swjgC-4z$FA%^;FBV;=ulyvA+l%>t-gdt1g7`vP%bWnp;0_eA6cl=H^Mov+= zt!=Mu7JPqt$zB5oB5rG68twCHT0-p3_;DzIo7+xM2@fys<+|t~MAKwQ(3Jei_YOV5 zB%R*g;M!=^E-eq*a8)(O6qBu;aAQfRT8M%=;0b>{hdVZ~zw+aH<6>~z7e2(v1y#gx zTk>yBM1#7bLU#yZQK%eO6{|5b^*OG}5jFl{P*N(t?d#>@)6(!o-IyoJaf6zCVoQ^> z`)x^r}OugPI*E3Xxn!$E#Q+7ZZ)m42U}24YAw;dJZv5 zy_~*@9msvs(u|`LTfu5N9L8TVhO&{w#z-A1&|&SetwSW+))iVOo+ zs~m$Co2TMOxiknTJgK?*^m7-~ZU{VwhvDX+O_uMEfM^Ro51}Jq0viB@&tW{0;yH5W z;#j^l&BWf?u@u0B597=EXqq+WCh!L6wDc(Ek8@0!SaoDnG%JrNocV|)3@+m1-{FXl^YU5Z zF=Ej{hn;`}Jlg0t{J@wJS==+0mO;?+1qe__3_;NlJNr&H48_gr;e-&O!pcX30-s$R zoWH;VSPzfrYK>$WMLu)@@=f8nc%u~_8Q#{h*Qi_Ufv-qFg$qhPsYkZt|)f$qEevB933p=X{zk>fR*Ry!(h~3a6h^A5q z{171G(MmGC=O;k6_U5J;y$SiP8Ck@01)gI}?_*(IBXe~&!C{3a2+t_~ZbTA#DdB9= zVDJTw#{7xt`y>7#TmPZ_sM~&)V|9YTeCS8niO2W*19KpboERs)V=;M}GCyJhm zS4*^UUC3@*r-_1x&sc~`J&|5SW+?5GTB>nNOn2!p(9t(p$fZ428$;(<>(_fN@q@4ZU8M!rb08xm6< zOrr(cWKr-;SBQGeXu3Tq9TjJ)HI;!5F@5|agN9AlP$g|KJB6J!LNWDU9YVbo5W|GX zgi}oq(43mWN>#))Vs_;B!lyBt+7Pi{N|R5<{RL!09mB8(i?rbT;hDY^yX^I3Yk0b5 z>Wi1mTjSC2NV#w*;QwbRWT*1Mm6h z?vQBUn09C;UkPeU7)HB)zDbK56*vg{%s9>UYC<)X4oj~>X2VnO!4~V&(9ys21Cj8@ z5WdWBo3HM89zL>9xJBs?_a!2{Yi`S_L*HJa)M%#E#^?QP^cxyyPBt1N9!K zM!)#lxr$yWs@u{zs4elplfMN4ziFc!r)cF_b(?(J*4$fP>frSlmQB6sd&UD)^0#?K zg*T)(w= zKK~6QwUJxAOGelll^p;octacG{N}erb%~_cv=X5r5?QvXp z_>97OP`5@(L+qMBn zohPq2o-B&OR+zhr1S+x*Rgk7iL`9qIe&LM=M9#?8y3Z%o_6Z%t++6XB)<;NfpfKk2 zx@kww*w545mO52x=({;thpk7Vq6S1XWDy4|s%Ub9D3Ilun8H7x=&f~IO`Ae zqDeftC9cN2fC9*s(Av}NmEnPS5|lf4Pi@0Gi-!!F+|M5^Q%AB{+o1q7;^4EsAH+58 zG@?Qk%G2QfA?3(F>4Kr#Us;KHKtG6 z(Jv5BuO_B8k)aArT!r4p9DELe`wSMnX(S|>k1!xKoW{Z1xgRf;tZJ@x1cvw@*)&o3 z8^>YU(=+oWIR=YlL`*M!nI`B47Nz6!jlQGX)1QoAXCRA}^Tk5Ly_gwIv< ze`j=~A-ILP^?gIvaT%(YmtFIO!h33kD?$sf)2X(Y%_!V5@otoT{lE%5GQ#_ze;53F zUk0v%{QN1RX{^ubE%5ek_?>wll5u;7%u?WJ=KMI%@)R{83tZ(oV+!+*%f&{wB=xvVU%P=R_EP!0hza>) zmm~XT+Wcb=@ouzZ-B(?=TL{d_daH2)Mwr62S1r$Dtj%T(%KgOC(fSa9QQgCL3OU^F zLCp_5e9b=)?fnI+c+YvE+s4WZB^3qUgLx(wE&yT=xg<{HPIQ3t1Ac(|;+)y9!F1el zu^}4j4u#)Rs{e@j31{oXcc!}$*(T*}d&D#$M~;i`RX2NsO@U=|QxTisfIX6lS?p|p zZf@No8c*yVd0XKehIQfUL;8AB?al#DI^^!cD))8Q9!9x8Y9udwtO&W%5i`^3|9uON zb?*dD!+tUwBQ(xeKI>h$Xv^KgomQIA#VCIRU=i+FtXrgBOe^aVyN=ZOq%`X>s)l&@ z+Evwu^m-@FL9J7Yya)`IaD3Ukd8eWhEq|v{RJ+5Gj6^g$=w!wmt&QYQC|y^}##suo9Bik|6Sfr*$BYoAL(^gcxnbc2H zJCPq~7(8_D8S#QFT+P41f3W=N{f=hsnZxpeO}xQB(XCVu^)B7%Z2*?sQT8QT7y{!| zoy)o(ufb7l()}>}ttAnkrTP1MveKz)eO{DkwFYu|ys0{@;{7iJ!ZJ7v^&@>B6!-ywV33r-h@cCHGs zMq(E3NW+sGG-NNw*s!phY%vNoFI3s3RCDL$NnVQ8?1dr@3^ZEv`@J-4eb%XfcYEX{(kzq z!T97QV8v){-{K6G5Klwr`xz3U_L?Vd&+zY1>huG9G}6RJMvXe5{WyrOQ(uY3U75iK z%IaZFS;ILqo*%r0w6$tChPGNM!~~7OpE?<>qAnQCE#Ym_E)#%v&;8(|8lT(uFzyIw zMzc|Io@Y1mHx5`;6@7v4T9-_aUx#!Lv!NUqP%EjF#UW*t|pF@4w_-##{NOTGg=%;z>emQw+qs0aO1aJyr3hrc7E!LwUlGyjB% z)!k6-lO9^)m{#&DCMJ`ofS_*2KMmZo#irxuq?tWtRaVjHLKTNnJi?Kk6Coc~o`@3= z3sxwZdgUGEC(i!4a>u)9-MC5(fs0wAc8=$NLtO4)1~})45Fgl?VH~tMKQ2Rg6McF5 z9uGbakIYu!bpk3%ATi$+hhiIX^C-6M`6`Be3}g<720^lITRs{3zKrPp^SnUrAyn~; zd5>U**Cv=^RE_qRp)1=Pm=|>4$qp1E3lXk<&?zI zG2*!uAI*$uCu!I;I5;Im7^KLp!oj7$Mp2@Rl)o<3@uMZu?J z&V`R9(7*h-F|3*BqnUXoopBM8cb8GqaJ(ByJh+b}E69d2lXZ{db%xW)qN2H0?ck^~ z#6}S1s+TsS753DZ@QPYWZaQMhAeJ7O7bu`-hDEPS#k{uVH$d`xQ#vt)^*nS?CJ zzZ(3#!k1YLy9{(se_DO?$%)1gXz5iMyn&71k$nHsRiFQEW>>T->%_{mhEEG zP<970XI(YMVaA$Z!a2>qMm`Oh5LO(c=QJJ-#fR0;V8-NJvpvU8hkaGT8w`!m?}}Gp zrxOajWgx_%YVlsOMbx z(B-CDVCEyxH)UY=V_7g;CO_w3|4F{=a*>K=i|VmG9}4n3zTCc)w4tpPW#dl_U{<(! zT-jbTlUo7OFvV*9d5D$Ajb>iNk`9jq&==tcTDege&NtMON51Nr6k^h0nY)iMt+Nvn zUwAxg3}`X8Ex?f);c@QrUfaI(Jq0Z&ey-&K8-gQuZZ|9*96?%*9zCGK z@Ze+!>?;o1pfg!vM=;d0I{7T~tUYArFSg^7fKa$5#8^L>+WAGPWcRO;=9u*Jnrz#D zZh0xy5rNEN(mcrmrr@R7Bull?Xx;N+k{#bQLDlp=F@)?RhTZ)bb-24r($qdKp-~)0nf`YPK?3{{#1!?#$TTtL=gICL#X-d@5oO$1G63+!wmV z4?67}{*j}jfPp<%h8|l2S9l5$Hkl-wRSv#wn$#vBt%rSG?!e^x^Io>ij$?rJEn?#r zuD%`-He7x?#`m{b>mhzSVmtS%RXJu0jzjgmZCQQ6!&BGS!}Cdj{nPblZf&1@{3gHl z>tt8i3to5I_!k*o|2=G`+(+!sYjUKk(FLKY9*NbQb?&v6Klhc-nfW=RN;Tq+X4|!} zHa2ag4<+R~ppJGN@6VE9f@a%8hP7M5*nUs(G$tusHDQ^70{KKYZaujikK_Jc&$hI8 z)A-=Tvkoom?wHf}^ZuA|UM(yp~;MRi-(#nglTkB<b5Rp0#YvvYYL1#+*P7X)Z~ z8fVbcD75g=Ug!ydGKM!;D+0zGCYOspvs;Y94d*igoE&uGBFb{o?P zE=IG2F@KqW|s62D=jZ)lmHhKmulG>ojYYQ2>rMxNSx$%L)FfKiYkho1$4X&D@Qco@znc0 z&D{0hcGhPtsonamnt?PbU+;7X#VDg_!o9(*oSzYfePuAce^mMpS@it8c$GmgAVb!K z)ZghjKE&eG_IoL+_7Jjj#UWlh_fuwZ2aL=c(PfC z8G;@A@gMucIa>%nat}8fxLUG~fS+QozV`YOqv#P&ge`}_8 zXww;u&JVRo7v2hY?UUaK=F+CW6(5m3xTyK{p2@me^DEJl)Ni71bVO^9%3;f=rY-;8 z5|ys*&=O^A*(39@DgBamSGhy0xVm-Sj_XeaSvMRD4k$J14Gg+eT~FDR1)70h4wib{ z4aLzFldgEx{pfwE(*DMmQCkd3E;1w5KfE}A(S1R=>cNH73&D&nM9oG0%I7b`7{%CQ zA}Nz)OD~LMe35xzHGr8Fapv@kysQ4shs<_IDuYuXDAs%3?3^*#yI^QmT&U;r8do(! zKYzB$Md_;4zUU@t^68U5F5xu|)99M=g*ex@KbHj)o(KMZ<+|hFza>A|K=8w$LzAsr z*Ac?So3+Z5=iHR=oWg^gj2;i4&zFwc(l)=5Fip3A1b&IKe;P#t&ioZ|QCO$R54v#3 zIu?kyB{iWN#rr*yDEg`2`fqpCXhF*9YRz(3K+F?ejxhXP%8uIlGEi>w&1cyipf2Qa zpvB1H?MwLq8%10ZnxncKs$>f;$U?XC&AZU!H#9tXg=NG=Vk6Qi>lgzcUxAw4`C)RG zS1*l$UH5SPmjllr3qFqrxW*wDXkD(0|3)t|ovAMt5=D@ydbM*0<1t6C8^J{1$3h`J za|w0h3A%hRp}UqIrI4_Vo*>h12!hqHrAvNpL7|QTu8~fuY00rEae9(BQ>06LGAn6U zWI&KN#Elv36Pvy#BsQ6|7{hhQ8<{*^0X85qrt7Y}^Z)YWCVZ{cY5-upHSZ}WI7V23 zW7neeu&*@$hB1cbDdvzo%k7|NB>N|u?Boi*jd2in7M#ll9UMO}Qa;EP!cKR^q^9co z86U!|X9ImIecP;)Em#>Q2D0nVyYUB8tsunF;{I28X5vS@&}WJ;YEWFI2V|C&sI~o^ z`Lxo=ql;AU)N%A}dkp9=7K47wCBeWoz-!Q)@832J+xqibxbVuddkn9S_sOU!7`g&> zWesinFp2`?OWRrQ8Xbsg%prU884QF!sdM987gz$lk zL)J;G{YG0{dU=D1&GQ-0r=3ds3xAW+<%nx(szTr$nmBd^)B-1ZeC)DZVxetNK(31^ z=%WUmIU5Q#DV{2LIHWDSKt3pr!8!0F+ud6BpE9Kk=$tCuWb>3v{!oH@%z4j~U#Bww z{Cp+K(=1tE;Ui)&DT5{sJ%qy^K`mcfiGOc6eOSKrxm+Jf;5m_HW7l&en(#v=VCxv* z+|*}yYYiqc{|DGaqy9=m&{&AFFJDZ45iuAJ20zfpB3@(5J4SrC_Vil(Yf8ge9oe0K ztE~^cZYpjQZ8J@_YJk%Dio7-eYug{aI0v=fn%~3u*?`ln3O#;_7~3I$eah?mE&HYQ z(qX=NTi=z{mWzTBD!#XlzSK#2+@I>Jl=bA zUjO9rCE<1s%IqP;wr?QOXAEmPr}wRk|3o1`Yf}in|yTn`cV|c9DRD>Y~kMJ z4-o>Dz)gawvp-M~^Iez5pnd-a_y+he=0jse|``^1@aN=ekG>og71OYpaI%v=&p~sv6!%zX3+5h z?#?5KdaQMN_1@_0>(sjgXl9_cFXB5mmahyrLJMrC*?6pggC{=bJ30#B+&1L5C+2Nl z+Y{A>sEde8I*tC56YiCWqaW1Q1<*f5e3%(VcF{-`leS@<`!2EWJzHiV?1&}u@YdUA z_X=%3IbH{VB0{{{Cw_%um9y{I`gX@qE|*Lfe;r<_K(Sk2F`+ zgMP*th9#MrEpz-HMg2oet_TvAdCl}krdQcw4_-i3U^8xX5rWh?3e1Ci>zy+z%>9Eb zt_K3vQ3)3kn*&t>ZS2ICVFZI~NkL9m0uB-Rst+jE2CucpR|~)f$Z+l3RE$6-xz(`C z9Z|sKcBG7hli612DuGg&j~uUxXj!(8=7_O0e$w+ycM;7`@(=e%Kxq3&X6g1s zEF(qRm<{BANB}u6AmR&sm%KQ9NSlrS^)lB~M{u)FdE<_+s`|IiIA1K+KTFmp12P5* zdu5PETbeMYA%qXk+w?cOk>zlhOaF?1!l%?;a3_LDsI$S>D1jF(230P0IU!Xc!jY8ioX@hG*-tge?15 zuqpuW;q5+tIjY_rs#@wFGD#d}S5E3pu=g=jIZ+E&4q(=~MP8;UjJwO%1!_1`*lNhA zf>8dS5#AtnR{9XKSusdB4PBSPEEZ*c^*9_17H!V|q97p8ztleT zxZ0`#Gk)~QE*1H)R`+eXs2$-TUeWKD4@tJe z9P{bxK5hFtmR^dyxIC!L&yy7%WPs6>lIBd+;Cd#A)C8;_$Yfmz?{WWC&F}aB=G_#U zP-w52bpT=aO_|Ik?wIkou7Hqf!o9G;K_#09{=3za*p=~!5P0-vSdvbT+2^pWjEIg_ zDz)Ww)P(SC(z;y87FKP5^W}mZSsC@@f?-Yn=7h%{dIi~jY+S3sUPZ1$4yu{(X>t7n z6zG`T@`AvfbEa%MY{S6xQnMQa2laNtI0QOGfOHP~SKrr%`r=hsav>LDv_~tiR+`(xlsr_A zMT7|unR`o@dQme=Rk9KK%U`NxLuK`Ry40C+LmX?D6hv2~Knqtv^ecmq zBKRGDsQSYktM;*oI+kJ%@l+S^T)S?StZfX8!beo!zIl*9zEzV=MI(b}gt>V_|F=`141ztr~KIDJLkeKfl+UYn=tG^Ax}^5Az{>PMAt2V;xu zXe4$d4bv)PbAY$B<$V0~zh=c}**D+tUVah7-EIv5vy?9OAmDY6_vdN$g@+^XK(#Q9 zKCYh#zzvR?jq{#Olkv6cMlB-s{7dFw@fuhKVBrWm`X)sTC{8gA_+z-ar(=3i#cxztd23s$(V&@<*)MK6`SIMaY3 zUPkc*t`|OBuM<`=znd@AIR=g&Pqgjh-Y`6(Z=Cdg5AcR@bN4t9D$WnP-GYtt+7M#n zSe5sRuavk&mQ*;|j2iy&vTy>&(g(ELYS&X~0@b(pOZN`gJ6>XnoJ?;#zPU(04(ot4 zDf_(x&e&YvgUw-Ys{YkH+Z6Ixp1BexHv!G}KI6gA-^S}>9Qxb(5?z(3xTX3Qa;*be7v7`}ODW0#ewoSrYIVRFy@&sD0N`D?)!XMsTXxal2c%eI`c-pZ8nXY`n7 zRNtJ9hPirc%b$pk@-`UG-^qhH8vceZR3Mb*`}Seo{mus{{rM40^=MtdhnzV%a(M4N zur8q7#V^;ucA#JY0EIJMd&Iw?-{Zq<2NMBx098?dHfkfA3Dtt3qSymer`FhMIP-34 za%u*>wxuxfk!$>ioVZ*%VHvJ2(dHkJspUp&AkJd%-MEKWu zlbxA%BNN*w8ZSJ)UDxK?93ZV_iJ%-c?$jHs+4v+Nlk@&bmv1JGijj;$DD8S&xgO>T)UH;z=vxt(CMn)FgT)$=cnxa-c8F;U zoAP`8RkvV&eakt8TkvoDule_XHrThRFy~*oW3nI$Jx=tnsLFE+6Kn)VWo)Z5Y0h`6 zAaAy?>}fZ>oo&Nr@t_yetQVakO5GCyZsNhTtI(5tO-IB0)WZq~;p-8Oz26Wrka*m& z(Dc^h9^3`5C!2Llg%9966+svGgTq&dMR`FB8& zDQ;%GEz}+!X}ZtbRB0U;pM9s*b}C9h-eSR9*yt=SvS_<09Ppn$Ymkx#bETX#+dld# zi))WRhz1o%mq=4#Y9x2=Z|FGL(x=T}&2>S%!w~QXjjkPJ3=dRF!Rewc~Pn2 zfBZ!LXoO)~o~Ifyx2_#3EbDc*|IlH5e_c7Q;CHAwHr&2La*y4%6&n?djqZro{K&!* z_sQ)zJjpQJs2$}4{4H#snn#{Oaqafc2y(R?FDF;H)w`VgMrtB$gIC>0U2~XP0Qe6G0wlEug448>nDSEN!0M~$9JAVIa%KJV4adoF_nLBi!4Ghjk z+kR=zXp-Oc4F8<0XKs_w6tm7~Cc>i1Q3hWXV7~bHW($*9@4_eLh8^m^qz$=$r1ZK> zo%i7Kt47EeAL60*l6DAjBHcs9jL13;xng2Z+ArDDES-nnckESakUME(ApdRa$<a+kmJM~$o_yjy4lQ@y;^VZ<1 z=d5c%jwv`Ym!IF*c^6XdqGV^n!BC*C0;HW0NA^xjG^-UV+2S(TvPr$hE{v_BN0k{d z$Z>u*1^i5t;KnsFb?)fn!5l7UR0dPaW358X$WQ@1l0Ve1H(d7pzEZ?12XY^a53R# z2@T#Vk9PJ+Wl(wsufxcxP8aoRn&q1e;WRL)BH(?Kox5(?I6_}gt-)4O8YLXr zHjVtIf@7`t;lKUG7r==%{4ITKs84x6Y~t%MZqW8YOma{_#htJcH{!Ox#-9F7HL&uc zJqEw2u>vlpe>EQ8mQmoFM^OKKzzf0A^RYtS2>s~vhd6bQGFzZAU$0_)*rMfmcS)&5LG9 z8k!YeLwD|v|5M=pIZv=N1gtW&YzD2^8+f@wT9hys&cmKGmdm<>v_5>nqKDQ5ziduo!Bn8 z#yw|y@!GdVXr2Kbg8&D-IBm_!zf_$qmMl{$5DjgM)dx*Gh*UQ(&bN1G@j`^LDez?j z|D@l}BT)i`W4)W-uMOWrl8+kzLFIZpcQB-gw)w_6}Ilj(9FPZ_6q2bg^gu2)^bRD6(#X|#Ob$1Gudx8L~s0-I$=!f4is)huWvu|z+QGWM4* zj&-FLZ|izY_F8-YOA8^x>{k;uaobX5it#z4C~<`|^v(42#d~`u_}s6#Ge%Qw?yrd* z9Sr*vV&zE55bl|KsM|gZjymCDmde!=rwh>B{(ru#>aw##9J1ak=FhE+d=G@G)#XQa z7OTZYHmMp758nOJ;lT`i#AwZbRAf5EXrE~-*;)+46RZkB-k@cscKDw7w3PVd6_CDa zvB@+pIho)d&-PADNo2;dlYC?M#yjd6koT6?e|Q;q-oLrtGG%P$Y^Uq2_RDZ}QfiX& zG~`Fv4k#*aw?3OegKeN-dfGDC$Kv2e_9atdn<bStHiDNe%n@%L<*Jn7Tjp>~7?ZpKwaIZmmVE!j{>Q zf=7(r-=A`S-bxr&F_W29pUxgfDu&Mdt@zVb0B?R2se0{m_GeSJj5|#wd85`3&Ub|< z(5X$$ntyERvr(UO`#nMi#yCS4w!5cqcq!&@DklxkPBzPY6KkOS)5MCd9B;BAq&eNf+V5q764$jo;JjbJ6O8Ux^4X@{9b5RefP&pK zQo;`CY}C1R;J<7~+7;pMI=i~6+>PJax_4-u92GOAhSRcN;vb%{b2=NW}xxI<{W-QPvU9yfxf$&;{xwu2zFlsy&u>O;l>iS zn9`7J4xUnx;4b6~Htq1z`9-s{(VDS$Z~h@5pgJt&v_9C@ZJSQqt;&ti&eXMH)GO%{eXOse>v%LgHlwWRjCr1 zq6G=t_@m?gSagTlNDuX0naL%Fx*Dxc#u9Cwd2Bs#!Z`BPOq&)V7M!D#Zn*vZst*q{ z$r=~>k3B&)g%&)(L*%=*ch^6?W8*e>|1BybtHOEAHAk-NKK4t8`@S8MQ#nkKr+4f) z;A0;AdSBC#Q@@}Wmn?c7Jpz)eE9W)w^y!&e0fDgiHIxZ_)Tt0Z3Wu07-Gtb zNgsFc@&sK=lWl5OPPUDgoG&Tt;uowG5KEeEyj1Qoplc@zKcU(t_9g|cpk(@iXWJ^a zCV2XcrwoY12|Ti+Aee-AVw|=(5%Y5ZODkfzkVx2uN9AK4c3lW39d{?EM#9UFX+G^# z&CNHJUCFnWGac2w{3+n5TPf?C2TWw*I@2CAw2?ZE2KbtssB zt@@e0T>)Do+-h1uF7XS9-6p4fN|W(kpxMaO?xvHL?{__JnF#il1^PTw1sM7116%uA zI=io`G1u)Z!XfPEKW_-*T?)O#oQ9e?CU1_~9OF1R(pTbqS4$gvQMNG5ovz*O{-MaL zJH#N>{rZWMpXJ;gFW)!aVXK_{3x1w`*ObD4o&|@Qnv)z*!jUOWTxwikd~$Vs9On7Tk2MANwAlS}dM>-t zV|OGgV4c^FoPCr;+avFmx|5Uc5}y#uNoJ?Ej*T%rQrX_S5|hYVQ(`N2WyCx9raJB% zy*Kn|=MC9)dji^JRAlpM4RiTv&T-~Sn+Tn$dv~NdrDiP?*Fe{}U2L=@eKjsMGrcNq zuRV$wP^x05C0x|nAMvSYpANs^SW&tI9|L=Uzk=j$k!m7F9^35$z~l%|A*1u-RM zoVSOIq^x4t*;q;{N2;-bl+n>tl`<4ENy^|c2uW^P6+~PlTHMsF$ra8_NlN_Z@eh)6 z)8N}a2{YK++WmwtHPO;^S8Af+`emt!^R+cn6DN*UNvAnfR$L%uaDCFaD1Rb{Rf6APq|C6KgJ0!fETpfKssAf~r;sD}$f%1GRnG7`6?jKpn*#az*%#LsSt+n*(srX*!fszQ=7CsiTwTB<_gwUm)~eO}7c)|`+s$Eprh zIrX$@Ws$UYS|E(C!j~sD4Mr=g9Zu>-% zX+QQv9(cW-pZ|0_Oz(R~Rf6UA@u54V^SI~)t!NBW_DTQ2M-&Xnw#s7r?suZ?^gEbB zKKR&wb@|5FD`IOlOvXhA#&bfvH_P=IO8`i}brSX}#Wl(jH&*5(s1|m&^>z4Gy+`Q2 zl`R)9+~pP0;+lZL2Y3|ejit{UGDTHWCj%PFFt{CBo5-4bpL+hM`emTgH>zC+l0E5k zx2pbP)iq7iw-C)rf8-2IuW*6dot0XR%;0>$r0paneO8Ju%b(c|S%4)is_{@s`2CQw z!ktQJO9!YzUpv{fBd{p-#xGO8c0YO{tpN>vOLs?`yzTSGV4b=?fge2Z!Ka`;v5E1? zldJiVlbSw(p&qWT-VnXik(JX?Zz2e~(E)zm-b(K39??H$l@hfBgKzl-1VtNcHw{!u znrU_RjP~B@>l$blx>W}q_t*X`=KhMHI*TllFj%rIp9%8|Kc(xk_-kod`neSS{v-Wd zu81Wmn<(Wqa9p}}6Q3skYwf;#{U&9mroT%W!ORaSGdtHOW%^&gkuq=Jy&sS=gG0ko zX5_=Dl=(Qumojbb9a84W)6Om_)7|q-$~^CVA!S~^YLGIwZr_nIckkVAlrl{Z9!iTF zHJqr-yd5cTL-+(erYHQBk9E!38P8(xN=4`Xol`yK?(i}>C%bMbALZ(}BQ=d(#lGY~ zx`YHjGZ{|_t{(BRtfeyIQJ+UI76n>Kmt8a=i<57_0? zttdBRTCwUX_)TvKsmJP%371xh1vpoiT^UaMBjWE=&D1LuR@Keq2YlFIyAYd_81GU* zFC>PNqVWX3jJo&prPq>EGr!h0W`(t}=v_)aOj;Xrb9|MkKK*aICWnNe0$gJf=$>J| zE6$Hq#Vo9+-?F(LQ{RMogkrttB*jr2+%$3lI4qjPKq5Z9H?{z&4|8=ndP;ACB$yr0&60010&r7G0ZdpQayhS}1R>=$L zZ)kTZa*O>CclcOqi6lzL2oUG-sc*N^CKf=aM>uB` zVB7<*sh_XkhwLb!kF5)yFcE{X3GvpI4Yc`@mOMGQskJ2n=|KeMVC@)UuxoPqHzq}= zaopX;Ur4Uq4t=asnz($Gk}65CG#K`?Sx*AxgMyOM;$!13KIJSa*W*#u{I@1AYKWTn z?1h*3-dZ#7t?CQ5ZtH@kf=QU}3HEu2IZp~w46*^E$&&ydf{Nq9S;1J}KYQZWQ-xbiJnaoL#<`TJYLWeqT zr0f(N^WrMeb{!as&WGpA=d`zdCnYTZluzJ6=U#_rA?1B5fkB4&bt>WcZD`$-BF5dA z)3|f}khn`m-H=C)>)A21rrHO*H)EaFbu5J^U;o%>%TWp~2Yt*=BG`A)oqzx#ysQP5 zAB~-JgTl&SpdsiGhWliFg)^3W78ic1&M^X^+NsL?f^F7ZJ=BM7c z9Aji-i1*zk zIxV*bWC2<|B)WEz>T9qB{+fUPEjG}PvV%ghO1@Ry6wloGS5xyPV|9W$;qApf$>w|1 ziBRWmQZFkN`u_eIRKlGDL#RF6`J-mH3}9)QfuRb?-&)2e{e8XzK-U9d^Bh=-h=V%Q ze&(PHax_5Aj75dqQ<-|xIN<3cC0|2pk!Fqk+Mbt2&mBkh(OJmQzKsJ$Bl90Ypsd`h z9EE5#UY~|DMzH1AE+`d8rQ6!Va*P1BtiQdsD|$a@G`_EPtKp+A-u2u7fELx4b}hu@!4lE z%-DCvzVG{%ec!WZFWE}Oj3wLH*I|$(Dxy-U6d}S`Vw57uzD6}QWGo-1!u)*C@1OU5 z-*fK!{&nxU_jO*+$K#!~iB=mu8!eT=m436OVAs2$yQ%qU^Y>}hR$988;R}#BBL>1y zEm%F|cWzUS`mN%3W7yibH^pVRQpw5mHjo*({jdQ7>PFL8*h4drl2Ao-J|)-iHOSo99B;XKefS2_E}I zKX#RZMX3T0BsNhz#x@Y4jm)xJf5%40e7hquyAb{`5?0^|d0L+z<`#FE)$*dfoGtVO zy3{FxDdO(TRsOeGz2>k;a_&kgk=s*-$Hdldwjo7l%`?y5 zS!E-ouK>q~Eg2QNIR_~iE88HTlj8RxPSHl+y}fHNeIONPxLyd#g~#x6r0oRpnK9;> z?P(AHQ-w3i1Sbj(gtHjz3sJOLVV6?&%cx2))mB?HS*|l}iSc%VH;w26+vo`kgARi~ zh*=gF^TEHFft?3t2N68mcaf^RcEH~r14?Res~vQy)%1DA?Yr!|A8Dyk++T}0bf}V; z;=s~6Z~dLg!Vg?tX0yL5b=5ZIMCqh-Fg=URDB63QbplE-W}=hN@MnCbO{beAsNXIp z=|n_=BSjR+Gba`=iXb@-g)XR9CgKV$q!G3&{!Q`fC9I}#pcoFL8=!7dhGQ=t=`Qbp z_~BXrX@2B*;UUQ>v3D(SL>NGnh&S7B@#^HtM?l8aJ%>!6c&2hTTy7tV!>fGscEkvr znKUMTTuuExk=~Y0$U(dKRN%9+XdgAXoq?-!lmjC)PD2TztasB;u{YL>brnH z%fT&WTjFZ!oc$*2Qw+y)FDtbho1@#U%xA$%L7XRxA*Qd{$>C4Vhm zD)$~B-VyKpZq8@UrYgkxk8e;ydzJTf{@cSo99eIqU|$NMBh;+7^N!=^okIc`qYyaL zaG=_Z+T`AYLMyR&>0w6U8(Nk1@Quh>teBla0RC@Ke}`Pi-(Q#{>_YUre!_ zj0%TCKl8*~o-aIG#R`pcq$0De(d`+09Lx-fLVk@!(VYq0CTiOa&WryhY+;i7M0Pa` z;_q#XRSrnG8=tWvdP-La3ljoTr<+kt{eqk91!OP5>Vkf?o3d|lTTPQI;Ti6eMM4z= zMT6!GBuMabmSU4Ck?DQzIXk8Y9*0(e{K{AOgg2xgZI{ zkOaljT6==j!fIsulvDcBidg-;Kf;2x3;0O0`Nbb2&+zo#RA+c z00k=jmzQ>~$U2PEfB(P31$^p{N@lrtan+w-jd^n!EAyqiEttK>f*M(=v}5Ej(E03A zuFW~0qIAX7t=m62QVR^_*HvSU4E5ybH9HA<5eqhos;G7na8Mi!sLx2)@OCOuE(I>9 zg3~z|sAJ?YC#c^Z0Ug95Dw1^C(*`A1^84KlT>S?bCt-d#Btdhz2v*|>VMta!s(St5 zWyH4rP52gDoPKqK;JKQ1t$!-;Hjx!=ZMJDxL}oV|1hxg&HD}2!cw+54tF~;sEca>c zsCkTl>yTQc^5roiy750PP}z|E3e6Qa(r%65!5*_lbZfB(h1z=Qp+DQk=9_5rrSp64 z$E=}dR+zk>_&;u_oa$6F3vbUs;qwDD@T1VAcvQi_7q9OJrGq#c)lO~H)bzjRKqfj$ zj7&A^O>tmAdl#iQ$F3m3xFcgREO|3^`|A;7+Ba#lAeAKnIzA2P#h1$6+TTaR|PRf?>! z#;rhBORR1y$O_BR3J!`6=yt;HJEj)4LOMC(;WbPv-g*P^Qe9@+IKe7zI;J{1zdUNO zOPcbBr#-ymJIPcTL!o)iEv!)*2KLNKxLZPZdxg3QnMlw;CbKFy9g@4l>LyDUJ z9T9Tq+esZKt1b%}50TDx|5{&6GSqAg=qXlIb+8B*9=Pzx=r$pqXW9l~&2x@@LWiPF8goZS&_;M+LE>zoY$9Iv#2)r5>&YIP08Tx}!`x>w--RA%A=?Ytry z6boJ~3I%R&AC!0(r5>R=c$Ka>rzc;=#tD2-F3uvf*(TO@Z7P5-flR8lzBH679nT2+ zqpN^e1Z4Sc?_mNHs_&}7t27V`LFjgfpFe_ownRq|!T6ki6!-Gg*6~lWYnkR2O!9U~ z%KW2rTPG_gQ>SLcX;5hY z6<)L|Xy4?hwiS$TQ_%n0&$~JUxjx!rS?E90=P_lswi21VYZ8@e^p_(R+6Au3?7w$L z8cLO42t3ZZb(-EUAlv+Ru$RAX{%A!)_{bKEvd8TU{`KE_tVN~tBv}EkiT(pVUT0cc zitbCa!y-*_fBfxmhl7=Sd(MA95ZA>Jg1fI#9=b;}VIZme_a21Wnw{H!^K3Q7Uk9Zd znqWm>)_iZQ4JBvznfdQ7N4|WaRdqN*iT2BkOFP?<$mPNt+_q#qJ+80 zB7NtMCKsNEBWCAnmKe`Ywo?ykIxG(WrdX!=4t0kA3XVcZrZaZ7z+FsVx@*H zSOLz7tS4-edI?)pQCOcd>?v4{Oy%m+2cXghZTU@9u{(#Jh>8DZy3wKizZME2+(3iZ ze-E%dycHXAAcB?&PX8}s-VngggC7gPNDJ3+>jK} zzO$xEDGxK|TiZ_ttB+S%<92PKf|J&(1s)qKQM6*Q|5*OM8Dwq{6j?ExZ_BH?`x;f# zvpPDsh7)|v$18^u5j>s|y)B8tiQ39h_43J(RO7($k31L?r1>u(0Rl&zIBuTi78+KuXVRykH_{kf?(9HFG;PfseQ=X^Eb5zZ(q- z&)^vWKIsh#Pnnc(K&zHAEAxXV4-EB#aR@76qnCY*e|kGuXDP`QLrWa9)mho|-oSx$ zB!<*|6Q@xyaR<5-EqqDJ>mF!sRqcM?f1>P=6=N!B!T3YyBPN(K=y_fXa5JYr5XHt5 zB|-HZgBW6Z))_(goR(%qeF$?LYMyofpqupI!aUTB`b(#fZ5;L^=rG`qj2oNPr9>85 z|0J_$#@~Hn>@RJQmd1c;ghC$4n&PS=9*K(b@XxTmMj$B`W&iLXeV)d)-uGPz1hBDe zh`j)Q>o%(gSszcgx@9ADiP@z>Mk~!2_|(CIqU4guYdkByrpjxs&GbCe5B(p@)&>~? zY72u)mI(8dPfe_RnJ=cJ?;6>#AGYGvxv4Nt=(+Xsfrpi@1?*eC8=k-irS$K}l=r)b zyw-eijx2u-$QyG%&KJ^8j9?1E6<0scJ&<- z98W^KMryq^-t&qtFs+Fg0uGczyynLxj}E0?rT*GpLwb@m`mkj;9o_V?U(9-sWKtW$746Zi@l;pVCz3MQc|6Gd6uRMAk{inj@@-$}))0}&JOz2S4 z8L1$2DZa}lv8G#Aq56nMxbWoqXZHCV0pE^GT=;TH6T)@&-v*B=LM4%W6lwTEw z>)D~=q~{x+?=LRC=qGT*3%s;DSLuG-8L5>V?T0U7L|3E@A0OH$S83WtMO|ymq9bbi8$kRRdKv- z1p>L6hGg4!Aoxu`NZ9cX?G1TTZaXOnzzY!oaNAvEE1fEwTE31SfXW(NAc%=_4Zkq< zAeB*-{53Ck`hj}%qv7k0q71y$SIm=7Z$86=;p=OO^%Ysy6Wt!Yk%;{Ays-||07d)7 z$@qTRyh(*g_Tgc^Vhg`5f7MXPYPGy+)mLz{f#!CL*L6U1}(cFD!1)!B@BG^AcVm&O|#A= z=soZ2Q`KDTx#V?&vs*kHlqf5!q?HtKoS zU@V*ojt!%Fmi6>J-Js)Kx~4+*YqFbuup}iYDt0Z(gL%4Eopo*#Avj?=kjndQHN`uA zTN9Yi#L&=9w9EM74+IsZ{`zFVsKl2kJc5PxApun8flnQrhNLmlml&ONv5<(A(hepFo3&h$_+V{hx_FywY5SpM4vxX5yN*g%EbWU@^u2}nvk-K3S} z`_^OuUP86Mb6@#3YBg8$AKs_{6MkDHOVs~n32H4gHMz$8-G8k3fuyC^E@ z@NU8{)ll$2|LYOhjhhpZOz@^}doHG4F46t40-(bVqfXXx=PU!VY2)n)F8zha{L@=j0#XOFfpCgvPH%uN$kizl4#Je;7{Pc#^e9Hqf zx8hH&G!N}FT5DlAO)=#e%WI8_X+B3Hbloz4ZgC4*CfA zNuyT;nSDN=cd87IUFQ8wZxtWVr=EREllmDtQO~wT;oUc6Tb4R7Jx|rvk=EW<4vDZ5 z*r(D^Dt;+hseT>|B)Nh9Ji})%2A@hf75l8n-?)S@SX7vHownbRo%0D@v_Cl9GFUg# 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

    *l&bREZEk6+Iz4TB(>Zi{ka{ylIvuN~h89mp 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%0D;OtCILASc04`QAy6gvCb0rMrP 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 W4c%0MOn~vvf(0NG+}J1 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 Wc${})c-)2nkvK6N^y2@f@_zsi(xgoQ diff --git a/installer/HL2Launch.cfg b/installer/HL2Launch.cfg deleted file mode 100644 index 662b86f..0000000 --- a/installer/HL2Launch.cfg +++ /dev/null @@ -1,38 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J- --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"c:\programme\borland\delphi7\Projects\Bpl" --LN"c:\programme\borland\delphi7\Projects\Bpl" --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/installer/HL2Launch.dpr b/installer/HL2Launch.dpr deleted file mode 100644 index 7eacc19..0000000 --- a/installer/HL2Launch.dpr +++ /dev/null @@ -1,189 +0,0 @@ -program HL2Launch; - -{$APPTYPE CONSOLE} - -uses - SysUtils, - ShellApi, - Windows, - Classes; - -procedure LaunchFile(eFile, eStartDir, eParams: String); -var eStartInfo: TStartupInfo; - eProcInfo: TProcessInformation; -begin - FillChar(eStartInfo, SizeOf(TStartupInfo), 0); - with eStartInfo do begin - cb := SizeOf(eStartInfo); - dwFlags := STARTF_USESHOWWINDOW; - end; - - if (CreateProcess(nil, PChar(eFile + #32 + eParams), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, PChar(eStartDir), eStartInfo, eProcInfo)) then begin - try - WaitForSingleObject(eProcInfo.hProcess, INFINITE); - finally - CloseHandle(eProcInfo.hProcess); - CloseHandle(eProcInfo.hThread); - end; - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); - Write(' Done.' + #13#10); - end - else begin - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); - Write(' Couldn''t start hl2.exe!' + #13#10); - end; -end; - -function GetFileSize(eFile: String): Int64; -var eFindHandle: THandle; - eFindData: TWIN32FINDDATA; -begin - Result := 0; - if not FileExists(eFile) then exit; - eFindHandle := FindFirstFile(PChar(eFile), eFindData); - if eFindHandle = INVALID_HANDLE_VALUE then exit; - Result := (eFindData.nFileSizeHigh * (Int64(MAXDWORD) + 1)) + eFindData.nFileSizeLow; - FindClose(eFindHandle); -end; - -var eStream: TFileStream; - ePath, eParams: String; - eModDir: String; - eSearchRec: TSearchRec; - eStr: TStringList; - i: integer; - CheckSuccessful: Boolean; - StartTime: Cardinal; -begin - ePath := ExtractFilePath(ParamStr(0)); - for i := 1 to ParamCount do - eParams := eParams + #32 + ParamStr(i); - Delete(eParams, 1, 1); - if Pos('console', LowerCase(eParams)) = 0 then - eParams := eParams + ' -console'; - eStream := nil; - eModDir := ''; - - SetConsoleTitle('HL2 Launcher'); - Sleep(200); // wait a few ms until the launch program is closed - - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); - WriteLn(' _ _ _ ____ _ _ '); - WriteLn('| | | | | |___ \ | | __ _ _ _ _ __ ___| |__ ___ _ __ '); - WriteLn('| |_| | | __) | | | / _` | | | | ''_ \ / __| ''_ \ / _ \ ''__|'); - WriteLn('| _ | |___ / __/ | |__| (_| | |_| | | | | (__| | | | __/ | '); - WriteLn('|_| |_|_____|_____| |_____\__,_|\__,_|_| |_|\___|_| |_|\___|_| '); - WriteLn(' for listen servers using Metamod:Source'); - WriteLn(''); - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); - { Check files } - WriteLn('Checking files...'); - if not FileExists(ePath + 'hl2.exe') then begin - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); - WriteLn('Error: hl2.exe is missing! Maybe wrong directory? If not, start your HL2 Mod again via Steam and try again.'); - ReadLn; - exit; - end; - if not FileExists(Copy(ePath, 1, Pos('\steamapps\', LowerCase(ePath))) + 'steam.exe') then begin - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); - WriteLn('Error: Cannot find steam.exe! Make sure this application is located in your listen server''s directory.'); - ReadLn; - exit; - end; - { Verify GameInfo.txt ... } - Write('Verifying GameInfo.txt...'); - if (FindFirst(ePath + '*.*', faDirectory, eSearchRec) = 0) then begin - repeat - if (FileExists(ePath + eSearchRec.Name + '\GameInfo.txt')) then begin - eModDir := eSearchRec.Name; - break; - end; - until (FindNext(eSearchRec) <> 0); - end; - FindClose(eSearchRec.FindHandle); - if eModDir = '' then begin - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); - WriteLn(''); - WriteLn('Error: Couldn''t find GameInfo.txt!'); - ReadLn; - exit; - end - else begin - if Pos('game', LowerCase(eParams)) = 0 then // a small test which isn't worth a notice - eParams := '-game ' + eSearchRec.Name + #32 + eParams; - - eStr := TStringList.Create; - eStr.LoadFromFile(ePath + eModDir + '\GameInfo.txt'); - if Pos('|gameinfo_path|addons/metamod/bin', LowerCase(eStr.Text)) = 0 then begin - CheckSuccessful := False; - for i := 0 to eStr.Count -1 do begin - if Pos('searchpaths', LowerCase(Trim(eStr[i]))) = 1 then begin - if i+3 >= eStr.Count then - break; - eStr.Insert(i+2, ' GameBin |gameinfo_path|addons/metamod/bin'); - CheckSuccessful := True; - break; - end; - end; - - if CheckSuccessful then begin - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); - SetFileAttributes(PChar(ePath + eModDir + '\GameInfo.txt'), 0); - eStr.SaveToFile(ePath + eModDir + '\GameInfo.txt'); - SetFileAttributes(PChar(ePath + eModDir + '\GameInfo.txt'), faReadOnly); - Write(' Registered MM:S sucessfully' + #13#10); - end - else begin - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4); - Write(' Unexpected EOF, your GameInfo.txt seems to be corrupt' + #13#10); - end; - end - else begin - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); - Write(' Done' + #13#10); - end; - eStr.Free; - end; - { ... and set it to write-protected } - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); - Write('Setting GameInfo.txt to write-protected...'); - try - eStream := TFileStream.Create(ePath + eModDir + '\GameInfo.txt', fmShareDenyWrite); - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); - Write(' Done.' + #13#10); - except - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14); - WriteLn(''); - WriteLn('Warning: Couldn''t set GameInfo.txt to write-protected!'); - eStream := nil; - end; - { Launch Steam if not opened } - ShellExecute(0, 'open', PChar(Copy(ePath, 1, Pos('\steamapps\', LowerCase(ePath))) + 'steam.exe'), nil, PChar(Copy(ePath, 1, Pos('\steamapps\', LowerCase(ePath)))), SW_SHOW); - { Launch game } - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); - Write('Starting HL2...'); - StartTime := GetTickCount; - LaunchFile(ePath + 'hl2.exe', Copy(ePath, 1, Pos('Steam', ePath)+5), eParams); - if (GetTickCount - StartTime < 10000) then begin - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14); - WriteLn('Important: If you experience any problems starting HL2 using this program, please start it once via Steam and try again.'); - ReadLn; - end; - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); - { Free GameInfo.txt } - Write('Removing read-only again from GameInfo.txt...'); - if Assigned(eStream) then begin - eStream.Free; - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); - Write(' Done' + #13#10); - end - else begin - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4); - Write(' Skipped' + #13#10); - end; - { End message } - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); - WriteLn(''); - WriteLn('Thanks for using Metamod:Source! Visit http://www.sourcemm.net/'); - Sleep(2500); -end. diff --git a/installer/HL2Launch.exe b/installer/HL2Launch.exe deleted file mode 100644 index 4a85d2d04505ca2d88c227910a38a2f1ea200285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43008 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

    55V$X_SxwbIGd;j5TO>d^rSiV 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 diff --git a/installer/MMS_Installer.cfg b/installer/MMS_Installer.cfg deleted file mode 100644 index e9c1cc1..0000000 --- a/installer/MMS_Installer.cfg +++ /dev/null @@ -1,38 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J- --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"c:\program files (x86)\borland\delphi7\Projects\Bpl" --LN"c:\program files (x86)\borland\delphi7\Projects\Bpl" --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/installer/MMS_Installer.dpr b/installer/MMS_Installer.dpr deleted file mode 100644 index 09273ac..0000000 --- a/installer/MMS_Installer.dpr +++ /dev/null @@ -1,72 +0,0 @@ -program MMS_Installer; - -{ - - Metamod:Source installer is published under the zlib/libpng license, as well - as Metamod:Source itself. You can find a copy of it below. - - --------- - - zLib/libpng License - - Copyright (c) 2007, Metamod:Source Development Team - - This software is provided 'as-is', without any express or implied warranty. - In no event will the authors be held liable for any damages arising from the - use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it freely, - subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software in a - product, an acknowledgment in the product documentation would be appreciated - but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source distribution. - - --------- - - Used components: - - - Indy 9 (www.indyproject.org) - - FlatStyle Components (www.torry.net) - - FlatPack Component Pack (www.torry.net) - - JVCL Lib Pack 3.0 (jvcl.sourceforge.net) - - Half-Life 2 Icons by Vasili "vaksa" Vorotnikov, Thanks! - Visit www.vaksa.net for further information - -} - -uses - Forms, - UnitfrmMain in 'UnitfrmMain.pas' {frmMain}, - UnitFunctions in 'UnitFunctions.pas', - UnitfrmProxy in 'UnitfrmProxy.pas' {frmProxy}, - UnitInstall in 'UnitInstall.pas', - UnitSelectModPath in 'UnitSelectModPath.pas' {frmSelectModPath}, - UnitPackSystem in 'UnitPackSystem.pas'; - -{$R *.res} - -begin - Application.Initialize; - Application.Title := 'Metamod:Source Installer'; - Application.CreateForm(TfrmMain, frmMain); - UnitfrmMain.VERSION := GetVersion; - frmMain.lblWelcome.Caption := 'Welcome to the Metamod:Source ' + VERSION + ' Setup Wizard'; - frmMain.lblInfo1.Caption := 'This wizard will guide you through the installation of Metamod:Source ' + VERSION + '.'; - frmMain.lblSubTitle1.Caption := 'Please review the following license terms before installing Metamod:Source ' + VERSION + '.'; - frmMain.lblSelectModInfo.Caption := 'Please select the mod Metamod:Source ' + VERSION + ' shall be installed to.'; - frmMain.lblTitle3.Caption := 'Installing Metamod:Source ' + VERSION + ' via FTP'; - frmMain.lblTitle5.Caption := 'Installing Metamod:Source ' + VERSION; - frmMain.lblSubTitle5.Caption := 'Please wait while Metamod:Source ' + VERSION + ' is being installed.'; - Application.CreateForm(TfrmProxy, frmProxy); - Application.CreateForm(TfrmSelectModPath, frmSelectModPath); - Application.Run; -end. diff --git a/installer/MMS_Installer.exe b/installer/MMS_Installer.exe deleted file mode 100644 index 35e42b1599d1299d2b7866328c0b2650fc6c96d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 637952 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%0A(jG>d~ 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

    q>V;SLLUVYGOZEyP6|93`E5_VA!byak48~;Tu8Z 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�rj3YS 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%0D6ZzdNr+coo02`JJy3$pE%!QU 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 Q*L$F!r!VeaUhy3Ge|jS@Z2$lO diff --git a/installer/MMS_Installer.res b/installer/MMS_Installer.res deleted file mode 100644 index ace3317386baf91cfcde64e0f3db13dbbe283fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171456 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
      iSEi@7TPRPDST6;k%@geks-j4Ea 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 0) then begin - eOld := eNew - eOld; - //eOld := eOld *2; // this is only used for faster updates... - Result := 'Metamod:Source - Uploading with ' + FloatToStr(RoundTo(eOld / 1024, -2)) + ' kb/s'; - end; -end; - -function GetAllFiles(Mask: String; Attr: Integer; Recursive: Boolean; ShowDirs: Boolean; ShowPath: Boolean = True): TStringList; -var eSearch: TSearchRec; -begin - Result := TStringList.Create; - - // Find all files - if FindFirst(Mask, Attr, eSearch) = 0 then - begin - repeat - if eSearch.Name[1] <> '.' then begin - if ShowPath then begin - if ((eSearch.Attr and Attr) = eSearch.Attr) and ((eSearch.Attr and faDirectory) <> eSearch.Attr) then - Result.Add(ExtractFilePath(Mask) + eSearch.Name) - else if (ShowDirs) and ((eSearch.Attr and faDirectory) = eSearch.Attr) then - Result.Add(ExtractFilePath(Mask) + eSearch.Name); - end - else begin - if ((eSearch.Attr and Attr) = eSearch.Attr) and ((eSearch.Attr and faDirectory) <> eSearch.Attr) then - Result.Add(eSearch.Name) - else if (ShowDirs) and ((eSearch.Attr and faDirectory) = eSearch.Attr) then - Result.Add(eSearch.Name); - end; - - if ((eSearch.Attr and faDirectory) = eSearch.Attr) and (Recursive) then begin - with GetAllFiles(ExtractFilePath(Mask) + eSearch.Name + '\' + ExtractFileName(Mask), Attr, True, ShowDirs, ShowPath) do begin - Result.Text := Result.Text + Text; - Free; - end; - end; - end; - until FindNext(eSearch) <> 0; - end; -end; - -function GetAllDirs: TStringList; -var eList: TStringList; - i: integer; -begin - eList := TStringList.Create; - frmMain.IdFTP.List(eList); - frmMain.IdFTP.DirectoryListing.LoadList(eList); - eList.Clear; - for i := 0 to frmMain.IdFTP.DirectoryListing.Count -1 do begin - if frmMain.IdFTP.DirectoryListing.Items[i].ItemType = ditDirectory then - eList.Add(frmMain.IdFTP.DirectoryListing.Items[i].FileName); - end; - Result := eList; -end; - -{ This is another possibility I coded because I couldn't find another bug... - -function GetAllDirs: TStringList; -var eList: TStringList; - i, eStart: integer; -begin - eList := TStringList.Create; - frmMain.IdFTP.List(eList, '', True); - eStart := 0; - - - // +----------------------------------------------------------------+ - // | drwxr-xr-x 5 web3 ftponly 2048 Jun 25 19:43 files | - // | drwxr-xr-x 2 web3 ftponly 2048 Jun 25 19:57 html | - // | drwxr-xr-x 3 root root 2048 Jun 20 05:03 log | - // | drwxrwxrwx 2 web3 ftponly 2048 Jun 19 2004 phptmp | - // +----------------------------------------------------------------+ - - - // at first remove all non-directories from the list - for i := eList.Count -1 downto 0 do begin - if Pos('d', eList[i]) <> 1 then - eList.Delete(i); - end; - // then we have to find the position where ALL filenames start... - for i := 0 to eList.Count -1 do begin - if (eStart = 0) and (Pos(':', eList[i]) <> 0) then - eStart := Pos(':', eList[i]); - end; - - if eStart = 0 then - eList.Clear - else begin - // find the position - for i := 0 to eList.Count -1 do begin - if Pos(':', eList[i]) <> 0 then begin - while (eStart <> Length(eList[i])) and (eList[i][eStart] <> #32) do - Inc(eStart, 1); - end; - end; - // remove the detail stuff... - for i := 0 to eList.Count -1 do - eList[i] := Copy(eList[i], eStart +1, Length(eList[i])); - end; - - Result := eList; -end; } - -end. - - diff --git a/installer/UnitInstall.pas b/installer/UnitInstall.pas deleted file mode 100644 index 66e7b1e..0000000 --- a/installer/UnitInstall.pas +++ /dev/null @@ -1,561 +0,0 @@ -unit UnitInstall; - -interface - -uses SysUtils, Classes, Windows, Graphics, Forms, ShellAPI, Controls, Messages, - TlHelp32, IdFTPCommon, ComCtrls; - -type TOS = (osWindows, osLinux); - -procedure AddStatus(Text: String; Color: TColor; ShowTime: Boolean = True); -procedure AddDone(Additional: String = ''); -procedure AddSkipped; -procedure AddNotFound; -procedure DownloadFile(eFile: String; eDestination: String); - -procedure BasicInstallation(ePath: String; SteamInstall, ListenInstall: Boolean; OS: TOS); -procedure InstallDedicated(eModPath: String; UseSteam: Boolean); -procedure InstallListen(ePath: String); -procedure InstallCustom(ePath: String; eOS: TOS); -procedure InstallFTP(OS: TOS); - -var StartTime: TDateTime; - SteamPath: String; - StandaloneServer: String; - Cancel: Boolean = False; - -implementation - -uses UnitfrmMain, UnitfrmProxy, UnitFunctions, UnitPackSystem; - -// useful stuff - -function InstallTime: String; -begin - Result := FormatDateTime('HH:MM:SS', Now - StartTime); -end; - -procedure AddStatus(Text: String; Color: TColor; ShowTime: Boolean = True); -begin - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - if ShowTime then begin - frmMain.rtfDetails.SelAttributes.Color := clBlack; - if frmMain.rtfDetails.Text = '' then - frmMain.rtfDetails.SelText := '[' + InstallTime + '] ' - else - frmMain.rtfDetails.SelText := #13#10 + '[' + InstallTime + '] '; - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - end - else - frmMain.rtfDetails.SelText := #13#10; - - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - frmMain.rtfDetails.SelAttributes.Color := Color; - frmMain.rtfDetails.SelText := Text; - frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); - - frmMain.Repaint; - Application.ProcessMessages; -end; - -procedure AddDone(Additional: String = ''); -begin - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - frmMain.rtfDetails.SelAttributes.Color := clGreen; - if Additional = '' then - frmMain.rtfDetails.SelText := ' Done.' - else - frmMain.rtfDetails.SelText := ' Done, ' + Additional + '.'; - frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); - - frmMain.Repaint; - Application.ProcessMessages; -end; - -procedure AddSkipped; -begin - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - frmMain.rtfDetails.SelAttributes.Color := $004080FF; // orange - frmMain.rtfDetails.SelText := ' Skipped.'; - frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); - - frmMain.Repaint; - Application.ProcessMessages; -end; - -procedure AddNotFound; -begin - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - frmMain.rtfDetails.SelAttributes.Color := clRed; - frmMain.rtfDetails.SelText := ' Not found.'; - frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); - - frmMain.Repaint; - Application.ProcessMessages; -end; - -procedure FileCopy(Source, Destination: String; CopyConfig: Boolean; AddStatus: Boolean = True); -begin - if (not CopyConfig) and (Pos('config', Source) <> 0) then begin - if AddStatus then - AddSkipped; - exit; - end; - - if not FileExists(Source) then begin - if AddStatus then - AddNotFound; - exit; - end; - - try - if FileExists(Destination) then - DeleteFile(PChar(Destination)); - CopyFile(PChar(Source), PChar(Destination), False); - except - Application.ProcessMessages; - end; - - if AddStatus then - AddDone; -end; - -procedure DownloadFile(eFile: String; eDestination: String); -var TransferType: TIdFTPTransferType; -begin - // There's only one file to download and it's ASCII :] - TransferType := ftASCII; - if frmMain.IdFTP.TransferType <> TransferType then - frmMain.IdFTP.TransferType := TransferType; - // download the file - frmMain.IdFTP.Get(eFile, eDestination, True); -end; - -procedure UploadFile(eFile: String; eDestination: String; CopyConfig: Boolean = True); -var TransferType: TIdFTPTransferType; -begin - if (Pos('config', eFile) > 0) and (not CopyConfig) then begin - AddSkipped; - exit; - end; - - eDestination := StringReplace(eDestination, '\', '/', [rfReplaceAll]); - - // the same as in DownloadFile() - TransferType := ftBinary; - if ExtractFileExt(LowerCase(eFile)) = '.txt' then TransferType := ftASCII; - if frmMain.IdFTP.TransferType <> TransferType then - frmMain.IdFTP.TransferType := TransferType; - // upload the file - frmMain.IdFTP.Put(eFile, eDestination); - AddDone; -end; - -procedure FTPMakeDir(eDir: String); -begin - eDir := StringReplace(eDir, '\', '/', [rfReplaceAll]); - try - frmMain.IdFTP.MakeDir(eDir); - except - Application.ProcessMessages; - end; -end; - -function FSize(eFile: String): Cardinal; -var eRec: TSearchRec; -begin - if FindFirst(eFile, faAnyFile, eRec) = 0 then - Result := eRec.Size - else - Result := 0; -end; - -// stuff for killing processes - -function GetProcessID(sProcName: String): Integer; -var - hProcSnap: THandle; - pe32: TProcessEntry32; -begin - result := -1; - hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); - if hProcSnap = INVALID_HANDLE_VALUE then - exit; - - pe32.dwSize := SizeOf(ProcessEntry32); - if Process32First(hProcSnap, pe32) = true then begin - while Process32Next(hProcSnap, pe32) = true do begin - if pos(sProcName, pe32.szExeFile) <> 0then - result := pe32.th32ProcessID; - end; - end; - CloseHandle(hProcSnap); -end; - -procedure KillProcess(dwProcID: DWORD); -var - hProcess : Cardinal; - dw : DWORD; -begin - hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID); - TerminateProcess(hProcess, 0); - dw := WaitForSingleObject(hProcess, 5000); - case dw of - WAIT_TIMEOUT: begin - CloseHandle(hProcess); - exit; - end; - WAIT_FAILED: begin - RaiseLastOSError; - CloseHandle(hProcess); - exit; - end; - end; - CloseHandle(hProcess); -end; - -// Installation here - -{ Basic Installation } - -procedure BasicInstallation(ePath: String; SteamInstall, ListenInstall: Boolean; OS: TOS); -var eStr: TStringList; - i: integer; - CopyConfig: Boolean; - eFound: Boolean; -begin - frmMain.ggeAll.MaxValue := 8; - frmMain.ggeAll.Progress := 0; - frmMain.ggeItem.MaxValue := 1; - frmMain.ggeItem.Progress := 0; - - if (GetProcessID('Steam.exe') <> -1) and (SteamInstall) then begin - if MessageBox(frmMain.Handle, 'Steam is still running. It is necersarry to shut it down before you install Metamod:Source. Shut it down now?', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNO) = mrYes then begin - AddStatus('Shutting down Steam...', clBlack, False); - if GetProcessID('Steam.exe') = -1 then - AddDone - else - KillProcess(GetProcessID('Steam.exe')); - - while GetProcessID('Steam.exe') <> -1 do begin // sure is sure... - Sleep(50); - Application.ProcessMessages; - end; - AddDone; - end - else begin - Application.Terminate; - exit; - end; - end; - frmMain.ggeAll.Progress := 1; - frmMain.ggeItem.Progress := 1; - { Unpack } - frmMain.ggeItem.Progress := 0; - AddStatus('Unpacking files...', clBlack); - if not Unpack() then begin - AddStatus('No files attached!', clRed); - Screen.Cursor := crDefault; - exit; - end; - AddDone; - frmMain.ggeAll.Progress := 2; - frmMain.ggeItem.Progress := 1; - { Check for installation / Create directories } - CopyConfig := True; - AddStatus('Creating directories...', clBlack); - if DirectoryExists(ePath + 'addons\metamod\bin') then begin - case MessageBox(frmMain.Handle, 'A Metamod:Source installation was already detected. If you choose to reinstall, your configuration files will be erased. Click Yes to continue, No to Upgrade, or Cancel to abort the install.', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNOCANCEL) of - mrNo: CopyConfig := False; - mrCancel: begin - Application.Terminate; - exit; - end; - end; - AddSkipped; - end - else begin - frmMain.ggeItem.Progress := 0; - ForceDirectories(ePath + 'addons\metamod\bin'); - AddDone; - end; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 3; - - { gameinfo.txt } - if not FileExists(ePath + 'gameinfo.txt') then begin - if MessageBox(frmMain.Handle, 'The file "gameinfo.txt" couldn''t be found. Continue installation?', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNO) = mrNo then begin - AddStatus('Installation canceled by user!', clRed, False); - Screen.Cursor := crDefault; - Cancel := True; - exit; - end; - end - else begin - eStr := TStringList.Create; - { Metaplugins.ini } - frmMain.ggeItem.Progress := 0; - AddStatus('Creating metaplugins.ini...', clBlack); - if CopyConfig then begin - eStr.SaveToFile(ePath + 'addons\metamod\metaplugins.ini'); - AddDone; - end - else - AddSkipped; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 4; - { Gameinfo.txt } - frmMain.ggeItem.Progress := 0; - eFound := False; - AddStatus('Editing gameinfo.txt...', clBlack); - eStr.LoadFromFile(ePath + 'gameinfo.txt'); - for i := 0 to eStr.Count -1 do begin - if Trim(LowerCase(eStr[i])) = 'gamebin |gameinfo_path|addons/metamod/bin' then begin - eFound := True; - break; - end; - end; - - if not eFound then begin - for i := 0 to eStr.Count -1 do begin - if Trim(eStr[i]) = 'SearchPaths' then begin - eStr.Insert(i +2, ' GameBin |gameinfo_path|addons/metamod/bin'); - AddDone; - break; - end; - end; - SetFileAttributes(PChar(ePath + 'gameinfo.txt'), 0); - eStr.SaveToFile(ePath + 'gameinfo.txt'); - SetFileAttributes(PChar(ePath + 'gameinfo.txt'), faReadOnly); // important for listen servers - AddDone; - end - else - AddSkipped; - eStr.Free; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 5; - end; - { Copy files } - frmMain.ggeItem.Progress := 0; - AddStatus('Copying server.dll...', clBlack); - CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'server.dll'), PChar(ePath + 'addons\metamod\bin\server.dll'), False); - AddDone; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 6; - if ListenInstall then begin - ePath := ExtractFilePath(Copy(ePath, 1, Length(ePath)-1)); - AddStatus('Copying hl2launch.exe...', clBlack); - CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'hl2launch.exe'), PChar(ePath + 'hl2launch.exe'), False); - AddDone; - end; - { Remove files } - frmMain.ggeItem.Progress := 0; - AddStatus('Removing temporary files...', clBlack); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'hl2launch.exe')); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server.dll')); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server_i486.so')); - AddDone; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 8; - { Finish } - AddStatus('', clBlack, False); - AddStatus('Finished installation!', clBlack, False); - frmMain.cmdNext.Enabled := True; - frmMain.cmdCancel.Hide; - Screen.Cursor := crDefault; - - if ListenInstall then - MessageBox(frmMain.Handle, PChar('hl2launch.exe has been copied to ' + ePath + '. You can use it if you want to start your Source game with Metamod:Source enabled.'), PChar(Application.Title), MB_ICONINFORMATION); -end; - -{ Dedicated Server } - -procedure InstallDedicated(eModPath: String; UseSteam: Boolean); -begin - StartTime := Now; - Screen.Cursor := crHourGlass; - AddStatus('Starting Metamod:Source installation on dedicated server...', clBlack, False); - BasicInstallation(eModPath, UseSteam, False, osWindows); -end; - -{ Listen Server } - -procedure InstallListen(ePath: String); -begin - StartTime := Now; - Screen.Cursor := crHourGlass; - AddStatus('Starting Metamod:Source installation on the listen server...', clBlack); - BasicInstallation(ePath, True, True, osWindows); -end; - -{ Custom mod } - -procedure InstallCustom(ePath: String; eOS: TOS); -begin - StartTime := Now; - Screen.Cursor := crHourGlass; - AddStatus('Starting Metamod:Source installation...', clBlack); - BasicInstallation(ePath, False, False, eOS); -end; - -{ FTP } - -procedure InstallFTP(OS: TOS); -function DoReconnect: Boolean; -begin - Result := False; - if MessageBox(frmMain.Handle, 'You have been disconnected due to an error. Try to reconnect?', PChar(Application.Title), MB_ICONQUESTION + MB_YESNO) = mrYes then begin - try - frmMain.IdFTP.Connect; - Result := True; - except - MessageBox(frmMain.Handle, 'Failed to reconnect. Installation aborted.', PChar(Application.Title), MB_ICONSTOP); - end; - end; -end; - -label CreateAgain; -label UploadAgain; -var eStr: TStringList; - i: integer; - CopyConfig, eFound: Boolean; -begin - frmMain.cmdCancel.Show; - frmMain.cmdNext.Hide; - Screen.Cursor := crHourGlass; - - frmMain.ggeAll.MaxValue := 6; - frmMain.ggeAll.Progress := 0; - frmMain.ggeItem.MaxValue := 1; - frmMain.ggeItem.Progress := 0; - - { Unpack } - frmMain.ggeItem.Progress := 0; - AddStatus('Unpacking files...', clBlack); - if not Unpack() then begin - AddStatus('No files attached!', clRed); - Screen.Cursor := crDefault; - exit; - end; - AddDone; - frmMain.ggeAll.Progress := 2; - frmMain.ggeItem.Progress := 1; - { Check for installation } - AddStatus('Editing gameinfo.txt...', clBlack); - eStr := TStringList.Create; - DownloadFile('gameinfo.txt', ExtractFilePath(ParamStr(0)) + 'gameinfo.txt'); - eStr.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'gameinfo.txt'); - - CopyConfig := True; - eFound := False; - for i := 0 to eStr.Count -1 do begin - if Trim(LowerCase(eStr[i])) = 'gamebin |gameinfo_path|addons/metamod/bin' then begin - eFound := True; - case MessageBox(frmMain.Handle, 'A Metamod:Source installation was already detected. If you choose to reinstall, your configuration files will be erased. Click Yes to continue, No to Upgrade, or Cancel to abort the install.', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNOCANCEL) of - mrNo: CopyConfig := False; - mrCancel: begin - Application.Terminate; - eStr.Free; - exit; - end; - end; - break; - end; - end; - - if not eFound then begin - for i := 0 to eStr.Count -1 do begin - if Trim(eStr[i]) = 'SearchPaths' then begin - eStr.Insert(i +2, ' GameBin |gameinfo_path|addons/metamod/bin'); - AddDone; - break; - end; - end; - eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'gameinfo.txt'); - UploadFile(ExtractFilePath(ParamStr(0)) + 'gameinfo.txt', 'gameinfo.txt'); - try - AddStatus('Trying to set gameinfo.txt to read-only...', clBlack); - frmMain.IdFTP.Site('CHMOD 744 gameinfo.txt'); - AddDone; - except - AddStatus('Warning: CHMOD not supported.', clMaroon); - end; - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'gameinfo.txt')); - end - else - AddSkipped; - frmMain.ggeAll.Progress := 3; - frmMain.ggeItem.Progress := 1; - - { Create directories } - frmMain.ggeItem.Progress := 0; - frmMain.ggeItem.MaxValue := 3; - AddStatus('Creating directories...', clBlack); - if not eFound then begin - FTPMakeDir('addons'); - frmMain.IdFTP.ChangeDir('addons'); - frmMain.ggeItem.Progress := 1; - FTPMakeDir('metamod'); - frmMain.IdFTP.ChangeDir('metamod'); - frmMain.ggeItem.Progress := 2; - FTPMakeDir('bin'); - frmMain.ggeItem.Progress := 3; - AddDone; - end - else - AddSkipped; - frmMain.ggeAll.Progress := 4; - frmMain.ggeItem.Progress := 3; - { Upload metaplugins.ini } - frmMain.ggeAll.Progress := 4; - frmMain.ggeItem.MaxValue := 1; - frmMain.ggeItem.Progress := 0; - AddStatus('Uploading metaplugins.ini...', clBlack); - if CopyConfig then begin - eStr.Clear; - eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini'); - UploadFile(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini', 'metaplugins.ini'); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini')); - end - else - AddSkipped; - frmMain.ggeAll.Progress := 5; - frmMain.ggeItem.Progress := 1; - { Upload server.dll / server_i486.so } - frmMain.tmrSpeed.Enabled := True; - frmMain.ggeItem.Progress := 0; - frmMain.IdFTP.ChangeDir('bin'); - if OS = osWindows then begin - AddStatus('Uploading server.dll...', clBlack); - frmMain.ggeItem.MaxValue := FSize(ExtractFilePath(ParamStr(0)) + 'server.dll'); - UploadFile(ExtractFilePath(ParamStr(0)) + 'server.dll', 'server.dll'); - end - else begin - AddStatus('Uploading server_i486.so...', clBlack); - frmMain.ggeItem.MaxValue := FSize(ExtractFilePath(ParamStr(0)) + 'server_i486.so'); - UploadFile(ExtractFilePath(ParamStr(0)) + 'server_i486.so', 'server_i486.so'); - end; - { Remove created files } - AddStatus('Removing temporary files...', clBlack); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'hl2launch.exe')); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server.dll')); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server_i486.so')); - AddDone; - { End } - frmMain.IdFTP.Disconnect; - frmMain.ggeAll.Progress := frmMain.ggeAll.MaxValue; - frmMain.ggeItem.Progress := frmMain.ggeItem.MaxValue; - AddStatus('', clBlack, False); - AddStatus('Finished installation!', clBlack, False); - frmMain.tmrSpeed.Enabled := False; - eStr.Free; - - Screen.Cursor := crDefault; - frmMain.cmdNext.Enabled := True; - frmMain.cmdCancel.Hide; - frmMain.cmdNext.Show; - frmMain.tmrSpeed.Enabled := False; - frmMain.Caption := Application.Title; -end; - -end. diff --git a/installer/UnitPackSystem.pas b/installer/UnitPackSystem.pas deleted file mode 100644 index 077808a..0000000 --- a/installer/UnitPackSystem.pas +++ /dev/null @@ -1,211 +0,0 @@ -unit UnitPackSystem; - -interface - -uses SysUtils, Classes, Zlib; - -procedure CompressFiles(Files : TStrings; const Filename : String); -function DecompressStream(Stream : TMemoryStream; DestDirectory : String): Boolean; -function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream; Version: String): Boolean; -function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean; -function Unpack: Boolean; -function GetVersion: String; - -implementation - -uses UnitfrmMain; - -procedure CompressFiles(Files : TStrings; const Filename : String); -var - infile, outfile, tmpFile : TFileStream; - compr : TCompressionStream; - i,l : Integer; - s : String; - -begin - if Files.Count > 0 then - begin - outFile := TFileStream.Create(Filename,fmCreate); - try - { the number of files } - l := Files.Count; - outfile.Write(l,SizeOf(l)); - for i := 0 to Files.Count-1 do - begin - infile := TFileStream.Create(Files[i],fmOpenRead); - try - { the original filename } - s := ExtractFilename(Files[i]); - l := Length(s); - outfile.Write(l,SizeOf(l)); - outfile.Write(s[1],l); - { the original filesize } - l := infile.Size; - outfile.Write(l,SizeOf(l)); - { compress and store the file temporary} - tmpFile := TFileStream.Create('tmp',fmCreate); - compr := TCompressionStream.Create(clMax,tmpfile); - try - compr.CopyFrom(infile,l); - finally - compr.Free; - tmpFile.Free; - end; - { append the compressed file to the destination file } - tmpFile := TFileStream.Create('tmp',fmOpenRead); - try - outfile.CopyFrom(tmpFile,0); - finally - tmpFile.Free; - end; - finally - infile.Free; - end; - end; - finally - outfile.Free; - end; - DeleteFile('tmp'); - end; -end; -function DecompressStream(Stream : TMemoryStream; DestDirectory : String): Boolean; -var - dest,s : String; - decompr : TDecompressionStream; - outfile : TFilestream; - i,l,c : Integer; -begin - // IncludeTrailingPathDelimiter (D6/D7 only) - dest := IncludeTrailingPathDelimiter(DestDirectory); - - Result := False; - try - { number of files } - Stream.Read(c,SizeOf(c)); - for i := 1 to c do - begin - { read filename } - Stream.Read(l,SizeOf(l)); - SetLength(s,l); - Stream.Read(s[1],l); - { read filesize } - Stream.Read(l,SizeOf(l)); - { decompress the files and store it } - s := dest+s; //include the path - outfile := TFileStream.Create(s,fmCreate); - decompr := TDecompressionStream.Create(Stream); - try - outfile.CopyFrom(decompr,l); - finally - outfile.Free; - decompr.Free; - end; - end; - finally - Result := True; - end; -end; - -function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream; Version: String): Boolean; -var - aStream: TFileStream; - iSize: Integer; -begin - Result := False; - if not FileExists(AFileName) then - Exit; - try - aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite); - MemoryStream.Seek(0, soFromBeginning); - // seek to end of File - // ans Ende der Datei Seeken - aStream.Seek(0, soFromEnd); - // copy data from MemoryStream - // Daten vom MemoryStream kopieren - aStream.CopyFrom(MemoryStream, 0); - // save Stream-Size - // die Streamgröße speichern - iSize := MemoryStream.Size + SizeOf(Integer); - aStream.Write(iSize, SizeOf(iSize)); - // save version number+length - iSize := aStream.Position; - aStream.Write(Version[1], Length(Version)); - aStream.Write(iSize, SizeOf(iSize)); - finally - aStream.Free; - end; - Result := True; -end; - -function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean; -var - aStream: TMemoryStream; - iSize: Integer; - EndPos: Integer; -begin - Result := False; - if not FileExists(AFileName) then - Exit; - - try - aStream := TMemoryStream.Create; - aStream.LoadFromFile(AFileName); - // drop version part - aStream.Seek(-SizeOf(Integer), soFromEnd); - aStream.Read(EndPos, SizeOf(Integer)); - aStream.SetSize(EndPos); - // seek to position where Stream-Size is saved - // zur Position seeken wo Streamgröße gespeichert - aStream.Seek(-SizeOf(Integer), soFromEnd); - aStream.Read(iSize, SizeOf(iSize)); - if iSize > aStream.Size then - begin - aStream.Free; - Exit; - end; - // seek to position where data is saved - // zur Position seeken an der die Daten abgelegt sind - aStream.Seek(-iSize, soFromEnd); - MemoryStream.SetSize(iSize - SizeOf(Integer)); - MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize)); - MemoryStream.Seek(0, soFromBeginning); - finally - aStream.Free; - end; - Result := True; -end; - -{ Unpack function } - -function Unpack: Boolean; -var eStream: TMemoryStream; -begin - eStream := TMemoryStream.Create; - try - // Get ZIP - LoadFromFile(ParamStr(0), eStream); - DecompressStream(eStream, ExtractFilePath(ParamStr(0))); // Unpack files - - Result := True; - except - Result := False; - end; - eStream.Free; -end; - -function GetVersion: String; -var FileStream: TFileStream; - EndPos, Size: Integer; - Version: String; -begin - FileStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite); - FileStream.Seek(-SizeOf(Integer), soFromEnd); - FileStream.Read(EndPos, SizeOf(EndPos)); - FileStream.Position := EndPos; - Size := FileStream.Size - EndPos - SizeOf(Integer); - SetString(Result, nil, Size); - FileStream.Read(Pointer(Result)^, Size); // YAMS - FileStream.Free; -end; - -end. diff --git a/installer/UnitSelectModPath.dfm b/installer/UnitSelectModPath.dfm deleted file mode 100644 index 436262ce6c27b2c60427026c017b384104e95075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1148 zcmc&z%Z}496m^nL9!;kdA+bP08a6D^u!U8dHnf@!i5d^H1UI>D!nk(jxb5_B=115e zu|fO;OFm%44se{#qe!gT<@(z9JnqTwCc@$5G#QKs0X~iTaTgEKafdVz!f|-~5YNOS z0Sc)+lv?p0eQfP&o$rnLRLw`| zvoU@j47-zLfSYw!ziFlPykHsMV7QdNZqz8|wWq7MWC6B~NzNCfeyCads2$NP5I`hE zl@`~Hd0ABSo%WI^sQ_Ss;tb+2E-rzVF^CaMbMr&9g4%%`A{)nq0ri%Q_Mt51Oj~6( zDyPiGK`rqb**op8jb;zlK%#0LL#K4aX1pF~?+v`V z8E78fy8bMtK$PpH-sI7iuf)-UXLnn8g-{zOIZ%p~x_1R^T2ie0H%q#Y^LR)6#|@74 z)bOL}N3~A8T|()5T!x$~-%8Y&a4v06%#{8M$(QZ35;V$aLFQ0;es?AL1ZD!t+_gt6 zQ?8ni{Fn&!p*Qb#CRH$0DAJ2Mhn}0{d{Yf}?>mE#k3&jiZzUyX2k9b2!G`Oa|jNgb}n*Ds$?OQVH6U6qhEzJ33RJblvV8>UNNmvy)uU&k@YiAq;nH-?Jk zxMI53s~^?(_8PaFv7SdKdwTCQnZEkv2%SK=qS7?>1$s(gKv)X2-c9%~jsHuSU9-EB LW9-RMSw?>V>;-uw diff --git a/installer/UnitSelectModPath.pas b/installer/UnitSelectModPath.pas deleted file mode 100644 index 368d478..0000000 --- a/installer/UnitSelectModPath.pas +++ /dev/null @@ -1,26 +0,0 @@ -unit UnitSelectModPath; - -interface - -uses - SysUtils, Windows, Messages, Classes, Graphics, Controls, - StdCtrls, ExtCtrls, Forms, FileCtrl, ComCtrls, ShellCtrls, - TFlatComboBoxUnit, TFlatButtonUnit; - -type - TfrmSelectModPath = class(TForm) - pnlDesign: TPanel; - lblInfo: TLabel; - trvDirectory: TShellTreeView; - cmdOK: TFlatButton; - cmdCancel: TFlatButton; - end; - -var - frmSelectModPath: TfrmSelectModPath; - -implementation - -{$R *.DFM} - -end. diff --git a/installer/UnitfrmMain.dfm b/installer/UnitfrmMain.dfm deleted file mode 100644 index 14b183c..0000000 --- a/installer/UnitfrmMain.dfm +++ /dev/null @@ -1,11577 +0,0 @@ -object frmMain: TfrmMain - Left = 333 - Top = 271 - BorderIcons = [biSystemMenu, biMinimize] - BorderStyle = bsSingle - Caption = 'Metamod:Source Installer' - ClientHeight = 355 - ClientWidth = 527 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [] - Icon.Data = { - 000001000C003030000001000800A80E0000C60000002020000001000800A808 - 00006E0F00001818000001000800C80600001618000010100000010008006805 - 0000DE1E0000808000000100200028080100462400006060000001002000A894 - 00006E2C010048480000010020008854000016C1010040400000010020002842 - 00009E1502003030000001002000A8250000C65702002020000001002000A810 - 00006E7D0200181800000100200088090000168E020010100000010020006804 - 00009E9702002800000030000000600000000100080000000000000900000000 - 0000000000000001000000010000000000003535360031393E003B3B3B00403E - 3E001D3642001E3C4C002A3B4400323B4100264150002C465400274C5F003E52 - 5D00214C62003A5A6B00205A7700205D7C00365E73002B627F00454343004846 - 46004647490048474800464A4D004A4848004C4A4A004D4D4D00504E4E004F4F - 50004F5050004351590053535300585656005457590055585800595858005C5B - 5B00595D5D005E5D5D00605F5F00595F600045616F005C6364005E696B004364 - 7500496A7B00596B72005B737B00636363006463630060656500666464006167 - 6B00636B6C006C6B6B00706E6E00606C70006370720068747600627479006979 - 7C007170700074737300767575007877770070777900797979007C7B7B007D7C - 7C0019668E0015699300336680002D6F91002C72970029729800337699003D7D - 9D001674A400327CA200476E820042728A005A79850051778B00567D8D005B7E - 8B00637D8500697D8200717C82001380B7002182B3002A82B000398CB7003E95 - BD005F8493006D8287006681890071808500788284007C888E00638C9B00688E - 9A0069919E0079959F00438CAE00488DAB00548CA300588FA600518FA9004B90 - AE005B91A6005594AF005993AA00408EB2004C93B2004C97B9004699BE004D99 - BA005496B100559AB7005E99B000539EBD00599DB800648FA6006397AA007098 - A8006A9CB300729EB50075A6BC007EA9BA001287C3001A8BC500118CCA00188E - CA000D95DB000D98DF001495D6001995D3001E98D5001195D800159ADD001C9B - DB00298EC2002596CD002A95CA003395C3003895C0003D9AC500329ACB00399B - CB002196D000239AD6002B9BD200239BD900319DD00024A0DF002CA1DC0032A0 - D70030A2DD000D9BE3000D9EE800119CE2001A9DE0000DA2EE001EA2E50013A4 - ED0019A5ED001DA8EF001AA7F0001CA8F00022A2E4002BA6E50021A7EB0028A7 - E80023A9ED002BABED0031A6E10034A9E50039ABE50033ACEA0039AEEA0037B0 - EE003CB2EE0024ABF0002BAEF00031AFF00033B1F1003CB4F100429AC3004C9E - C200529FC70070BADD0040B0E9004CB6EC0041B6F10047B8F2004CBAF30053BD - F3005BBEF10062BEED005BC0F40068C1EE007AC0E4007ACAEF0067C4F50069C5 - F50074C7F20078C7F00077CBF60078CBF5008281810086868600888787008B8A - 8A0086979D0090909100979B9F0099989800959DA2008FA0A60093A4AC0080AB - BE009AAEB500A5A4A400A3ADAD00AEBABA0084AFC60093B5C7009EB7C2009DBB - CA00A7BBC500AABCC30093C1D50099C2D700B1C3CA00A6C9DA00B1CAD40084CD - F1008ACFF20087D1F7008AD0F30094D5F6009ED7F5009ED8F60095D6F800A7D2 - E600B4DBED00A3DAF600ABDDF700A4DCF800AFE0F800BFE5F600B2E1F900BBE4 - F900CBE6F300CCE8F500C0E6FA00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - D13F3F3F42D10000000000000000000000000000000000000000000000000000 - 00000000000000000000000042231814141413141418181B3100000000000000 - 0000000000000000000000000000000000000000000000000000311814141414 - 141414141414141414141F420000000000000000000000000000000000000000 - 00000000000000003F14141414181F2A2F5154542F2B2218181414141F000000 - 00000000000000000000000000000000000000000000001F1314141F3969BB9C - 9CB0AFAFAF9D9471511F181414143F0000000000000000000000000000000000 - 000000000000181814183B729DAFB2B5B5B5B5C1B5B5B3B09D94531F18141331 - 000000000000000000000000000000000000000000181814236F9BAFAEB4B5B5 - B5B5B5B5B5B5B5B5B4B2AF912B18161323000000000000000000000000000000 - 000000001818182BBB9AAAAEB4B9B9B9B9B9B9B9B5B9BAB9B5B9B2AF96511818 - 183100000000000000000000000000000000002018182B929AACB7B7B7B7B7B7 - B8B8B8B8B7B9B7B9B9B8B7B7AF9A531818183F00000000000000000000000000 - 00003F14142ABBA1ABB6B6B6B6B6B6B6B6B6B7B7B7B7B7AFAFB7B7B7B69A962F - 18161800000000000000000000000000000018141F6E8BA3A84A2C2D2D8FB6B6 - B6B6A8A8B6B6B650214F5BACB6ACA38F2A161423000000000000000000000000 - 00311814558CA0A7A38804181F29A3A8A7A8A8A8B6A7A11F1F201F21508DA3A3 - 671818180000000000000000000000000014142292A0A4A7A2A710131B185AA7 - A7A7A7A7A2A74B1F1B1B1B1B1812A8A4872F1814230000000000000000000000 - 4218145F8A9FA4A2A7A28B0218180CA4A2A2A2A2A7A20C19160301130484A7A4 - A07018181800000000000000000000001F141F7286A2A2A2A2A2A24504181449 - A2A4A2A2A25916191410460506A4A2A486882A18183F00000000000000000000 - 14142A9B86A2A2A2A2A2A286071314178AA2A2A2A21116140383A2A285A2A2A2 - A28553181418000000000000000000001414568A9FA2A2A2A2A2A2A24D041314 - 47A2A2A28B1616140BA2A2A2A2A2A2A2A28670181818D10000000000000000D1 - 18186385A2A2A2A2A2A2A2A2A20913141684A7A24A1614044DA2A2A2A2A2A2A2 - A286901F14182300000000000000003F14186E86A2A2A2A2A2A2A2A2A2580114 - 160EA2A20C14140886A2A2A2A2A2A2A2A29F8F2216141800000000000000003F - 13187586A2A2A2A2A2A2A2A2A2A20D131414598413141310A2A2A2A2A2A2A2A2 - A29F952318141431000000000000003718187586A2A2A2A2A2A2A2A2A2A28401 - 13181E4814140481A2A2A2A2A2A2A2A2A29F952816141418000000000000003F - 13187785A2A2A2A2A2A2A2A2A2A2A21013181F181B180AA2A2A2A2A2A2A2A2A2 - A29F8F22141414143F000000000000D418186385A2A2A2A2A2A2A2A2A7A8B79A - 1723232723204EB6A8A2A2A2A2A2A2A2A286911F141414141B00000000000000 - 1418568786A2A2A2A2A2A7B7B8B9B9B94C2731313122B0B9B9B8A8A2A2A2A2A2 - A28667181614141414D300000000000014182A999FA2A2A2A2A7B8BABAC1C1C1 - B52B37373752C1B5C1B5BAB6A2A2A2A2A2855416141414141423000000000000 - 1F141D7586A2A2A2A2C1C3C3C3C3C3C3C37A403F37BDC3C3C3C4C3C3A8A2A2A2 - 9F952A14141414141414000000000000D118185E8B86A2A2B8C7C7C7C7C7C7C7 - C762D1D157C5C7C7C7C7C7C7C3A2A2A2866C1818141414141414330000000000 - 00141422BC86A2A2C1CCCCCCCCCCCCCCBED4D4D47ECCCCCCCCCCCCCCCCA7A286 - 893B141818181B18181418000000000000401414568986A2C7CFCFCFCFE1DBD9 - D9D8D8D6C9CFCFCFCFCFCFCFCFA7A2866B181D7D7F7F7F7F5616184000000000 - 000018141F7B869FC1EEEEEEEEE2DEDEDEDEDEDBEEEEEEEEEEEEEEEECFA28690 - 2A1618BEEE807C7C3B16141F000000000000DF1314237886A3EEF3F3F3E4DEDE - DEDEDEE8F3F3F3F3F3F3F3F3C286963B1318182ECA7F23141414141400000000 - 00000037131832BC86B4F8F8F8EAE6E6E6E6E5F6F8F8F8F8F8F8F8CDA0965518 - 181618185DEE661B1414141433000000000000001F16182A798AB0F2FBFBFBFB - FBFBFBFBFBFBFBFBFBF9CC8B8F3B181414141414187DED60181414141F000000 - 000000000018181822659B8BC6F9FFFFFFFFFFFFFFFFFFFCECB0877135181814 - 14141414181FE7F4311814141B0000000000000000001F141418397B9B8AB0CC - EDF2F6F6F3CAC08C8973551F141414141414181F1F1735FBD518141420000000 - 0000000000000034141814183564789389878B87879B736D3C1D181414141414 - 14141DF5DD182AFADA181414420000000000000000000000E018181814181C23 - 3A3C56563A2A1F181818131414141414141418E3FEDDEBFE4114141B00000000 - 00000000000000000000D1181814181818181414141414181418181414141414 - 1416181FDBE9E661181814000000000000000000000000000000000000371814 - 1414141414141414141414141414141414141418181818181823000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF - FFFFFFFF0000FFFFFFFFFFFF0000FFFFC0FFFFFF0000FFFC001FFFFF0000FFF0 - 0003FFFF0000FFC00001FFFF0000FF8000007FFF0000FF0000003FFF0000FE00 - 00001FFF0000FC0000000FFF0000F800000007FF0000F000000007FF0000F000 - 000003FF0000E000000003FF0000E000000001FF0000C000000001FF0000C000 - 000000FF0000C000000000FF0000C0000000007F000080000000007F00008000 - 0000007F000080000000003F000080000000003F000080000000001F00008000 - 0000001F0000C0000000000F0000C0000000000F0000C0000000000F0000C000 - 000000070000E000000000070000E000000000030000F000000000030000F000 - 000000030000F800000000010000FC00000000010000FE00000000010000FF00 - 000000010000FF80000000010000FFC0000000030000FFF0000000070000FFFE - 0000000F0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF - FFFFFFFF0000FFFFFFFFFFFF0000280000002000000040000000010008000000 - 00000004000000000000000000000001000000010000000000003E3D3D003042 - 4C0034444D003D464B002A495A00384B55002C51650024536C003C5968003B5B - 6D0034637B004240400045434300474545004846460046484900454B4F004A48 - 48004C4A4A004C4B4C004D4D4D00504E4E004D4E50004F50500041515B004555 - 5E005050500054525200535455005654540055595900555B5D00565C5E005A59 - 59005D5B5B00595C5D005F5E5E00605F5F00505B6000565F6100585F62005C61 - 61005A6064005261680056676D005C65690057696F005B686B005C6A6E004068 - 7D004E6A790052687100586B71005C6D7100596F7700526D780051717E006261 - 610064636300666464006B6A6A006C6B6B006E6D6D006C75780069767C007170 - 70007473730075747400787777007E7E7E00176288001F678D001D6E98001670 - 9E003B6E890029769E00397D9F001874A3001678AA00247AA700357DA2003C7F - A1004D758700497588005B7B8600507B8E00457A9500647E8900757F82001385 - BF001F88BE002981AE003E82A2003989AF003D88AE002183B500358CB6003C8D - B3003A95BF004D839A004D849C005F82910056879B0051879E005A879E006788 - 9700688997004083A1004583A0004C87A0004D88A3004888A5004488A800468C - AC00498DAB00508EA9004892B5004093B9007699A60071A1B6001E91CB001192 - D4001297DB001698D900199ADA001A9BDD001E9EDE002491C8002999CF002E99 - CE003D97C1003798C6003A98C4003399C900369AC900379BCC003A9AC8002498 - D400239CD700269CD6002E9DD2002B9DD500239EDD0026A1DF0033A2DA000D9A - E2000D9BE4000D9DE6000D9EE900129AE000179DE200149FE600189EE1000EA2 - EE001FA2E50014A1E90010A2EE0012A4EF0015A5EE001CA4EA0019A6EE0019A7 - F0001BA8F00027A6E60029A3E1002BA4E2002BA8E70025A8EB0026ABEF002EAE - EF0033A6E00031A8E40034ABE7003CACE60037AEEB0032AFEF0035AFED003AAF - EA0039B0ED003DB3EE0022AAF00024ABF00027ACF0002AADF0002DAEF10030B0 - F10035B1F10038B2F1003DB4F000439AC300429FCB0040A2D10040A3D40069AD - D00062B0D8007EBAD5004DB0E30049B1E60045B8F20049B9F3004FBAF10058BF - F30059BFF4005EC1F4006DC2ED007DCAEE0074CAF5007FCAF0007CCDF5008281 - 810085848400879396008B94940088969E0096959500989797008F9FA80087AB - BA0088ABBE0099ACB4009EAFB6009BB0BC00A5A4A400A6B3BA00A6B4BA0080B3 - CD0091B9CD00A4BFCC00ADCBD800B1CCD800B9CFD80081CCF2008AD1F60097D4 - F4009FD9F800A3CDE100A1D6F100A1D9F500ADDEF700A0DAF800B5E2F9000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 3F1E161616162244000000000000000000000000000000000000000000001E12 - 12161216160F121212220000000000000000000000000000000000003A12161F - 5675BFC1C1BE7038161612440000000000000000000000000000001E121E7091 - ADB1B4B4B4B4B2AD8439160F3A000000000000000000000000001E123488A7B1 - BBBBBBBBBBBCBBBCB1A57116163A00000000000000000000003A162D8EA8B7B7 - B7B7B7B7BBB9B9BBB7B1A461160F4600000000000000000000121F82A0804D52 - A5B6B6B6B6B6A5395FA5A89B6D16120000000000000000001E1672989F990416 - 4BA2A2A2A2A3511E1B1E327F7E34123F0000000000000000122E7C9F9D9F490F - 16799F9F9F9F1A16010F069F9F61121600000000000000440F70939D9D9D9502 - 0F0A9D9D9D5B120F4A474A9F957B280FD20000000000001E1684959D9D9D9D4F - 0C0F609D9D0B0F039D9D9D9D9D93540F1E000000000000121E8B9D9D9D9D9A9D - 050F199593100F489D9D9D9D9D935D120F0000000000000F2A7C9D9D9A9A9A9D - 5A010F4C5012017A9D9D9A9A9A9A5E0F122200000000000F2A7C9D9D9D9A9A9A - 9A080F11090F079D9D9A9A9A9A955E0F161600000000000F1F8B9D9D9A9A9A9D - 9F8B161F221E5C9F9D9A9A9A9A945D0F0F0F3F000000001E1684959D9A9AA3BB - BBBB573A3D29B1BBB99D9A9A9A94540F0F0F1600000000441268939D9AA3C8C8 - C8C8C5444469C8C8C8C89D9D9A7A28100F0F12D200000000122A7E9A9DCACCCC - CCCCC2D2D2C3CCCCCCCCBD9A9561160F12120F1E00000000221674939FCFCFCF - E2DBD9D7D6CFCFCFCFCFCA9D7B2D276A6A6A2A1000000000000F1F8893D1E9E9 - DEDFDFDFE3E9E9E9E9E9C89264102CCE77581F0F3A00000000D50F318EB4EEF0 - E4E1E1E1EDF0F0F0F0E99871150F1066C41E11121200000000002E102A84AEEE - F1F1F1F1F1F1F1F1E88F6E150F0F0F0F78DA160F120000000000002E161D688E - C5D0EEEFEFEACDAB633716120F0F16151DEC40121200000000000000D40F121F - 5574638884766537160F0F0F0F0F41E61FE55912160000000000000000003A0F - 0F0F1616160F12121212120F0F0F16DCE7DC1B12000000000000000000000000 - D83F1E0F0F1212120F120F0F0F0F0F0F16163D00000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF - FFFFFFC03FFFFF000FFFFC0003FFF80001FFF00000FFE000007FE000007FC000 - 003FC000003F8000001F8000001F8000001F8000000F8000000F800000078000 - 000780000003C0000003C0000003E0000001E0000001F0000001F8000001FC00 - 0001FF000003FFC00007FFFFFFFFFFFFFFFFFFFFFFFF28000000180000003000 - 0000010008000000000040020000000000000000000000010000000100000000 - 00003E41430039424800384851002C5B73002B5C7600345E7300464444004846 - 460045494C004A4848004C4A4A004E4D4D00454B50004D51530041525C004656 - 5F004F595D005151510054535300535455005554540058565600525859005559 - 5A00525B5E00545A5C00525C5F005B5A5A005C5B5B00595E5F005E5D5D00605F - 5F0043576200455862004F5F6800535B6000525D6100585F62004D616A005061 - 67005461670059606300596264005262690056676D00516872004F707E006065 - 670061676A006A6969006E6D6D00706F6F006972760064747D00727171007473 - 73001D6F9A002164860033658000226A900029779F003E7894001478AC00436B - 8100466F82004A7183004C74850048758A004D7A8E005D7C8B0042779300497A - 90004F7F9400467F9900497F9800607C8B001682B9003882A8002686B800348B - B500398EB5003D8EB400318CB9006E8089004583A0004A87A2004789A800428B - AD00438EB0004590B5005499BC00729FB20075A3BB001386C1001D8AC1001192 - D4001694D5001E95D1001799DB00129ADF001D9AD9001F9FDF002D95CA003296 - C6002FA0DA0037A1D6003CA1D30031A2DB0039A6DC000F9AE0000D9CE6000D9E - E900109AE0000DA0EB000DA2EE0018A1E70010A0E90011A3EE0011A4EF0014A4 - EE001CA8EF001EA9F00022A1E10027A5E5002DA7E50023A7EA002EABEB002EAC - EC0036AAE50035AFEE0039ADE80022AAF00026ACF00029ADF0002CAEF00036B2 - F10038B3F1003FB5F20042A0CC0049A9D7006AA7C70076B2CD007AB1C80046AE - E30054B3E30056B5E5005BB8E70045B7F10046B8F2004DBAF30062C2F40066C4 - F4007FCEF60081818100868686008A8989009897970099989800989C9E009E9D - 9E009CA0A3008BA5B000A2AEAE00A7B1B600B2B1B1008DB9CC00A9BDC500A2BF - CD0085C0DE009FCDE50080CBF20086CEF20091D4F6009CD7F6009CD8F800B8E3 - F900B9E4FA000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000331F1F1F370000000000 - 00000000000000000000009C0C08122528190C08120000000000000000000000 - 0000200C2E5A6D8183816B55190833000000000000000000001F0C557D828889 - 898989826C420C320000000000000000370C5284858686868686827F867C4408 - 9B000000000000000C4B74621040797A85794E25476766270C00000000000033 - 19657676050C4F767676220A080676500A9B00000000000C4470737360011070 - 765F08053F5E7671190C00000000000851737373733A083D733B084D73737370 - 400C00000000000C68737373736E020D60090373737373733E081F0000000008 - 6873737373733908220C3C73737373703E080800000000085173737376867F23 - 201F69847673736E410A08340000000C456E737A9595955B374C949589767371 - 2508080C00000037196673969797975D9B8D9797978873500C080C089B000000 - 08496E9799A9A1A0A0ABAB99999463284C8F5C2512000000A30C5983AFAAA4A4 - A8AFAFAFAD7B420C0E8E26080800000000360C5690AEB1B1B1B1B1996B2F0808 - 0828A612089C00000000540C28598C9293928B4B190808083530A23508000000 - 0000000016080C262B190C080808080831A7A71220000000000000000000A5A0 - 9D9D9D9D9D9D9D9D9DA0A0A50000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000000000000FFFF - FF00FFFFFF00FF07FF00F801FF00F0007F00E0003F00C0001F00C0001F008000 - 0F0080000F0080000F008000070080000700800003008000030080000100C000 - 0100C0000100E0000000F0000100FC000100FF000300FFFFFF00FFFFFF002800 - 0000100000002000000001000800000000000001000000000000000000000001 - 000000010000000000003D525D00315467002E5F79004345470048464600434A - 4E004A4949004D4D4E00514F4F004F5050004D5357004A585E004C585E005152 - 52005253540053545500555758005E5D5D00475C67004A5A6200525D62004F60 - 67004B606B0058686F00436677004D6671004A6774004B68760042667800466C - 7E00496A7900486D7D0069686800647077007171710031698600306B8A003B7C - 9B003C7C9A00187FB4002F7CA3002B7DA700437085004372880047758B004777 - 8E005E7D8C001E87BC002D8AB8002D8CBB005B8094006B899600718793007A9A - A80078A4BB001386C2001C8CC6001196DA003B97C5003295C800359BCF002199 - D500249EDC002E9FD8002AA0DB0037A0D40031A2DC000F9DE600139BE0000DA0 - EA000EA2EE0014A3EB0015A5EF0027AAEC003CADE60036AFEC0027ACF00029AD - F0002CAEF00035B1F1003AB3F0003DB5F1004E9BC10058AAD20071B8DD0040B5 - F10069C5F500818080008B8A8A008D8D8D00808E95008599A40097A9B100A6AC - AF00A9AEAF00AEB5B500A3B2BA00B4B4B40097CFEB0083CBF0008DD0F20090D4 - F70095D6F70095D6F800ABDEF800AFDFF8000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000058580000 - 000000000000000000580A1B2E2E17085900000000000000211C424C51514C3B - 14230000000000591F3F3C4A4D4E3D43410C00000000000F3E48012948491708 - 293209000000001E46462806453904383A440C00000062264647470225240346 - 47461D1200006226464747390A0B304747461D050000001F4649525233225650 - 47460B08210000113E5257555C3757574F3215180F0000601F4B68615E636868 - 410C2F3408590000351B54656A6A64530C0508360F230000005F0F1B2E2B1408 - 05055B5D11000000000000000000000000000000000000000000000000000000 - 000000000000FFFF0000FCFF0000E01F0000C00F0000800F0000800700008007 - 00000003000000030000800100008001000080000000C0000000E0010000FFFF - 0000FFFF00002800000080000000000100000100200000000000000801000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000007F7F - 7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F - 7F01000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000100000002000000040000000500000007000000080000000A0000 - 000C0000000D0000000D0000000E0000000E0000000E0000000D0000000D0000 - 000C0000000A0000000800000007000000050000000300000002000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000100000003000000050000 - 00090000000C0000001000000014000000180000001C0000001F000000230000 - 0025000000270000002800000028000000280000002800000028000000270000 - 0025000000220000001F0000001C00000017000000130000000F0000000B0000 - 0007000000040000000200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000100000003000000070000000C00000012000000180000 - 001F000000250000002C00000032000000370000003B0000003E000000410000 - 0043000000450000004500000046000000460000004600000045000000450000 - 0043000000410000003E0000003B00000036000000310000002B000000240000 - 001D00000016000000100000000A000000060000000300000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0003000000070000000C000000130000001B000000250000002E000000360000 - 003D00000043000000480000004B0000004E0000005100000052000000540000 - 0055000000550000005500000056000000560000005600000055000000550000 - 00540000005400000052000000500000004E0000004B00000047000000420000 - 003B000000340000002B0000002200000019000000110000000A000000050000 - 0001000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001211110100000004000000090000 - 00100000001A00000025000000300000003A00000042000000490000004E0000 - 005203030357161616761F1E1E91242323A9343333BE3D3C3CD0403E3ED84543 - 43EA454343EA454343EA454343EA454343EA454343EA454343EA403E3ED83C3A - 3ACD323131BB232222A71E1D1D8C141414720000005700000056000000540000 - 00510000004C0000004700000040000000370000002C00000020000000160000 - 000E000000070000000300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000012111101000000040000000A000000130000001F0000 - 002B00000037000000410000004A000000500908085E1F1E1E902D2C2CB54240 - 40E0484646FC494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF474545F73F3D3DD5292828AC1A1A - 1A820505055D00000056000000530000004E000000470000003E000000330000 - 00260000001A0000001000000008000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000012111101000000040000000A00000014000000210000002F0000003B0000 - 00460000004E0F0F0F69262525A5403E3ED7494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF474545F7393737C8201F1F940707076000000055000000510000004B0000 - 0043000000370000002A0000001B000000100000000700000002000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00030000000800000012000000200000002F0000003D0000004805050555201F - 1F94403E3ED7494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF474545F7343232C01817177D000000570000 - 00540000004E0000004400000038000000290000001A0000000E000000061211 - 1101000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000012111101000000050000 - 000F0000001C0000002C0000003B000000480B0B0B612E2D2DB2474545F44947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF413F3FE02221 - 21970302025A000000540000004E000000440000003600000026000000160000 - 000B000000031211110100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000300000009000000160000 - 002600000037000000460D0D0D65353333BF484646FA494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF454444EF262525A10505055C000000540000004C00000041000000310000 - 001F000000100000000712111101000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000002F3F3F01000000050000000E0000001D0000002F0000 - 0040090909572F2E2EB3484646FA494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4A48 - 48FF4A4949FF4A4949FF4A4949FF4A4949FF4A4848FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF444242E7212020940000005700000052000000490000 - 003A00000028000000170000000A000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000002F3F3F0100000007000000130000002400000037000000472524 - 2497474545F4494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4949FF4C4B4BFF4F4F4FFF515353FF555757FF585C5CFF5B6060FF5D63 - 63FF5F6565FF606767FF606767FF5F6565FF5E6363FF5C6060FF585C5CFF5558 - 58FF525353FF4F4F4FFF4C4C4CFF4B4949FF494848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF3F3D3DDB12121277000000550000 - 004E00000042000000300000001D0000000E000000052F3F3F01000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000020000000A000000170000002A0000003E111111673F3D3DD94947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4A4949FF4D4C4CFF515252FF585B - 5BFF5F6565FF677070FF707B7BFF778787FF7D9293FF7D999EFF7B9EA7FF76A1 - ADFF72A2B1FF70A2B3FF70A2B3FF70A1B2FF73A0AEFF779EA9FF7B9AA0FF7B92 - 95FF78898AFF717E7EFF697272FF616767FF595C5CFF525353FF4D4D4DFF4B49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF484646FC2F2E2EB30505 - 055C0000005200000048000000370000002300000011000000062F3F3F010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00030000000C0000001B0000002F000000422928289B484646F9494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF4D4D4DFF535555FF5C6060FF687070FF768484FF7F97 - 9AFF74A1AEFF5DA1BCFF479FC6FF379DCDFF2899D1FF1F97D2FF1E96D4FF2098 - D5FF229AD6FF249BD7FF259BD7FF229AD6FF2199D6FF1E96D4FF1D96D3FF2197 - D1FF2D9ACFFF3C9CC8FF4F9DBEFF669EB2FF78989FFF778788FF6A7474FF5D63 - 63FF545656FF4E4E4EFF4A4949FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4341 - 41E512121277000000550000004B0000003C0000002800000014000000073F3F - 3F01000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000030000 - 000D0000001E000000330B0A0A543B3939CD494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B4A - 4AFF505151FF595D5DFF677070FF798889FF7E9EA5FF65A4BCFF409FCAFF2498 - D1FF1E97D5FF269CD8FF2CA0DBFF2EA2DDFF30A3DEFF31A4DFFF32A5E0FF33A6 - E1FF33A6E1FF34A6E1FF34A6E1FF34A6E1FF33A6E1FF33A5E0FF32A5E0FF31A4 - DFFF30A2DDFF2DA1DCFF279DD9FF1F98D6FF1B94D2FF2C99CDFF4E9DBFFF709D - ABFF798C8EFF6A7474FF5C6060FF515252FF4C4B4BFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF484646FC2726269F000000560000004E000000400000002B000000170000 - 0008000000020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000030000000D0000 - 001F0000003513121269444242E9494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4B4BFF525353FF5E63 - 63FF707C7CFF80999CFF6BA5BAFF3A9ECCFF2097D3FF239AD7FF2BA0DBFF2EA2 - DDFF30A4DFFF32A6E1FF34A7E2FF35A9E4FF37AAE5FF37ABE6FF38ACE6FF39AC - E7FF39ADE8FF3AADE8FF3AADE8FF3AADE8FF3AACE7FF39ACE7FF38ACE6FF38AB - E6FF37AAE5FF35A9E3FF33A7E2FF32A5E0FF30A4DFFF2DA1DCFF269CD8FF1B95 - D4FF2697CFFF4D9DBFFF7599A3FF738181FF606767FF535555FF4C4C4CFF4948 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF363434C30707075E00000050000000420000002D0000 - 0018000000090000000200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000030000000D0000001F0000 - 0036201F1F80474545F7494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4B4A4AFF515252FF5F6464FF738080FF80A0 - A6FF57A4C3FF2899D1FF2198D6FF2A9FDBFF2DA2DEFF30A5E0FF32A7E3FF34A9 - E5FF36ABE7FF37ACE8FF39AEE9FF3AAEEAFF3BAFEBFF3CB1ECFF3DB1ECFF3DB1 - ECFF3DB1EDFF3EB2EDFF3EB2EDFF3EB2EDFF3EB1ECFF3EB1ECFF3DB1ECFF3DB0 - ECFF3CB0EBFF3BAEEAFF3AAEE9FF38ACE8FF37ABE6FF34A8E4FF32A6E1FF30A4 - DFFF2CA1DCFF239BD8FF1994D2FF389AC8FF6C9DADFF758587FF616868FF5355 - 55FF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF3F3D3DDD0B0B0B6700000051000000440000 - 002F000000190000000903223202000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000030000000C0000001F000000362928 - 2894484646FC494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF4F4F4FFF5B6060FF717C7CFF82A0A5FF51A3C5FF2398 - D2FF249BD8FF2AA0DCFF2DA3E0FF30A6E3FF32A8E5FF35ABE7FF36ACE9FF38AE - EAFF39B0EBFF3BB0ECFF3CB1EDFF3DB2EEFF3DB3EEFF3EB3EFFF3EB3EFFF3FB4 - F0FF3FB4F0FF3FB4F0FF40B4F0FF40B4F0FF40B4F0FF40B4EFFF3FB4EFFF3FB3 - EFFF3EB2EEFF3EB2EEFF3DB2EDFF3CB1ECFF3BB0EBFF39AEEAFF37ADE9FF35AA - E6FF33A8E4FF30A5E1FF2DA2DEFF279DDAFF1A95D3FF3099CAFF6A9CAEFF7483 - 83FF5E6464FF505151FF4A4949FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF444242EA0F0E0E71000000520000 - 00440000002F00000018000000082F3F3F010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000020000000B0000001D000000352A2929974947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4C4B4BFF555858FF687171FF81989AFF5EA6C2FF2498D1FF249BD8FF29A0 - DCFF2CA4E0FF2FA6E3FF31A9E6FF34ABE9FF36AEEAFF38AFECFF39B0EDFF3AB1 - EEFF3BB2EFFF3CB3EFFF3DB3F0FF3DB4F0FF3DB4F1FF3EB5F1FF3EB5F1FF3EB5 - F1FF3EB5F1FF3FB5F1FF3FB5F2FF3FB5F1FF3FB5F2FF3FB5F2FF3FB5F1FF3FB5 - F1FF3FB5F1FF3FB4F0FF3EB4F0FF3EB3EFFF3DB3EFFF3CB2EDFF3BB1ECFF39AF - EBFF37ADEAFF35ABE8FF32A9E5FF2FA6E2FF2CA2DFFF269DDAFF1894D3FF3699 - C7FF7399A4FF6C7777FF585B5BFF4D4C4CFF494848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF454444EF121111740000 - 0052000000430000002D00000017000000072F3F3F0100000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000002F3F3F01000000090000001A000000322B292996494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4F4F - 4FFF5D6262FF778686FF79A8B5FF319CCEFF2098D6FF279EDBFF2AA2DFFF2DA6 - E3FF30A9E7FF32ABEAFF35ADEBFF37AFEDFF38B0EEFF39B1EFFF39B2F0FF39B3 - F0FF3AB3F0FF3BB4F1FF3BB4F1FF3CB5F2FF3CB5F2FF3CB5F2FF3CB5F2FF3CB5 - F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3EB5 - F2FF3EB5F2FF3EB5F1FF3EB5F1FF3DB4F1FF3DB4F1FF3DB3F0FF3CB3EFFF3BB2 - EFFF3AB1EDFF39AFECFF37AEEAFF34ABE8FF31A8E5FF2DA5E2FF2AA1DEFF239B - D9FF1893D1FF519DBDFF768C8FFF616767FF515252FF4A4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF474545F71413 - 137C00000051000000420000002B00000014000000062F3F3F01000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002F3F3F0100000007000000160000002F2B2A2A94494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF535454FF666E - 6EFF829A9CFF55A5C6FF1F96D3FF249CDAFF27A0DEFF2AA4E3FF2DA8E6FF30AA - E9FF32ADEBFF34AEEDFF36B0EEFF37B1EFFF38B2F0FF38B2F0FF39B2F1FF39B3 - F1FF39B3F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF3AB4F2FF3AB4F2FF3AB4 - F2FF3AB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4 - F2FF3CB4F2FF3CB5F2FF3CB5F2FF3CB5F2FF3CB5F2FF3CB4F1FF3BB4F1FF3BB4 - F0FF3AB3F0FF39B2EFFF39B1EEFF38AFECFF35ADEBFF32AAE8FF2FA7E4FF2BA3 - E0FF289FDCFF1C97D6FF2B98CBFF6F99A7FF6A7575FF555757FF4C4B4BFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4544 - 44EF0F0E0E71000000500000003F000000270000001100000004000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000500000012000000292322227E494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4C4B4BFF565858FF6E7979FF81A5 - ADFF369DCEFF1E97D6FF249EDCFF28A2E1FF2AA5E5FF2DA9E8FF2FACEAFF31AD - ECFF33AFEEFF34B0EFFF35B1F0FF35B1F1FF36B2F1FF36B2F2FF37B2F2FF37B3 - F2FF37B3F2FF37B3F2FF37B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3 - F2FF38B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3 - F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B3 - F1FF39B3F1FF39B3F0FF39B2F0FF38B1EFFF37B0EEFF35AEECFF32ACEAFF2FA9 - E7FF2CA5E3FF29A1DEFF229BD9FF1A93D1FF599DB8FF728081FF595D5DFF4C4C - 4CFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF454444EF0C0C0C680000004E0000003B000000220000000D000000030000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00030000000D0000002315141465484646F9494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4C4C4CFF595D5DFF758383FF79AAB9FF2598 - D1FF209AD8FF249FDDFF27A3E2FF29A7E6FF2CAAEAFF2EACECFF30ADEEFF31AF - EFFF32AFF0FF32B0F1FF33B0F1FF33B1F1FF33B1F1FF34B1F1FF34B1F2FF34B1 - F2FF34B1F2FF35B1F2FF35B1F2FF35B1F2FF35B2F2FF35B2F2FF36B2F2FF36B2 - F2FF36B2F2FF36B2F2FF36B2F2FF36B2F2FF37B2F2FF37B2F2FF37B3F2FF37B3 - F2FF37B3F2FF37B3F2FF37B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3 - F2FF38B3F2FF38B3F2FF38B2F1FF37B2F0FF37B1F0FF36B0EFFF34AEEDFF32AD - EBFF2FAAE9FF2BA6E5FF28A2E0FF249DDCFF1694D3FF469CC2FF778A8DFF5C61 - 61FF4E4E4EFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF424040E50707075D0000004B000000360000001D0000000A2F3F - 3F01000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000002F3F3F010000 - 00090000001C0D0D0D4B464444ED494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4D4C4CFF5B6060FF7A8A8AFF6BAAC1FF1D95D2FF209A - D9FF239FDEFF26A3E4FF29A7E8FF2BAAEBFF2CABEDFF2EADEEFF2FAFEFFF2FAF - F0FF30AFF0FF30B0F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF32B0 - F1FF32B0F1FF32B1F1FF32B1F1FF32B1F1FF32B1F1FF33B1F1FF33B1F1FF33B1 - F1FF33B1F1FF33B1F1FF33B1F1FF34B1F1FF34B1F1FF34B1F2FF34B1F2FF35B1 - F2FF35B1F2FF35B1F2FF35B1F2FF35B2F2FF35B2F2FF35B2F2FF36B2F2FF36B2 - F2FF36B2F2FF36B2F2FF36B2F2FF36B2F2FF36B1F1FF35B1F0FF34B0F0FF33AF - EEFF31ADECFF2FABEAFF2BA7E7FF28A3E2FF249EDDFF1995D5FF3298C8FF7891 - 95FF5F6565FF4E4E4EFF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF3A3939D003030357000000470000002F000000160000 - 0006000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000050000 - 0015040404313F3D3DD2494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4D4C4CFF5C6161FF7D8D8EFF61A8C5FF1A95D3FF1E9ADAFF22A0 - E0FF24A4E5FF27A7E9FF29AAEBFF2AABEDFF2BADEFFF2CAEEFFF2DAEF0FF2DAF - F1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FB0 - F1FF2FB0F1FF2FB0F1FF2FB0F1FF2FB0F1FF30B0F1FF30B0F1FF30B0F1FF30B0 - F1FF30B0F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0 - F1FF32B0F1FF32B0F1FF32B1F1FF32B1F1FF32B1F1FF32B1F1FF33B1F1FF33B1 - F1FF33B1F1FF33B1F1FF33B1F1FF33B1F1FF33B1F1FF33B1F1FF33B0F1FF32B0 - F0FF31AFEFFF30ADEDFF2DABEAFF2AA7E7FF27A4E3FF249FDDFF1A96D7FF2996 - CBFF75939AFF606767FF4E4E4EFF4A4848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF2E2C2CAE0000005200000041000000270000 - 0010000000030000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000030000000E0000 - 0025302F2FA2494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4C4B4BFF5B5F5FFF7C8D8EFF62AAC6FF1894D3FF1D9ADBFF209FE1FF23A4 - E6FF26A7E9FF28A9EBFF28ABEEFF29ACEFFF29ADF0FF2AADF0FF2AAEF1FF2BAE - F1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAFF1FF2CAF - F1FF2CAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2EAF - F1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FB0F1FF2FB0 - F1FF2FB0F1FF2FB0F1FF2FB0F1FF2FB0F1FF30B0F1FF30B0F1FF30B0F1FF30B0 - F1FF30B0F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31AF - F0FF30AFF0FF2FAEEFFF2EADEDFF2CAAEBFF29A8E8FF26A3E3FF229EDEFF1A97 - D7FF2895CBFF75939AFF5F6565FF4E4E4EFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF1B1B1B860000004E000000390000 - 001F0000000A1211110100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000012111101000000080000001B1A19 - 1966494747FF494747FF494747FF494747FF494747FF494747FF494747FF4C4B - 4BFF585C5CFF798989FF67ABC4FF1894D3FF1B9ADAFF1E9EE0FF21A3E5FF24A7 - E9FF25A8ECFF27AAEEFF27ABEFFF28ACF0FF28ADF1FF28ADF1FF28ADF1FF28AD - F1FF28ADF1FF28ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29AD - F1FF29ADF1FF2AADF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2BAE - F1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAF - F1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAF - F1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FAFF1FF2EAF - F1FF2EAFF0FF2EAEF0FF2DAEEFFF2CACEDFF2AAAECFF28A7E9FF24A2E4FF219E - DEFF1997D7FF2896CBFF789195FF5C6161FF4C4C4CFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF464444F20A0A0A62000000480000 - 0030000000150000000500000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000400000012090909344543 - 43E6494747FF494747FF494747FF494747FF494747FF494747FF4B4949FF5558 - 58FF748181FF73ADC0FF1793D2FF1A99DAFF1C9EE0FF1FA2E5FF22A6E9FF23A8 - ECFF24A9EEFF25ABEFFF25ABF0FF25ACF1FF26ACF1FF26ACF1FF26ACF1FF27AC - F1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF28AD - F1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28AD - F1FF28ADF1FF28ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29AD - F1FF2AADF1FF2AADF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2BAE - F1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAEF1FF2CAF - F1FF2CAFF1FF2CAEF0FF2BADF0FF2BADEFFF2AABEDFF28AAEBFF26A6E8FF23A2 - E4FF1F9DDEFF1796D6FF3298C8FF768A8DFF595D5DFF4C4B4BFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF373535C8000000510000 - 0040000000240000000D00000002000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000121111010000000A0000001F313030A64947 - 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF525353FF6D78 - 78FF80ACB7FF1F96D1FF1897D9FF1A9DDFFF1CA1E5FF1FA5E9FF21A7ECFF22A9 - EEFF22AAEFFF23AAF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF24ABF0FF24AB - F0FF24ABF0FF24ABF0FF24ABF0FF25ABF0FF25ABF0FF25ACF1FF25ACF1FF25AC - F1FF25ACF1FF25ACF1FF26ACF1FF26ACF1FF26ACF1FF26ACF1FF27ACF1FF27AC - F1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF28AD - F1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF3F83 - A5FF3B8FBAFF2BA9E9FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29AD - F1FF2AADF1FF29ADF1FF29ADF0FF29ADF0FF29ACEFFF28ABEDFF27A8EBFF24A6 - E8FF21A1E3FF1D9CDDFF1594D5FF469CC2FF728081FF555757FF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF1F1E1E8D0000 - 004C000000350000001900000007000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000040000001417171754484646FC4947 - 47FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF656C6CFF85A5 - AAFF299AD0FF1696D7FF189BDEFF1AA0E4FF1DA4E9FF1EA6EBFF1FA8EDFF20A9 - EEFF20A9EFFF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AA - F0FF22AAF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF23ABF0FF23AB - F0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF24ABF0FF24AB - F0FF24ABF0FF24ABF0FF24ABF0FF24ABF0FF25ABF0FF25ACF1FF25ACF1FF25AC - F1FF25ACF1FF25ACF1FF26ACF1FF26ACF1FF26ACF1FF26ACF1FF2AA3E1FF5658 - 5AFF5B5959FF595D60FF497790FF3596C8FF28ABEEFF27ACF1FF27ACF1FF28AD - F1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ACF0FF27ABEFFF26A9EDFF24A8 - EBFF21A4E7FF1FA0E2FF1B9ADBFF1292D2FF599CB8FF6A7575FF515252FF4948 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF454343EC0707 - 075B00000043000000270000000F000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000010000000B00000021413F3FCC494747FF4947 - 47FF494747FF494747FF494747FF494747FF4C4B4BFF5C6161FF839798FF46A3 - CCFF1494D5FF169ADCFF189EE2FF1BA2E7FF1CA5EAFF1DA7EDFF1DA8EEFF1DA8 - EFFF1FA5E9FF2E3B42FF3E3D3DFF4C4A4AFF535252FF565454FF565454FF5654 - 54FF565454FF565454FF555454FF3B7898FF20A9F0FF20AAF0FF20AAF0FF20AA - F0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF22AA - F0FF22AAF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF23ABF0FF23AB - F0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF3A81A5FF5856 - 56FF595858FF595858FF595858FF5A5858FF546169FF427E9DFF2F9CD4FF25AC - F1FF25ACF1FF25ACF1FF26ACF1FF26ACF1FF25ACF1FF25ABF0FF25AAEFFF24A9 - EDFF22A6EAFF1FA3E6FF1C9EE0FF1999DAFF1892D0FF6F99A7FF616767FF4D4C - 4CFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2E2D - 2DB00000004D000000360000001A000000070000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000004000000141F1E1E6D494747FF494747FF4947 - 47FF494747FF494747FF494747FF4A4848FF545656FF758282FF6CADC4FF1292 - D2FF1597DAFF169DE1FF18A1E7FF1AA4EAFF1AA6EDFF1BA7EEFF1BA7EFFF1CA8 - F0FF1CA8F0FF2277A2FF343333FF434242FF4F4D4DFF535151FF545353FF5453 - 53FF545353FF545353FF545353FF515253FF249CD9FF1EA9F0FF1EA9F0FF1EA9 - F0FF1EA9F0FF1EA9F0FF1EA9F0FF1EA9F0FF1FA9F0FF1FA9F0FF1FA9F0FF1FA9 - F0FF1FA9F0FF20A9F0FF20A9F0FF20A9F0FF20AAF0FF20AAF0FF20AAF0FF20AA - F0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF22A9EDFF4D5A61FF5755 - 55FF585656FF585656FF585656FF585656FF585656FF585656FF585757FF4F67 - 73FF3B86ACFF28A3E1FF23ABF0FF23ABF0FF23ABF0FF23AAF0FF23AAEFFF22A9 - EEFF22A7ECFF1FA5E9FF1CA1E5FF1A9CDEFF1696D7FF2A97CBFF768C8FFF585B - 5BFF4A4949FF494747FF494747FF494747FF494747FF494747FF494747FF4846 - 46FA0C0C0C6600000043000000270000000E0000000200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000A05050523454343DF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4E4E4EFF666E6EFF87ABB1FF2097D1FF1395 - D8FF159BDFFF169FE5FF17A3E9FF18A4ECFF19A6EEFF19A6EFFF19A7F0FF1AA7 - F0FF1AA8F0FF1AA6EDFF29414DFF393838FF474646FF504E4EFF525050FF5351 - 51FF535151FF535151FF535151FF535151FF3E6B82FF1BA8F0FF1CA8F0FF1CA8 - F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1DA8F0FF1DA9 - F0FF1DA9F0FF1DA9F0FF1DA9F0FF1DA9F0FF1DA9F0FF1EA9F0FF1EA9F0FF1EA9 - F0FF1EA9F0FF1EA9F0FF1EA9F0FF1EA9F0FF1EA9F0FF2D8DBFFF535151FF5654 - 54FF565454FF565454FF565454FF565454FF575555FF575555FF575555FF5755 - 55FF575555FF565657FF486D81FF358CB8FF23A7EBFF21AAF0FF21AAEFFF21A9 - EFFF20A8EDFF1FA6EBFF1DA3E9FF1A9FE3FF189ADCFF1292D4FF519DBDFF6C77 - 77FF505151FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF353333BF0000004C00000034000000170000000500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000030000001127252578494747FF494747FF494747FF4947 - 47FF494747FF494747FF4B4949FF595D5DFF819494FF48A4CDFF1192D5FF1398 - DCFF149DE3FF16A1E8FF17A3EBFF17A5EEFF17A6EFFF17A7F0FF17A7F0FF17A7 - F0FF18A7F0FF18A7F0FF1C82B7FF2F2E2EFF3F3D3DFF4B4949FF504E4EFF514F - 4FFF525050FF525050FF525050FF525050FF504E4EFF2690C6FF19A7F0FF19A7 - F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1BA8 - F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1CA8 - F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF40667AFF535151FF5452 - 52FF545353FF545353FF545353FF545353FF545353FF555353FF555353FF5553 - 53FF555353FF555353FF555353FF555353FF53575AFF3F728CFF2A8FC2FF1EA9 - EFFF1EA8EEFF1EA7EDFF1DA5EAFF1AA2E6FF189DE1FF1597D9FF1391D0FF7399 - A4FF5E6464FF4C4B4BFF494747FF494747FF494747FF494747FF494747FF4947 - 47FF484646FC0E0E0E6500000040000000230000000B12111101000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000070000001B444242D8494747FF494747FF494747FF4947 - 47FF494747FF494747FF505151FF6D7878FF7CAFBEFF1090D1FF1196DAFF129B - E1FF149FE7FF15A2EAFF15A4EDFF16A5EFFF16A5EFFF16A6F0FF16A6F0FF17A6 - F0FF17A6F0FF17A6F0FF17A6F0FF23495CFF343333FF434141FF4C4A4AFF4F4D - 4DFF504E4EFF504E4EFF504E4EFF504E4EFF504E4EFF435C6AFF18A5EDFF18A7 - F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF19A7F0FF19A7 - F0FF19A7F0FF19A7F0FF19A7F0FF19A7F0FF19A7F0FF19A7F0FF1AA7F0FF1AA8 - F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF209BDAFF4E4C4CFF535151FF5351 - 51FF535151FF535151FF535151FF535151FF535151FF535151FF535252FF5452 - 52FF545252FF545252FF545252FF545252FF535252FF4F4D4DFF434141FF2E4E - 5EFF1CA7EFFF1CA7EEFF1BA6ECFF1AA3E9FF179FE4FF169ADDFF1294D6FF3699 - C8FF748383FF535555FF494848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF2F2E2EB5000000490000002F0000001300000003000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000010000000D1F1E1E64494747FF494747FF494747FF494747FF4947 - 47FF494747FF4B4A4AFF5C6161FF879D9EFF359ECFFF0F92D6FF1098DDFF119D - E4FF13A0E9FF13A2EBFF14A4EDFF14A5EEFF14A5EFFF14A5EFFF15A6EFFF15A6 - EFFF15A6EFFF15A6EFFF15A6EFFF188DC9FF2A2B2CFF3A3838FF474545FF4D4B - 4BFF4F4D4DFF4F4D4DFF4F4D4DFF4F4D4DFF4F4D4DFF4E4C4CFF2A81AEFF16A6 - F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6 - F0FF17A6F0FF17A6F0FF17A7F0FF17A7F0FF17A7F0FF17A7F0FF17A7F0FF18A7 - F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF337496FF504E4EFF514F4FFF5250 - 50FF525050FF525050FF525050FF525050FF525050FF525050FF525050FF5250 - 50FF525050FF525050FF525050FF525050FF504E4EFF494747FF3A3939FF246C - 91FF1AA8F0FF1AA7EFFF1AA6EEFF19A4EBFF17A1E7FF159DE1FF1397DAFF0E90 - D2FF699CAEFF616868FF4C4C4CFF494747FF494747FF494747FF494747FF4947 - 47FF494747FF474545F4070707580000003A0000001D00000008000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000400000015413F3FC3494747FF494747FF494747FF494747FF4947 - 47FF494747FF505151FF6F7A7AFF76AFC2FF0E8FD1FF0F95DAFF0F9AE1FF119E - E7FF12A1EAFF12A3EDFF13A4EEFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5 - EFFF13A5EFFF13A5EFFF13A5EFFF14A5EFFF1E5470FF302E2EFF3F3E3EFF4947 - 47FF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF465258FF189F - E4FF15A6EFFF15A6EFFF15A6EFFF15A6EFFF15A6EFFF15A6EFFF16A6F0FF16A6 - F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF17A6 - F0FF17A6F0FF17A6F0FF17A6F0FF18A3EAFF465158FF4F4D4DFF4F4D4DFF4F4D - 4DFF504E4EFF504E4EFF504E4EFF4F4D4DFF4E4C4CFF4E4C4CFF4E4C4CFF504E - 4EFF514F4FFF514F4FFF514F4FFF514F4FFF4D4B4BFF414040FF323334FF1A9B - DDFF19A7F0FF18A6EFFF18A6EEFF17A5EDFF17A2E9FF159EE5FF1399DFFF1093 - D6FF2F98CAFF758587FF535555FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF2423239900000044000000280000000E000000020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000815141439494747FF494747FF494747FF494747FF494747FF4947 - 47FF4B4949FF5B5F5FFF869D9DFF389FCFFF0D92D6FF0E98DEFF0F9CE4FF10A0 - E8FF10A2ECFF11A3EDFF11A3EEFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF12A4 - EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF1398DBFF26292BFF353434FF4342 - 42FF4B4949FF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4C4A4AFF3073 - 95FF13A5EFFF13A5EFFF13A5EFFF13A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5 - EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF15A6EFFF15A6 - EFFF15A6EFFF15A6EFFF15A6EFFF2684B4FF4B4A4AFF4E4C4CFF4E4C4CFF4F4D - 4DFF4F4D4DFF4F4D4DFF4E4C4CFF4B4A4AFF474545FF444242FF454343FF4948 - 48FF4D4B4BFF4E4C4CFF4F4D4DFF4E4C4CFF484646FF393838FF25536BFF17A6 - F0FF17A6F0FF17A6F0FF17A5EFFF16A4EEFF16A3EBFF14A0E8FF129BE2FF1096 - DAFF0E90D1FF6C9DADFF606767FF4C4B4BFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF413F3FDD0000004C0000003400000017000000050000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00010000000D2F2E2E93494747FF494747FF494747FF494747FF494747FF4947 - 47FF4F4F4FFF6B7676FF7FB1BFFF0D8FD1FF0E94D9FF0E99E1FF0F9DE7FF0FA0 - EAFF10A2EDFF10A3EEFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF11A4 - EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF196187FF2C2B2BFF3B3A - 3AFF464444FF4B4949FF4B4949FF4B4949FF4B4949FF4B4949FF4B4949FF474A - 4CFF1998D9FF12A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF13A5 - EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5 - EFFF13A5EFFF13A5EFFF13A5EFFF3A5D6FFF4C4A4AFF4D4B4BFF4D4B4BFF4D4B - 4BFF4D4B4BFF4D4B4BFF4C4A4AFF454343FF3B3939FF343232FF353434FF3B3A - 3AFF413F3FFF464444FF4A4848FF494747FF403F3FFF313030FF1A81B6FF15A6 - EFFF15A6EFFF15A6EFFF15A6EFFF15A5EEFF14A3ECFF13A1E9FF119DE4FF0F98 - DDFF0E92D6FF379AC8FF738081FF515252FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF1211116A00000040000000230000000B1211 - 1101000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000300000014464444E1494747FF494747FF494747FF494747FF494747FF4A48 - 48FF575A5AFF819393FF46A4CEFF0C91D5FF0D96DDFF0D9BE4FF0F9FE8FF0FA1 - ECFF0FA2EDFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF10A4EFFF10A4 - EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF109DE5FF222F36FF3231 - 31FF403F3FFF484646FF4A4848FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF34667FFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4 - EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF12A4 - EFFF12A4EFFF12A4EFFF1A94D3FF484646FF4C4A4AFF4C4A4AFF4C4A4AFF4C4A - 4AFF4C4A4AFF4C4A4AFF484747FF3E3D3DFF2F2E2EFF252424FF242323FF2928 - 28FF302E2EFF363535FF3D3B3BFF3E3C3CFF363535FF273841FF14A5EFFF14A5 - EFFF14A5EFFF14A5EFFF13A5EFFF13A4EEFF12A3EDFF12A1EAFF109EE6FF0F9A - E0FF0E94D9FF0E8FD0FF7499A3FF5C6161FF4A4949FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF2E2D2DB20000004900000030000000140000 - 0004000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00061C1B1B44494747FF494747FF494747FF494747FF494747FF494747FF4C4B - 4BFF636B6BFF8AADB4FF1692D0FF0D93D8FF0D98E0FF0D9DE6FF0E9FEAFF0EA1 - EDFF0FA2EEFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF156D99FF2827 - 27FF393737FF444242FF494747FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF484646FF1C8DC6FF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4 - EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4 - EFFF10A4EFFF11A4EFFF2C6E90FF494747FF4B4949FF4B4949FF4B4949FF4B49 - 49FF4B4949FF4A4848FF444242FF363434FF224558FF185A7BFF1A252AFF1D1D - 1DFF212020FF252525FF2B2A2AFF2D2B2BFF282828FF1A678EFF12A4EFFF12A4 - EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF11A3EDFF10A1EBFF109FE8FF0E9B - E3FF0E96DCFF0C91D4FF4D9DBFFF6A7474FF4E4E4EFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF474545F4050505550000003C0000001F0000 - 0009000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000A302F2F91494747FF494747FF494747FF494747FF494747FF494747FF5152 - 52FF738080FF69ADC7FF0C90D3FF0D95DBFF0D9AE3FF0E9EE8FF0EA0EBFF0EA2 - EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0FA3EFFF0FA3EFFF0FA0EBFF1E35 - 40FF2F2E2EFF3F3D3DFF474545FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF494747FF3B5767FF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF10A4EFFF11A0E9FF404A50FF494747FF4A4848FF4A4848FF4A4848FF4A48 - 48FF4A4848FF474646FF3F3D3DFF2F2E2EFF167BAFFF10A4EFFF109FE8FF1374 - A4FF17394AFF1B1A1AFF1D1D1DFF1F1E1EFF1E2123FF1299DEFF11A4EFFF11A4 - EFFF11A4EFFF11A4EFFF10A4EFFF10A4EFFF10A3EEFF0FA2EDFF0F9FE9FF0E9C - E6FF0D98DFFF0C93D7FF2195CEFF788C8EFF545656FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF24232399000000460000002B0000 - 0011000000030000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000010000 - 000E454343CE494747FF494747FF494747FF494747FF494747FF4A4848FF585C - 5CFF85999AFF3BA1D0FF0C92D6FF0D97DEFF0D9CE5FF0E9FE9FF0EA1ECFF0EA2 - EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF127A - B0FF262424FF363434FF434141FF484646FF494747FF494747FF494747FF4947 - 47FF494747FF484646FF237FAEFF0EA3EFFF0EA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF2080B2FF474545FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF494747FF454343FF393737FF26333AFF0FA1EBFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF118BC9FF155272FF182025FF154761FF10A4EFFF10A4EFFF10A4 - EFFF10A4EFFF10A4EFFF10A4EFFF0FA3EFFF0FA3EEFF0FA2EDFF0EA0EBFF0E9E - E7FF0D99E1FF0D95DAFF0C8FD1FF709DABFF5E6363FF4B4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF424141E20000004E000000370000 - 001B000000070000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000030E0D - 0D21494747FF494747FF494747FF494747FF494747FF494747FF4C4A4AFF636A - 6AFF8DAFB4FF1592D0FF0D94D8FF0D99E0FF0D9DE6FF0EA0EAFF0EA2EDFF0EA2 - EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF1B4053FF2D2C2CFF3C3A3AFF454343FF484646FF494747FF494747FF4947 - 47FF494747FF484646FF404D54FF109EE6FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0FA3EFFF345D72FF494747FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF484646FF413F3FFF323030FF1A5D7FFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0F9EE8FF0F96DAFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0EA2EEFF0EA1ECFF0E9F - E8FF0D9BE4FF0D96DCFF0C91D4FF4E9DBFFF6A7474FF4D4D4DFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF1A19197E000000430000 - 00270000000E1211110200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000042120 - 205A494747FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF6F7B - 7BFF72B0C4FF0C8FD2FF0D95DBFF0D9AE3FF0E9EE8FF0EA0EBFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF1089C7FF242323FF343333FF413F3FFF474545FF494747FF494747FF4947 - 47FF494747FF494747FF484646FF297298FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF1496D8FF444242FF484646FF494747FF494747FF494747FF494747FF4947 - 47FF454343FF3B3939FF2A2828FF118ECEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1EDFF0E9F - E9FF0D9CE6FF0D98DFFF0C92D7FF2897CDFF778788FF525353FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF383636C70000004C0000 - 0033000000170000000500000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000072F2E - 2E8E494747FF494747FF494747FF494747FF494747FF494747FF545656FF7D8E - 8EFF4FA8CEFF0C91D5FF0D97DDFF0D9BE4FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF19506CFF2B2A2AFF3B3939FF454343FF484646FF494747FF4947 - 47FF494747FF494747FF494747FF444749FF1398DCFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF286F94FF474545FF494747FF494747FF494747FF494747FF494747FF4846 - 46FF424040FF343333FF1F3F50FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0EA0 - EBFF0D9DE7FF0D99E1FF0D94D9FF0F8FD0FF78989FFF595C5CFF494848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF484646FC0E0E0E650000 - 003F000000220000000B12111101000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000094442 - 42BA494747FF494747FF494747FF494747FF494747FF4A4848FF5B5F5FFF8BA1 - A2FF2D9CD0FF0C92D7FF0D98DFFF0D9CE6FF0E9FEAFF0EA1EDFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0F94D7FF222628FF323131FF403E3EFF474545FF494747FF4947 - 47FF494747FF494747FF494747FF484646FF316580FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - ECFF3D4C54FF484646FF494747FF494747FF494747FF494747FF494747FF4644 - 44FF3D3C3CFF2E2D2DFF16709EFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0 - EBFF0E9EE8FF0D9AE3FF0D95DBFF0C90D3FF679EB2FF616767FF4B4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF2D2B2BAF0000 - 00490000002F0000001300000004000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000000000B4745 - 45E2494747FF494747FF494747FF494747FF494747FF4B4A4AFF626969FF8FAF - B3FF1491D0FF0D94D9FF0D99E0FF0D9DE7FF0EA0EBFF0EA2EDFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF165E83FF292828FF393838FF444242FF484646FF4947 - 47FF494747FF494747FF494747FF494747FF474545FF198DC9FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1C86 - BDFF454343FF494747FF494747FF494747FF494747FF494747FF484646FF4442 - 42FF383737FF262C30FF0E9CE5FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 - ECFF0E9FE9FF0D9BE4FF0D96DCFF0C91D5FF4E9DBFFF697272FF4C4C4CFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF464444F20505 - 05550000003B0000001E00000009000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F010E0D0D184947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4C4CFF697272FF85B3 - BEFF0C8ED1FF0D95DAFF0D9AE2FF0E9EE7FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0E9AE1FF202B31FF302F2FFF3F3D3DFF474545FF4947 - 47FF494747FF494747FF494747FF494747FF484646FF395869FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF3160 - 79FF474545FF494747FF494747FF494747FF494747FF494747FF474545FF403F - 3FFF323131FF1B536FFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 - EDFF0E9FE9FF0D9CE5FF0D97DEFF0C92D6FF3B9BC8FF717E7EFF4F4F4FFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2322 - 2297000000460000002A00000010000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F011F1E1E374947 - 47FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF707D7DFF71B0 - C6FF0C90D3FF0D95DBFF0D9AE3FF0E9EE8FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF146A96FF282626FF383636FF434242FF4846 - 46FF494747FF494747FF494747FF494747FF494747FF474545FF2180B0FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF119AE1FF4245 - 47FF484646FF494747FF494747FF494747FF494747FF494747FF464444FF3C3A - 3AFF2B2A2AFF1284BEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EDFF0E9FEAFF0D9DE6FF0D98DFFF0D93D7FF2898CEFF78898AFF525353FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF413F - 3FDD0000004E000000370000001A000000070000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01222121514947 - 47FF494747FF494747FF494747FF494747FF494747FF515252FF788686FF5FAD - CCFF0C90D4FF0D97DDFF0D9BE4FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA0EBFF1E323DFF2F2E2EFF3E3C3CFF4644 - 44FF494747FF494747FF494747FF494747FF494747FF484646FF404E56FF0F9F - E9FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF2378A4FF4644 - 44FF494747FF494747FF494747FF494747FF494747FF484646FF434141FF3634 - 34FF223844FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EDFF0EA0EBFF0D9DE7FF0D99E0FF0D94D9FF1792CFFF7B9295FF555858FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1817177800000043000000260000000D1211110100000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01232222674947 - 47FF494747FF494747FF494747FF494747FF494747FF545656FF7E8F8FFF4FA9 - CFFF0C91D6FF0D97DEFF0D9CE4FF0E9FE9FF0EA1EDFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1278ADFF262525FF363434FF4240 - 40FF484646FF494747FF494747FF494747FF494747FF494747FF484646FF2874 - 9BFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF375463FF4846 - 46FF494747FF494747FF494747FF494747FF494747FF474545FF3E3D3DFF2F2E - 2EFF17668EFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA0EBFF0D9EE7FF0D9AE1FF0D94DAFF0E8FD0FF7A99A0FF585C5CFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF373636C40000004C00000033000000170000000500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F012423237E4947 - 47FF494747FF494747FF494747FF494747FF494747FF565959FF849696FF43A5 - D1FF0C92D6FF0D97DEFF0D9CE5FF0E9FEAFF0EA1EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1B4053FF2D2C2CFF3C3B - 3BFF464444FF484646FF494747FF494747FF494747FF494747FF494747FF4349 - 4CFF1399DEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1592D2FF444242FF4846 - 46FF494747FF494747FF494747FF494747FF484646FF444343FF393838FF2829 - 2AFF0F96DBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA0EBFF0E9EE8FF0D9AE2FF0D95DAFF0C8ED1FF769DA8FF5C6060FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF484646FC0B0B0B620000003F000000220000000B12111101000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323854947 - 47FF494747FF494747FF494747FF494747FF494747FF585B5BFF889C9CFF38A0 - D0FF0C92D7FF0D98DFFF0D9CE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1187C3FF242323FF3433 - 33FF413F3FFF484646FF494747FF494747FF494747FF494747FF494747FF4846 - 46FF306783FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF276E93FF464444FF4947 - 47FF494747FF494747FF494747FF494747FF484646FF413F3FFF333232FF1E49 - 5FFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE2FF0D95DBFF0C8FD2FF6F9EADFF5E6363FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF2C2B2BAC000000480000002E0000001300000003000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323854947 - 47FF494747FF494747FF494747FF494747FF494747FF5A5D5DFF8BA0A0FF329E - D1FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF194E69FF2B2A - 2AFF3B3939FF454343FF484646FF494747FF494747FF494747FF494747FF4947 - 47FF474545FF188FCBFF0EA3EFFF0EA3EFFF0EA3EFFF3A4D58FF484646FF4947 - 47FF494747FF494747FF494747FF494747FF464444FF3D3B3BFF2D2B2BFF137A - AEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6B9FB1FF5F6565FF4A49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF464444EF050505550000003A0000001D00000008000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323844947 - 47FF494747FF494747FF494747FF494747FF4A4848FF5A5E5EFF8CA2A2FF309D - D0FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0F92D4FF2226 - 28FF323131FF403F3FFF474545FF494747FF494747FF494747FF494747FF4947 - 47FF484646FF385A6BFF0EA3EFFF0EA3EFFF1594D6FF444242FF484646FF4947 - 47FF494747FF494747FF494747FF484646FF444242FF373535FF243138FF0EA1 - EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6B9FB2FF606767FF4A49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF1F1E1E91000000450000002A00000010000000020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323844947 - 47FF494747FF494747FF494747FF494747FF4A4848FF5A5E5EFF8CA1A1FF319D - D0FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF165C - 7FFF2A2828FF393838FF444242FF484646FF494747FF494747FF494747FF4947 - 47FF494747FF474545FF2182B3FF0EA3EFFF2677A0FF464444FF494747FF4947 - 47FF494747FF494747FF494747FF474545FF403E3EFF312F2FFF195C7EFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6B9FB2FF606767FF4A49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF403E3EDA0000004E000000360000001A000000070000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323844947 - 47FF494747FF494747FF494747FF494747FF494747FF5A5D5DFF8B9F9FFF349F - D1FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0E9A - E1FF20292DFF312F2FFF3F3D3DFF474545FF494747FF494747FF494747FF4947 - 47FF494747FF484646FF40535DFF0FA0E9FF395D6FFF484646FF494747FF4947 - 47FF494747FF494747FF494747FF454343FF3B3939FF2A2828FF108ECEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6E9FB0FF5F6565FF4A49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF1616167600000042000000260000000D1211 - 1101000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323834947 - 47FF494747FF494747FF494747FF494747FF494747FF585B5BFF879B9BFF3EA3 - D1FF0C92D6FF0D98DFFF0D9CE5FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF156893FF282626FF383636FF434242FF484646FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF2C7398FF484849FF494747FF494747FF4947 - 47FF494747FF494747FF484646FF424040FF343333FF1F3F50FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE2FF0D95DBFF0C8ED1FF739FACFF5D6363FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF353333C20000004B00000032000000160000 - 0005000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000002423237B4947 - 47FF494747FF494747FF494747FF494747FF494747FF565858FF839595FF49A7 - D0FF0C92D6FF0D97DEFF0D9CE5FF0E9FE9FF0EA1EDFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA0EBFF1E323DFF2F2E2EFF3E3C3CFF464444FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF464444FF3D3C3CFF2E2D2DFF16709EFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA0EBFF0E9EE7FF0D9AE1FF0D95DAFF0D8ED1FF7A9EA6FF5B6060FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF484646FA0B0B0B620000003E000000210000 - 000A121111010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000242323644947 - 47FF494747FF494747FF494747FF494747FF494747FF535555FF7D8E8EFF57AC - CFFF0C91D5FF0D97DDFF0D9CE4FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF1577AAFF2B2A2AFF3D3C3CFF4C4A4AFF525050FF545252FF5553 - 53FF565454FF565454FF575555FF565454FF555454FF555353FF545252FF5250 - 50FF514F4FFF4D4C4CFF474545FF393737FF262C30FF0E9CE5FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EDFF0EA0EBFF0D9EE7FF0D99E1FF0D94D9FF1291D0FF7D999EFF585C5CFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF2A2929A7000000480000002E0000 - 0012000000030000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000002322224C4947 - 47FF494747FF494747FF494747FF494747FF494747FF515252FF778585FF69B0 - CBFF0C90D4FF0D96DCFF0D9BE3FF0E9EE8FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0FA3EFFF15A5EFFF1CA8 - F0FF20AAF0FF23ABF0FF304F5FFF403F3FFF4E4C4CFF575555FF595757FF5957 - 57FF595757FF595757FF595757FF595757FF595757FF595757FF595757FF5957 - 57FF595757FF585656FF525050FF434242FF2B5E79FF18A6EFFF12A4EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EDFF0EA0EAFF0D9DE6FF0D98E0FF0D93D8FF1F95CFFF7D9293FF555757FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF464444EF030303520000003A0000 - 001D000000080000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000222121334947 - 47FF494747FF494747FF494747FF494747FF494747FF4F4E4EFF6F7B7BFF7DB5 - C5FF0C8FD2FF0D95DBFF0D9AE2FF0E9EE8FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF15A5EFFF1FA9F0FF26ACF0FF28ACF1FF28AC - F1FF28ACF1FF28ACF1FF2A92C7FF3C3B3BFF4A4949FF565454FF5C5A5AFF5D5B - 5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B - 5BFF5D5B5BFF5A5858FF514F4FFF424141FF2B91C5FF28ACF1FF28ACF1FF23AB - F0FF1AA7EFFF11A4EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0E9FEAFF0D9CE6FF0D98DFFF0C92D7FF339BCDFF778787FF515353FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF1E1D1D8C000000450000 - 00290000000F0000000200000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000001010100F4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4B4BFF677171FF8EB6 - BEFF0E8FD1FF0D94DAFF0D99E1FF0D9EE7FF0EA0EBFF0EA2EDFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0FA3EFFF1AA7EFFF27ACF0FF2CAEF1FF2CAEF1FF2CAEF1FF2CAEF1FF2CAE - F1FF2CAEF1FF2CAEF1FF2CAEF1FF366279FF464545FF545252FF5C5B5BFF5F5D - 5DFF605E5EFF605E5EFF605E5EFF605E5EFF605E5EFF605E5EFF605E5EFF605E - 5EFF5F5D5DFF5A5959FF4F4E4EFF3E515BFF2CAEF1FF2CAEF1FF2CAEF1FF2CAE - F1FF2CAEF1FF2AAEF1FF21AAF0FF14A5EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 - ECFF0E9FE9FF0D9CE5FF0D97DDFF0C91D6FF459FC6FF707C7CFF4F4F4FFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF3F3D3DD70000004D0000 - 0036000000190000000600000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000014846 - 46E8494747FF494747FF494747FF494747FF494747FF4B4949FF606767FF93AF - B1FF1F95D0FF0D93D8FF0D98E0FF0D9DE6FF0EA0EAFF0EA2EDFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF19A7 - EFFF2AADF0FF30B0F1FF30B0F1FF30B0F1FF30B0F1FF30B0F1FF30B0F1FF30B0 - F1FF30B0F1FF30B0F1FF30B0F1FF319FD7FF414547FF4F4E4EFF5B5A5AFF615F - 5FFF626161FF626161FF626161FF626161FF626161FF626161FF626161FF6261 - 61FF615F5FFF5A5858FF4D4B4BFF387B9EFF30B0F1FF30B0F1FF30B0F1FF30B0 - F1FF30B0F1FF30B0F1FF30B0F1FF2EAFF1FF23AAF0FF12A4EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 - ECFF0E9EE8FF0D9BE3FF0D96DCFF0C90D4FF5DA1BCFF677070FF4C4B4BFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF141414720000 - 0041000000250000000D12111101000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000004745 - 45B9494747FF494747FF494747FF494747FF494747FF494848FF595D5DFF899E - 9EFF3EA3D0FF0C92D6FF0D97DEFF0D9CE5FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF13A5EFFF29ADF1FF35B1 - F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1 - F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF3C7491FF4C4B4BFF595858FF6261 - 61FF666464FF666464FF666464FF666464FF666464FF666464FF666464FF6664 - 64FF626161FF595858FF4B4C4CFF36A7E1FF35B1F2FF35B1F2FF35B1F2FF35B1 - F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF31B0F1FF1DA9F0FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0EA0 - EBFF0D9EE7FF0D9AE2FF0D95DAFF0C8FD1FF75A1AEFF5F6565FF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF343232BD0000 - 004B000000320000001600000005000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000003534 - 348D494747FF494747FF494747FF494747FF494747FF494747FF535555FF7B8B - 8BFF63B0CDFF0C90D4FF0D96DCFF0D9BE3FF0E9EE8FF0EA1ECFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1BA8F0FF35B2F1FF39B3F2FF39B3 - F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3 - F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39ACE7FF484F53FF565555FF6261 - 61FF686666FF696868FF696868FF696868FF696868FF696868FF696868FF6967 - 67FF636161FF585656FF46697BFF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3 - F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF29AD - F1FF11A4EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0 - EAFF0D9DE6FF0D98E0FF0D93D8FF1A93CFFF7F9799FF585B5BFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF484646FA0A0A - 0A5F0000003D000000210000000A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000002322 - 2252494747FF494747FF494747FF494747FF494747FF494747FF4E4E4EFF6D78 - 78FF88B8C3FF0C8FD1FF0D95DAFF0D99E1FF0D9EE7FF0EA0EBFF0EA2EDFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF22ABF0FF3CB4F2FF3DB5F2FF3DB5F2FF3DB5 - F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5 - F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF4485A6FF565555FF6462 - 62FF6B6969FF6D6B6BFF6D6B6BFF6D6B6BFF6D6B6BFF6D6B6BFF6D6B6BFF6B69 - 69FF636262FF565555FF4294BEFF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5 - F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5 - F2FF33B1F1FF13A5EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9F - E9FF0D9CE5FF0D97DEFF0C92D6FF3D9ECAFF768484FF515252FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2827 - 27A4000000470000002D00000012000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001111 - 1111494747FF494747FF494747FF494747FF494747FF494747FF4B4A4AFF6167 - 67FF92AEB0FF2799D0FF0C93D7FF0D98DFFF0D9CE6FF0E9FEAFF0EA1EDFF0EA2 - EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF25ACF0FF41B6F2FF42B7F2FF42B7F2FF42B7F2FF42B7 - F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7 - F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF43B3EDFF58676FFF6866 - 66FF6E6D6DFF716F6FFF716F6FFF716F6FFF716F6FFF716F6FFF706E6EFF6C6B - 6BFF636161FF545E64FF42B5F0FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7 - F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7 - F2FF42B7F2FF39B3F2FF13A5EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0EA0EBFF0E9E - E8FF0D9AE3FF0D95DBFF0C90D3FF65A4BCFF687070FF4D4C4CFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4543 - 43EC03030352000000390000001C000000080000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000484646D0494747FF494747FF494747FF494747FF494747FF494848FF575A - 5AFF829595FF54ABD0FF0C91D4FF0D96DCFF0D9BE4FF0E9FE8FF0EA1ECFF0EA2 - EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF22AAF0FF45B8F2FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 - F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 - F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF519BC1FF6D6C - 6CFF737272FF747373FF747373FF747373FF747373FF747373FF737171FF6D6C - 6CFF616161FF50839DFF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 - F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 - F3FF47B8F3FF47B8F3FF39B3F1FF11A4EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EAFF0D9D - E6FF0D99E0FF0D94D9FF1291D0FF7E9EA5FF5C6161FF4A4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1D1C1C8900000044000000290000000F0000000200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000036343488494747FF494747FF494747FF494747FF494747FF494747FF5050 - 50FF707C7CFF82B7C5FF0C8FD1FF0D95DAFF0D99E1FF0D9DE7FF0EA0EAFF0EA2 - EDFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF17A6EFFF47B8F2FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA - F3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA - F3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF50B2E4FF7472 - 72FF777676FF787676FF787676FF787676FF787676FF787676FF757474FF6E6C - 6CFF616060FF4EA9D8FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA - F3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA - F3FF4CBAF3FF4CBAF3FF4CBAF3FF31B0F1FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9FE9FF0D9C - E5FF0D97DEFF0C92D6FF379DCCFF798889FF535555FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF3D3C3CD20000004D00000035000000190000000600000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002322223D494747FF494747FF494747FF494747FF494747FF494747FF4C4A - 4AFF616767FF92ADAEFF2D9CD0FF0C92D7FF0D97DEFF0D9CE5FF0E9FE9FF0EA1 - ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF3DB5F2FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC - F3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC - F3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF619CBBFF7978 - 78FF7C7B7BFF7C7B7BFF7C7B7BFF7C7B7BFF7C7B7BFF7B7A7AFF777676FF6D6C - 6CFF5E7581FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC - F3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC - F3FF51BCF3FF51BCF3FF51BCF3FF50BCF3FF1DA9F0FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EBFF0D9EE7FF0D9A - E2FF0D95DBFF0C8FD2FF6AA5BAFF677171FF4D4D4DFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF1413137000000041000000240000000C00000001000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000484646E3494747FF494747FF494747FF494747FF494747FF4948 - 48FF555858FF7D8D8DFF68B2CDFF0C90D3FF0D95DBFF0D9AE2FF0E9EE8FF0EA0 - EBFF0EA2EDFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF20AA - F0FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE - F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE - F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF728995FF7F7D - 7DFF807E7EFF807E7EFF807E7EFF807E7EFF807E7EFF7E7D7DFF787777FF6D6C - 6CFF5C9AB9FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE - F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE - F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF45B7F2FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9FE9FF0D9CE6FF0D98 - DFFF0C93D7FF1F95CFFF80999CFF595D5DFF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF333131BA0000004A000000310000001500000004000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000003635358C494747FF494747FF494747FF494747FF494747FF4947 - 47FF4E4E4EFF687171FF93B6BBFF1B94D0FF0C93D8FF0D98DFFF0D9CE6FF0E9F - E9FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF44B8 - F2FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 - F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 - F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5FB8E7FF807F7FFF8382 - 82FF848282FF848282FF848282FF848282FF838282FF807F7FFF787878FF6C6F - 71FF5CBCEDFF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 - F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 - F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5BC0F4FF1EA9F0FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EBFF0E9EE8FF0D9AE3FF0D96 - DCFF0C90D3FF57A4C3FF707C7CFF505151FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF484646FA0909095C0000003D000000200000000A000000000000 - 0000000000000000000000000001000000000000000000000000000000000000 - 00000000000023222228494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4848FF595C5CFF839696FF5BAECFFF0C90D4FF0D96DCFF0D9AE3FF0E9E - E8FF0EA0EBFF0EA2EDFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF14A5EFFF5DC1 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF6FA8C5FF868484FF8887 - 87FF888787FF888787FF888787FF888787FF878686FF828181FF797878FF6A8E - A1FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF3AB3F2FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9FE9FF0D9CE6FF0D98DFFF0C93 - D8FF1893D0FF809FA6FF5E6363FF4B4A4AFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF272626A1000000470000002C00000012000000030000 - 0000000000000000000000000002000000000000000000000000000000000000 - 00000000000000000000484646C0494747FF494747FF494747FF494747FF4947 - 47FF494747FF4F4F4FFF6B7676FF90B8BEFF1692D0FF0C93D8FF0D98DFFF0D9C - E5FF0E9FE9FF0EA1ECFF0EA2EEFF0EA2EEFF0EA3EFFF0EA3EFFF25ACF0FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF7F98A5FF8B8A8AFF8C8A - 8AFF8C8A8AFF8C8A8AFF8C8A8AFF8C8A8AFF8A8888FF838282FF797878FF69AF - D3FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF52BCF3FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EBFF0D9EE7FF0D9AE2FF0D96DBFF0C90 - D3FF50A2C5FF738080FF525353FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF444242E70000004F000000390000001C000000070000 - 0000000000000000000000000003000000000000000000000000000000000000 - 0000000000000000000024232350494747FF494747FF494747FF494747FF4947 - 47FF494747FF4B4949FF595D5DFF849797FF60B0CFFF0C90D3FF0D95DBFF0D9A - E2FF0D9DE7FF0EA0EAFF0EA1EDFF0EA2EEFF0EA3EFFF0EA3EFFF34B1F1FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6EC2EDFF8E8F8FFF8F8E8EFF908F - 8FFF908F8FFF908F8FFF908F8FFF8F8E8EFF8C8B8BFF848383FF78848BFF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF63C3F4FF0EA3EFFF0EA3 - EFFF0EA2EEFF0EA2EDFF0EA1ECFF0E9FE9FF0D9CE5FF0D98DFFF0C93D7FF1A94 - CFFF82A0A5FF5F6464FF4C4B4BFF494747FF494747FF494747FF4A4848FF4B49 - 49FF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A - 4AFF4B4A4AFF4B4A4AFF4B4A4AFF4A4949FF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF1C1B1B8600000044000000280000000E0000 - 0002000000000000000000000002000000000000000000000000000000000000 - 0000000000000000000011101004484646DB494747FF494747FF494747FF4947 - 47FF494747FF494747FF4F4F4FFF697272FF92B5B9FF2297D0FF0C92D6FF0D97 - DEFF0D9BE4FF0E9FE8FF0EA0EBFF0EA2EDFF0EA2EEFF0EA3EFFF3EB5F2FF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF78B7D7FF7DB3CFFF7EB5D1FF7EB5 - D1FF7EB5D1FF7EB5D1FF7EB5D1FF7EB5D1FF85AABDFF949393FF949393FF9493 - 93FF949393FF949393FF949393FF939292FF8E8D8DFF858484FF77A5BDFF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF70C9F5FF0EA3EFFF0EA3 - EFFF0EA2EEFF0EA1EDFF0E9FEAFF0D9DE7FF0D99E1FF0D95DAFF0C8FD2FF5FA6 - C2FF717C7CFF515252FF494747FF494747FF4A4848FF4E4D4DFF545656FF5A5D - 5DFF5C6161FF5C6161FF5C6161FF5C6161FF5C6161FF5C6161FF5C6161FF5C61 - 61FF5C6161FF5C6161FF5B6060FF585C5CFF525353FF4C4B4BFF494747FF4947 - 47FF494747FF494747FF494747FF3D3B3BCF0000004D00000035000000180000 - 0005000000000000000000000002000000000000000000000000000000000000 - 000000000000000000000000000047454560494747FF494747FF494747FF4947 - 47FF494747FF494747FF4A4848FF575A5AFF7D8D8DFF75B6CCFF0C8FD1FF0D94 - D9FF0D99E0FF0D9CE6FF0E9FE9FF0EA1ECFF0EA2EDFF0EA2EEFF3EB5F2FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF889CA7FF949393FF989797FF9997 - 97FF999797FF999797FF999797FF999797FF999797FF999797FF999797FF9997 - 97FF999797FF999797FF989797FF969595FF908F8FFF868787FF78C3E9FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF73C9F5FF0EA3EFFF0EA2 - EEFF0EA1EDFF0EA0EBFF0E9EE8FF0D9BE3FF0D96DDFF0C91D6FF2C9ACDFF8098 - 9AFF5B6060FF4B4A4AFF494747FF494747FF4C4B4BFF50626AFF6699AFFF75A4 - B8FF79A8BBFF79A9BCFF79A9BCFF79A9BCFF79A9BCFF79A9BCFF79A9BCFF79A9 - BCFF79A9BCFF79A9BCFF78A7BAFF759EAFFF6A6F6FFF515252FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF1312126D00000040000000240000 - 000C000000010000000000000002000000000000000000000000000000000000 - 000000000000000000000000000048464604494747DB494747FF494747FF4947 - 47FF494747FF494747FF494747FF4D4C4CFF626969FF90A8A9FF46A6D0FF0C90 - D4FF0D96DBFF0D9AE2FF0D9EE7FF0EA0EAFF0EA1EDFF0EA2EEFF34B1F1FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF8DA0AAFF999898FF9C9B9BFF9D9C - 9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C - 9CFF9D9C9CFF9D9C9CFF9C9B9BFF999898FF919090FF859DA9FF7DCDF6FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF6BC7F5FF0EA2EEFF0EA2 - EDFF0EA1ECFF0E9FE9FF0D9CE5FF0D98DFFF0C93D8FF1391D1FF79A8B5FF6871 - 71FF4F4F4FFF494747FF494747FF494747FF4D4D4DFF537684FF70CCF6FF80D1 - F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1 - F7FF80D1F7FF80D1F7FF80D1F7FF83CAEBFF7D8383FF565858FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF302E2EB70000004A000000300000 - 0014000000040000000000000002000000000000000000000000000000000000 - 00000000000000000000000000000000000048464660494747FF494747FF4947 - 47FF494747FF494747FF494747FF4A4848FF525353FF6F7B7BFF90B8BFFF1C94 - CFFF0C92D7FF0D97DDFF0D9BE3FF0E9EE8FF0EA0EBFF0EA1EDFF22AAEFFF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF92A4AEFF9D9C9CFFA1A0A0FFA1A0 - A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0 - A0FFA1A0A0FFA1A0A0FFA09F9FFF9B9A9AFF929191FF86B9D3FF82CFF7FF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF5DC0F4FF0EA2EDFF0EA1 - ECFF0E9FE9FF0D9DE6FF0D99E1FF0D95DAFF0C8FD3FF54A4C6FF778686FF5558 - 58FF4A4848FF494747FF494747FF494747FF4D4D4DFF557785FF73CDF6FF80D1 - F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1 - F7FF80D1F7FF80D1F7FF80D1F7FF82C9EBFF7B8181FF555757FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF474545F70909095B0000003C0000 - 001F000000090000000000000001000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000484646CB494747FF4947 - 47FF494747FF494747FF494747FF494747FF4B4A4AFF595C5CFF7E8F8FFF7AB8 - CBFF0E8FD1FF0D94D8FF0D98DFFF0D9CE5FF0E9FE8FF0EA0EBFF0FA2EDFF74C9 - F5FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1 - F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF96A8B1FFA1A0A0FFA4A3A3FFA5A4 - A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4 - A4FFA5A4A4FFA4A3A3FFA2A1A1FF9C9B9BFF93989BFF88D0F5FF88D1F7FF88D1 - F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1 - F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1 - F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF38B2F0FF0EA1ECFF0E9F - EAFF0D9DE7FF0D9AE2FF0D96DBFF0C91D5FF339BCDFF829A9CFF5D6262FF4C4B - 4BFF494747FF494747FF494747FF494747FF4C4B4BFF566469FF65BEE6FF80D1 - F7FF80D1F7FF80D1F7FF8EB8CAFF8AA7ACFF7C969CFF738B91FF71888EFF7188 - 8EFF71888EFF71888EFF70878DFF6B7E84FF5F6363FF4F5050FF494848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF2423239C000000460000 - 002B000000100000000300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000083A2A238494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4D4D4DFF606767FF8BA1 - A1FF5CAECFFF0C8FD2FF0D94D9FF0D99E0FF0D9CE5FF0E9FE9FF0EA0EBFF4BB9 - F1FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3 - F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF9BACB5FFA5A4A4FFA8A7A7FFA8A7 - A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7 - A7FFA8A7A7FFA8A7A7FFA4A3A3FF9D9D9DFF92B2C2FF8DD3F7FF8DD3F7FF8DD3 - F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3 - F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3 - F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF82CFF6FF16A4EDFF0EA0EAFF0D9E - E7FF0D9BE3FF0D97DDFF0C92D6FF1E95CFFF81A6ADFF666E6EFF4F4F4FFF4947 - 47FF494747FF494747FF494747FF494747FF4A4848FF525353FF5D7B86FF71CB - F4FF80D1F7FF80D1F7FF81CEF2FF91A7AEFF717E7EFF5E6464FF565959FF5557 - 57FF555757FF555757FF545757FF525454FF4E4F4FFF4B4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF434141E50000004E0000 - 0036000000190000000600000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000004947479B4947 - 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF505151FF6770 - 70FF92ADAFFF44A5D0FF0C90D4FF0D95DAFF0D99E1FF0D9CE6FF0E9FE9FF19A5 - ECFF86D0F6FF92D5F7FF92D5F7FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5 - F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF9FAEB7FFA7A6A6FFA9A8A8FFA9A8 - A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8 - A8FFA9A8A8FFA8A7A7FFA4A4A4FF9F9E9EFF94CBE7FF92D5F8FF92D5F8FF92D5 - F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5 - F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5 - F8FF92D5F8FF92D5F8FF92D5F7FF92D5F7FF50BBF1FF0EA0EAFF0D9EE7FF0D9B - E3FF0D97DEFF0C92D7FF1391D0FF79AAB9FF6E7979FF535454FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4A4AFF565959FF5E91 - A5FF79CFF6FF80D1F7FF80D1F7FF84CBEBFF879496FF616767FF505151FF4A49 - 49FF4A4848FF4A4848FF4A4848FF494848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF1C1B1B820000 - 003F000000220000000A00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000A0D0D0104947 - 47E3494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF5354 - 54FF6E7979FF93B5B9FF319ED0FF0C91D4FF0D95DBFF0D99E1FF0D9CE6FF0E9F - E9FF47B7EFFF98D7F7FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7 - F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FFA0B0B8FFA5A5A5FFA6A6A6FFA6A6 - A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6 - A6FFA6A6A6FFA6A5A5FFA3A3A3FF9EACB3FF98D7F8FF98D7F8FF98D7F8FF98D7 - F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7 - F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7 - F8FF98D7F8FF98D7F8FF98D7F7FF83CFF5FF17A3EAFF0D9EE7FF0D9BE3FF0D97 - DEFF0C93D8FF0E90D1FF6BAAC1FF758383FF565858FF4B4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4D4C4CFF5A5E - 5EFF5FA5C2FF7ED0F7FF80D1F7FF80D1F7FF89C2DCFF7C8686FF5B6060FF4E4D - 4DFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF383737C70000 - 00470000002B0000001000000002000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000006674 - 744C494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B49 - 49FF555858FF738080FF91B8BEFF2899CFFF0C91D5FF0D95DBFF0D99E1FF0D9C - E5FF11A0E9FF6FC6F3FF9ED9F7FF9ED9F8FF9ED9F8FF9EDAF8FF9EDAF8FF9EDA - F8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FFA3ABAFFFA4A4A4FFA5A4A4FFA5A4 - A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4 - A4FFA5A4A4FFA4A4A4FFA3A3A3FFA0C3D5FF9EDAF8FF9EDAF8FF9EDAF8FF9EDA - F8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDA - F8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9ED9 - F8FF9ED9F8FF9ED9F8FF97D6F6FF32AEECFF0D9EE7FF0D9BE3FF0D97DEFF0C93 - D8FF0D8FD1FF61A8C4FF7A8A8AFF595D5DFF4C4B4BFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4F4E - 4EFF5D6668FF65B9DCFF80D1F7FF80D1F7FF80D1F7FF8DB7C9FF737D7DFF575B - 5BFF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF484646F90707 - 0755000000330000001600000004000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000066757597494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4C4B4BFF575B5BFF768484FF93BAC0FF2899CFFF0C91D4FF0D95DAFF0D99 - E0FF0D9CE5FF1BA3E9FF86CFF4FFA3DBF8FFA3DBF8FFA3DBF8FFA3DCF9FFA3DC - F9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA6ADB1FFA7A7A7FFA7A7A7FFA7A7 - A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7 - A7FFA7A7A7FFA7A7A7FFA7A8A9FFA3D9F5FFA3DCF9FFA3DCF9FFA3DCF9FFA3DC - F9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DC - F9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DB - F8FFA3DBF8FFA1DAF7FF4BB7EEFF0D9DE6FF0D9AE2FF0D97DDFF0C93D8FF0E8F - D1FF61A9C5FF7D8D8EFF5B6060FF4C4B4BFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4A48 - 48FF515252FF5E7379FF6DC5ECFF80D1F7FF80D1F7FF81D0F5FF8EA9B3FF6A74 - 74FF545656FF4B4A4AFF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF1E1D - 1D860000003A0000001B00000006000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000A0D1D108484646CF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4C4B4BFF585B5BFF768484FF92B8BEFF329ED0FF0C90D4FF0D94 - D9FF0D98DFFF0D9BE3FF1EA4E9FF8DD1F4FFA9DDF8FFA9DDF8FFA9DDF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DDF9FFA9DDF9FFA9DD - F8FFA5DBF7FF54BAEFFF0D9CE6FF0D99E1FF0D96DCFF0C92D7FF0F8FD0FF67AB - C4FF7C8D8EFF5C6161FF4D4C4CFF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4B4A4AFF545656FF5E8492FF75CDF5FF81D1F7FF81D1F7FF83CDF0FF8B9C - A0FF646B6BFF515252FF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF3635 - 35BD0000003E0000001F00000008000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000A0D1D124494747EF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4C4B4BFF575B5BFF738080FF93B5B9FF44A5D0FF0C8F - D2FF0D94D8FF0D97DDFF0D9AE2FF1CA2E7FF81CCF3FFAEDFF8FFAEDFF8FFAEDF - F9FFAEDFF9FFAEE0F9FFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 - FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 - FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 - FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 - FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0F9FFAEDFF9FFAEDFF9FFAEDFF8FFA4DB - F7FF4AB6EDFF0D9BE4FF0D99E0FF0D95DBFF0C91D5FF1993D0FF73ADC0FF7989 - 89FF5B5F5FFF4D4C4CFF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4C4B4BFF575B5BFF5F99AFFF7CD0F6FF81D1F7FF81D1F7FF87C8 - E6FF838F91FF5F6565FF4F4F4FFF4A4848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4543 - 43E900000041000000220000000A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000066757544494747FB494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4C4B4BFF555858FF6E7979FF92ADAFFF5CAE - CFFF0E8FD1FF0C92D7FF0D96DBFF0D99E0FF159EE5FF65C1F0FFAEDFF7FFB3E1 - F9FFB3E1F9FFB3E2F9FFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 - FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 - FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 - FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 - FAFFB3E2FAFFB3E2FAFFB3E2F9FFB3E1F9FFB3E1F9FFB3E1F8FF97D5F5FF30AB - E9FF0D9AE2FF0D97DEFF0D94D9FF0C90D4FF2598CFFF80ACB7FF748181FF585C - 5CFF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4E4D4DFF5B6060FF61ACCBFF80D0F7FF81D1F7FF81D1 - F7FF8BBFD6FF7A8484FF5A5F5FFF4D4D4DFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF0A09094D000000230000000A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000039586867494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4B4949FF535454FF677070FF8BA1 - A1FF7AB8CBFF1B94CFFF0C90D4FF0D94D9FF0D97DEFF0D9AE2FF36ADE9FF96D4 - F4FFB8E3F8FFB8E3F9FFB8E3FAFFB8E3FAFFB8E3FAFFB8E4FAFFB8E4FAFFB8E4 - FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4 - FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4 - FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E3 - FAFFB8E3FAFFB8E3FAFFB8E3F9FFB8E3F9FFAFDFF7FF68C1EFFF18A0E5FF0D99 - E0FF0D96DBFF0C92D7FF0D8FD1FF45A3CCFF85A5AAFF6D7777FF555858FF4C4B - 4BFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4A4848FF504F4FFF606B6EFF8DCCE8FFA4DEF9FFA2DD - F9FF9DDBF9FF9AB8C4FF707A7AFF565959FF4B4A4AFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1616165D000000210000000A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003958687F494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF505151FF6067 - 67FF7E8F8FFF90B8BFFF46A6D0FF0C8FD1FF0C92D6FF0D95DBFF0D98DFFF149D - E3FF52B8ECFFA3DAF6FFBEE5F9FFBEE5F9FFBEE5FAFFBEE5FAFFBEE6FAFFBEE6 - FAFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6 - FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6 - FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FAFFBEE6FAFFBEE5 - FAFFBEE5F9FFBEE5F9FFB8E3F8FF80CBF2FF2AA7E7FF0D99E1FF0D96DDFF0D94 - D9FF0C90D4FF1D95D0FF6DADC4FF839798FF656C6CFF525353FF4B4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4A4949FF525353FF677C82FF9CD9F5FFAAE0 - FAFFAAE0FAFFA9DFF9FF96A8AEFF666F6FFF515252FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1D1C1C6B0000001E00000008000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000003958688F494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4D4D - 4DFF595C5CFF6F7B7BFF8FA8A9FF77B7CCFF2297D0FF0C90D3FF0C93D8FF0D96 - DCFF0D98DFFF159EE3FF4DB6EBFF99D6F5FFC2E7F9FFC3E7FAFFC3E7FAFFC3E7 - FAFFC3E7FAFFC3E7FBFFC3E7FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8 - FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8 - FBFFC3E8FBFFC3E7FBFFC3E7FBFFC3E7FAFFC3E7FAFFC3E7FAFFC3E7FAFFC3E7 - F9FFB4E1F7FF76C7F0FF2CA8E7FF0D99E1FF0D97DEFF0D94DAFF0C91D5FF0E8F - D1FF48A4CDFF88ABB1FF748282FF5C6161FF4F4F4FFF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4B4A4AFF555757FF71939FFFA9E0 - FAFFAFE1FAFFAFE1FAFFACD9EFFF848F8FFF5C6060FF4C4C4CFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1B1A1A620000001900000005000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000003958688F4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4B4A4AFF525353FF626868FF7C8D8DFF93B5B9FF60B0CFFF1792D0FF0C90 - D4FF0C93D8FF0D95DBFF0D97DEFF0D99E1FF30A9E7FF6DC3EFFFA4DAF6FFC6E8 - F9FFC8E9FAFFC8E9FAFFC8E9FAFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9 - FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9 - FBFFC8E9FBFFC8E9FBFFC8E9FAFFC8E9FAFFC8E9FAFFBAE3F8FF8ED1F3FF4AB4 - EBFF189FE4FF0D98E0FF0D96DDFF0D94D9FF0C91D6FF0C8FD1FF349ECFFF7CAF - BEFF819393FF666E6EFF545656FF4C4B4BFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4C4CFF5A5D5DFF84B2 - C4FFB3E3FAFFB4E3FAFFB4E3FAFFA1B8C1FF687171FF515252FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1515154A0000001400000004000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000003958 - 687B494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF4D4C4CFF575959FF697272FF849797FF90B7BEFF5CAE - CFFF1B94D0FF0C90D3FF0C92D7FF0D95DAFF0D96DCFF0D98DFFF0D99E1FF28A6 - E6FF4EB6EBFF82CCF2FFA3DAF5FFC0E6F8FFCDEBFAFFCDEBFAFFCDEBFAFFCDEB - FBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFAFFCDEB - FAFFCAEAF9FFB2E0F7FF94D3F4FF68C1EFFF3BAEE9FF159EE4FF0D99E0FF0D97 - DEFF0D95DBFF0D93D8FF0C91D5FF0C8FD1FF379FCFFF76AFC2FF879D9EFF6D78 - 78FF595D5DFF4E4E4EFF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF4D4D4DFF4F50 - 50FF4F5050FF4D4D4DFF4B4949FF494747FF494747FF4A4848FF4F4F4FFF6472 - 75FFA8DDF5FFB8E5FBFFB8E5FBFFAFD4E4FF7B8484FF565858FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4846 - 46FC0404042B0000000E00000002000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000039586860494747FB494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4A4848FF4F4F4FFF595D5DFF6B7575FF8396 - 96FF93B6BBFF67B1CDFF2D9CD0FF0C8FD1FF0C91D4FF0C93D7FF0D95DAFF0D96 - DCFF0D97DEFF0D98E0FF0D99E1FF109BE3FF26A5E6FF3BAFE9FF4DB6EBFF5BBB - EDFF66C0EFFF6CC3EFFF6EC4EFFF69C2EFFF61BEEEFF55B9ECFF44B2EAFF31AA - E8FF1AA0E4FF0D9AE2FF0D99E0FF0D98DFFF0D97DDFF0D95DBFF0D94D8FF0C92 - D6FF0C90D3FF1692D0FF47A4CEFF7FB1BFFF869C9DFF6F7A7AFF5C6161FF5051 - 51FF4B4949FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4B4949FF515252FF5D6161FF656D - 6DFF656D6DFF5D6262FF525252FF4B4949FF494747FF494747FF4A4949FF585C - 5CFF93C0D2FFBDE7FBFFBDE7FBFFB7E0F3FF848D8DFF595D5DFF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4543 - 43D80000001D0000000800000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000039586840494747E7494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF4F4F4FFF595C - 5CFF687171FF7D8D8DFF91ADAEFF83B7C5FF54ABCFFF2799D0FF0C8FD1FF0C90 - D4FF0C92D6FF0D93D8FF0D94DAFF0D95DBFF0D96DCFF0D97DDFF0D97DEFF0D98 - DFFF0D98DFFF0D98DFFF0D98DFFF0D98DFFF0D98DFFF0D97DEFF0D97DEFF0D97 - DDFF0D95DBFF0D95DAFF0D94D9FF0C92D7FF0C91D5FF0C8FD2FF1592D0FF3BA2 - D0FF69ADC7FF8BAEB4FF819393FF6B7676FF5B5F5FFF505151FF4B4A4AFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4C4C4CFF637C87FFAEDCF0FFB8E0 - F2FFB8E0F2FF95A8AFFF5E6464FF4E4E4EFF494747FF494747FF4A4848FF5658 - 58FF8BACB7FFC2E8FBFFC2E8FBFFBCE1F3FF868F8FFF5A5E5EFF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF302F - 2F9C000000120000000300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000001B7AAA1C494747C3494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4A48 - 48FF4E4E4EFF555858FF616767FF707C7CFF829595FF92AEAFFF88B7C3FF63B0 - CDFF3EA2D0FF1F96D0FF0E8FD1FF0C8FD2FF0C90D4FF0C91D5FF0C92D6FF0C92 - D6FF0C92D7FF0C92D7FF0C92D7FF0C92D7FF0C92D7FF0C92D6FF0C91D6FF0C90 - D4FF0C90D3FF0C8ED1FF1491D0FF2C9CD0FF4FA8CEFF72B0C4FF8EAFB4FF8599 - 9AFF738080FF636B6BFF575A5AFF4F4F4FFF4B4949FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4D4C4CFF677E86FFBEE8FBFFC6EA - FCFFC6EAFCFFADC1CAFF6E7979FF545656FF4A4848FF494747FF4C4A4AFF5B5F - 5FFF9DC9D9FFC6EAFCFFC6EAFCFFBFE2F3FF848D8DFF595D5DFF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF1C1B - 1B4A000000090000000100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000001B7AAA0439586887494747FB494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494848FF4C4A4AFF505050FF575A5AFF616767FF6D7878FF7B8B - 8BFF899E9EFF93AFB1FF8EB6BEFF7DB5C5FF69B1CBFF57ACCFFF49A7D0FF3DA2 - D1FF369FD1FF319DD0FF309DD0FF329ED1FF38A0D0FF43A5D1FF4FA9CFFF5FAD - CCFF71B0C6FF85B3BEFF8FAFB3FF8BA1A2FF7D8E8EFF6F7B7BFF626A6AFF585C - 5CFF515252FF4C4B4BFF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4C4A4AFF5D6465FFBAE5F8FFCBEC - FCFFCBECFCFFC2E1F0FF899697FF646B6BFF545555FF505151FF565959FF7083 - 87FFC1E8FAFFCBECFCFFCBECFCFFBBD8E5FF7A8484FF565858FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF454343D10000 - 0010000000030000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000083A3A338494747D74947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494848FF4B4A4AFF4E4E4EFF5355 - 55FF595D5DFF606767FF677171FF6F7B7BFF778585FF7D8E8EFF839595FF879B - 9BFF8A9F9FFF8CA1A1FF8CA2A2FF8BA0A0FF889C9CFF849696FF7E8F8FFF7886 - 86FF707D7DFF697272FF626969FF5B5F5FFF545656FF4F4F4FFF4C4A4AFF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4A4848FF555858FF9ABECDFFCFED - FCFFCFEDFCFFCFEDFCFFB8D1DCFF869596FF6E7979FF697373FF788B8FFFB8DA - E7FFCFEDFCFFCFEDFCFFCFEDFCFFA9BBC2FF687171FF505151FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF212020590000 - 0007000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000A0D1D1046675 - 757B494747F7494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494848FF4B4949FF4C4B4BFF4F4E4EFF515252FF535555FF565858FF575B - 5BFF595D5DFF5A5E5EFF5A5E5EFF5A5D5DFF585B5BFF565959FF545656FF5152 - 52FF4F4F4FFF4C4C4CFF4B4A4AFF4A4848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF68777CFFC2E5 - F4FFD4EFFCFFD4EFFCFFD4EFFCFFCEEAF8FFBCD9E4FFBCDCE8FFD0EDFBFFD4EF - FCFFD4EFFCFFD4EFFCFFC5DEEAFF7F8888FF5A5E5EFF4C4B4BFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF424040B9000000090000 - 0001000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00006675751C4947479F494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF535555FF7688 - 8EFFC6E5F3FFD8F1FDFFD8F1FDFFD8F1FDFFD8F1FDFFD8F1FDFFD8F1FDFFD8F1 - FDFFD8F1FDFFC8DFEBFF869394FF606767FF505050FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF484646EC10101025000000020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000049474730494747AF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4C4A4AFF5456 - 56FF687578FF9DB5BDFFC4E1EEFFD9F0FBFFDDF2FDFFDDF2FDFFD6EEF9FFC5DE - E9FFA3B6BBFF778283FF5F6565FF515252FF4B4949FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FB2C2B2B4600000002000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000004947472C4947479B494747F74947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B4A - 4AFF505050FF585C5CFF626969FF697373FF6D7878FF6E7979FF6C7777FF6770 - 70FF606565FF565959FF4E4E4EFF4A4949FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FB323131580000000200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000494747144947 - 4773494747D7494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4B4A4AFF4E4D4DFF505050FF525353FF525353FF525252FF4F50 - 50FF4D4C4CFF4A4949FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF484646E732303042000000010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000004947473049474787494747DB494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF464444A82322221500000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000004947472449474768494747A74947 - 47DF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FB484646B04846 - 4634000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000049474714494747444947476C4947478F494747AF494747C7494747DF4947 - 47EB494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747F3494747D3494747A34947476448464618000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFF007FFFFFFFFFFFFFFFFFFFFFFFFFFF800001FFFFFFFFFFFFFFFFFFF - FFFFFF80000001FFFFFFFFFFFFFFFFFFFFFFFC000000003FFFFFFFFFFFFFFFFF - FFFFF00000000007FFFFFFFFFFFFFFFFFFFF800000000001FFFFFFFFFFFFFFFF - FFFE0000000000007FFFFFFFFFFFFFFFFFF80000000000001FFFFFFFFFFFFFFF - FFF000000000000007FFFFFFFFFFFFFFFFC000000000000001FFFFFFFFFFFFFF - FF8000000000000000FFFFFFFFFFFFFFFE00000000000000007FFFFFFFFFFFFF - FC00000000000000001FFFFFFFFFFFFFF800000000000000000FFFFFFFFFFFFF - F0000000000000000007FFFFFFFFFFFFE0000000000000000003FFFFFFFFFFFF - C0000000000000000001FFFFFFFFFFFF80000000000000000000FFFFFFFFFFFF - 000000000000000000007FFFFFFFFFFE000000000000000000003FFFFFFFFFFC - 000000000000000000001FFFFFFFFFF8000000000000000000001FFFFFFFFFF8 - 000000000000000000000FFFFFFFFFF00000000000000000000007FFFFFFFFE0 - 0000000000000000000007FFFFFFFFE00000000000000000000003FFFFFFFFC0 - 0000000000000000000001FFFFFFFF800000000000000000000001FFFFFFFF80 - 0000000000000000000000FFFFFFFF000000000000000000000000FFFFFFFF00 - 00000000000000000000007FFFFFFE0000000000000000000000007FFFFFFE00 - 00000000000000000000003FFFFFFE0000000000000000000000003FFFFFFC00 - 00000000000000000000001FFFFFFC0000000000000000000000001FFFFFF800 - 00000000000000000000001FFFFFF80000000000000000000000000FFFFFF800 - 00000000000000000000000FFFFFF000000000000000000000000007FFFFF000 - 000000000000000000000007FFFFF000000000000000000000000007FFFFF000 - 000000000000000000000003FFFFE000000000000000000000000003FFFFE000 - 000000000000000000000001FFFFE000000000000000000000000001FFFFE000 - 000000000000000000000000FFFFE000000000000000000000000000FFFFE000 - 000000000000000000000000FFFFC0000000000000000000000000007FFFC000 - 0000000000000000000000007FFFC0000000000000000000000000003FFFC000 - 0000000000000000000000003FFFC0000000000000000000000000001FFFC000 - 0000000000000000000000001FFFC0000000000000000000000000001FFFC000 - 0000000000000000000000000FFFC0000000000000000000000000000FFFC000 - 00000000000000000000000007FFC00000000000000000000000000007FFE000 - 00000000000000000000000003FFE00000000000000000000000000003FFE000 - 00000000000000000000000003FFE00000000000000000000000000001FFE000 - 00000000000000000000000001FFE00000000000000000000000000000FFF000 - 00000000000000000000000000FFF00000000000000000000000000000FFF000 - 000000000000000000000000007FF000000000000000000000000000007FF800 - 000000000000000000000000003FF800000000000000000000000000003FF800 - 000000000000000000000000001FFC00000000000000000000000000001FFC00 - 000000000000000000000000001EFC00000000000000000000000000000EFE00 - 000000000000000000000000000EFE000000000000000000000000000006FE00 - 0000000000000000000000000006FF000000000000000000000000000002FF00 - 0000000000000000000000000002FF800000000000000000000000000002FFC0 - 0000000000000000000000000001FFC00000000000000000000000000001FFE0 - 0000000000000000000000000001FFE00000000000000000000000000000FFF0 - 0000000000000000000000000000FFF80000000000000000000000000000FFF8 - 0000000000000000000000000000FFFC0000000000000000000000000000FFFE - 0000000000000000000000000000FFFF0000000000000000000000000000FFFF - 8000000000000000000000000000FFFFC000000000000000000000000000FFFF - E000000000000000000000000000FFFFF000000000000000000000000000FFFF - F800000000000000000000000001FFFFFC00000000000000000000000001FFFF - FE00000000000000000000000001FFFFFF00000000000000000000000003FFFF - FFC0000000000000000000000007FFFFFFE0000000000000000000000007FFFF - FFF800000000000000000000000FFFFFFFFE00000000000000000000001FFFFF - FFFF80000000000000000000003FFFFFFFFFE0000000000000000000007FFFFF - FFFFFC00000000000000000001FFFFFFFFFFFF80000000000000000007FFFFFF - FFFFFFF800000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFF2800000060000000C0000000010020000000 - 0000809400000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000009F9F9F019F9F - 9F019F9F9F010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000010000 - 000300000006000000080000000B0000000E0000001000000011000000120000 - 00120000001200000011000000100000000D0000000A00000007000000050000 - 0002000000010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000100000003000000070000000D000000140000 - 001B00000021000000280000002D000000320000003500000037000000370000 - 0037000000370000003700000034000000300000002C000000250000001F0000 - 0018000000100000000A00000005000000020000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000002000000070000000F00000019000000240000002F000000390000 - 0040000000460000004B0000004E000000500000005200000052000000530000 - 0053000000530000005200000051000000500000004D00000049000000440000 - 003D000000340000002A0000001E000000130000000A00000004000000010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000025242401030303040000 - 000B0000001700000025000000330000004000000049030303530F0F0F711B1A - 1A8B292828A9302E2EC13D3B3BD4424040E1464444EF464444EF464444EF4644 - 44EF464444EF434141E53E3C3CD7323030C4292828AD1D1C1C900F0F0F750404 - 045B000000520000004C00000045000000390000002C0000001D000000100000 - 0007141313020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000050505040000000D0000001A0000 - 002B0000003B01010149090909621F1E1E92343333C4413F3FE9474545F84947 - 47FE494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE474545F94140 - 40EA353434C5201F1F960B0A0A6A010101540000004C00000041000000320000 - 0022000000130202020716161602000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000D0D0D020000000A000000190000002C0000003E0302 - 024E1D1C1C8C363535CB474545F6494747FF494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF474545F6363535CB1B1B1B8C030303590000004F0000 - 0045000000350000002100000011000000062322220100000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00001B1A1A010000000700000015000000290000003D0A0A0A5F282626A64543 - 43EE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE444242ED262525A60A0A - 0A680000005100000045000000330000001E0000000C03030303000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000606 - 06030000000D0000001F0000003608080857292828A6454343F1484646FE4846 - 46FE494747FF494747FF484646FE494747FF494747FF494747FF484646FE4947 - 47FF494747FF494747FE494747FF494747FF494747FE494747FF494747FF4947 - 47FE494747FF494747FF494747FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4442 - 42EF2A2929AB070707620000004E000000400000002A00000014030303062C31 - 3101000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000B0F0F050000 - 0013000000290000004022212192424040E9484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE494747FE494747FE4A49 - 49FE4D4C4CFE505050FE535555FE565959FE595D5DFE5B5F5FFE5B5F5FFE5A5E - 5EFE585B5BFE555757FE515353FE4E4F4FFE4C4B4BFE4A4848FE494747FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE414040E91F1E1E940101015500000048000000340000001D0000 - 0009324343020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000596B6B0100000008000000190000 - 0033101010663B3939D1494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF494747FE4A4949FF4E4E4EFF565858FF616767FE6C78 - 78FF728689FF6F909AFE6796A6FF619AB0FF5D9DB7FE5B9EBAFF5A9FBBFF5A9D - B9FE5D9BB5FF6098ADFF6692A2FE6D8C95FF6F8184FF687171FE5C6161FF5354 - 54FF4C4C4CFE4A4848FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF484646FE3A3838D30E0E0E6F0000004F0000003E0000 - 00240000000E1A23230300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000073737301000000090000001D0201013A2121 - 2190454343F1484646FE494747FF494747FF484646FE494747FF494747FF4947 - 47FE4A4848FF4E4D4DFF575A5AFE666F6FFF71868AFF6B98A7FF529CBCFE3B9D - CAFF2D9BD1FF299CD6FE299DD9FF2A9FDBFF2CA0DCFE2DA1DCFF2EA1DCFF2DA1 - DCFE2BA0DBFF2A9EDAFF289DD8FE289BD5FF2B99CFFF3B9AC7FE5198B6FF6890 - 9EFF6B7D80FE606666FF535555FF4C4A4AFE494747FF494747FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE444242F0201F1F95010101540000 - 00430000002A000000112B2B2B03000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000073737301000000090000001F04040442302F2FB44846 - 46FE484646FE484646FE484646FE484646FE484646FE494747FE4A4848FE4F4E - 4EFE5C6161FE717F80FE7099A6FE499DC3FE309CD1FE269BD7FE2BA0DBFE30A4 - DFFE32A6E1FE34A8E3FE36A9E4FE37AAE5FE38ABE6FE39ABE6FE39ABE6FE39AB - E6FE38ABE6FE37AAE5FE36A9E4FE34A8E2FE32A6E1FE30A3DEFE299FDBFE249A - D6FE2F99CDFE4998BAFE6C8F9AFE687272FE565959FE4C4B4BFE494747FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FC2F2D2DB80404 - 0458000000460000002D00000012070707040000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000006B6B6B010000000A000000200B0B0B503B3A3AD2484646FE4947 - 47FF494747FF484646FE494747FF494747FF494848FE4F4F4FFF5E6363FF7386 - 89FE649FB5FF389ECEFF239AD7FE2CA1DDFF2FA4E0FF32A7E3FF35AAE6FE37AC - E8FF39AEEAFF3BAFEBFE3CB1ECFF3DB1EDFF3DB1EDFE3EB2EDFF3EB2EDFF3EB2 - EDFE3EB2EDFF3EB1ECFF3DB1ECFE3CB0EBFF3BAFEAFF39ADE8FE36AAE6FF33A8 - E3FF30A5E0FE2AA0DCFF1F98D6FF399AC8FE6294A6FF6A797BFE565959FF4C4B - 4BFF494747FE494747FF494747FF484646FE494747FF494747FF484646FE3A38 - 38D209090965000000490000002F0000001301131C0400000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000090000001F0C0C0C51403F3FE0494747FE484646FE4947 - 47FF494747FF484646FE494747FF4C4B4BFF575B5BFE708081FF679DB1FF359C - CDFE259CD9FF2BA1DEFF2FA6E2FE32A9E6FF35ACE9FF38AEEBFF39B0ECFE3BB1 - EEFF3CB2EFFF3DB3EFFE3DB4F0FF3EB4F0FF3EB4F0FE3FB4F0FF3FB5F1FF3FB4 - F1FE3FB5F1FF3FB4F0FF3FB4F0FE3EB3EFFF3EB3EFFF3DB2EDFE3BB1ECFF39AF - EBFF37ACE8FE34A9E6FF30A6E2FF2AA1DDFE239AD7FF3398C8FE6591A1FF6570 - 71FF525353FE4A4848FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF3D3C3CDD0B0B0B6A000000480000002E00000012202B2B03000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000060000001B0C0C0C4F3F3E3EDD484646FE484646FE484646FE4846 - 46FE484646FE494747FE4F5050FE646B6BFE77979FFE409EC9FE239AD7FE28A0 - DDFE2CA5E3FE30A9E7FE33ACEAFE36AEECFE38B0EEFE39B1EFFE39B2F0FE3BB3 - F0FE3BB3F1FE3CB4F1FE3CB4F1FE3CB4F1FE3DB4F1FE3DB5F1FE3DB5F1FE3DB5 - F1FE3DB5F1FE3DB5F1FE3EB5F1FE3EB5F1FE3EB4F1FE3DB4F0FE3DB3F0FE3CB2 - EFFE3AB1EEFE38AFECFE36ADEAFE32A9E6FE2EA5E2FE29A0DDFE2098D4FE4297 - BEFE6E878CFE595D5DFE4C4B4BFE494747FE484646FE484646FE484646FE4846 - 46FE484646FE413F3FE60B0A0A6A000000470000002B0000000F202B2B020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000000000000080B - 0B04000000160C0C0C4B413F3FE0484646FE494747FF494747FF484646FE4947 - 47FF4A4949FF545757FE718182FF61A1BAFF2699D3FE259EDCFF29A3E1FF2DA8 - E6FE31ABEAFF33AEECFF35AFEEFE37B1EFFF37B2F0FF38B2F1FF38B3F1FE38B3 - F2FF39B3F2FF39B3F1FE39B3F2FF3AB3F2FF3AB3F1FE3AB4F2FF3AB4F2FF3AB4 - F1FE3AB4F2FF3BB4F2FF3BB4F1FE3BB4F2FF3BB4F2FF3BB4F1FE3BB4F1FF3BB4 - F1FF3AB3F0FE39B2F0FF39B1EEFF37AFECFE34ACEAFF30A9E6FE2BA4E1FF249D - DAFF2497D0FE6094A8FF646E6EFF4F4F4FFE494747FF494747FF484646FE4947 - 47FF494747FF484646FE3F3D3DE00A0A0A6900000045000000260000000C506B - 6B01000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000002C3B3B020000 - 0011050505373D3B3BD4494747FF484646FE494747FF494747FF494747FE4B4A - 4AFF5A5E5EFF778C8FFE49A0C6FF219AD7FF259FDEFE29A5E4FF2CA9E9FF2FAC - ECFE31AEEEFF33AFEFFF33B0F0FE34B1F1FF35B1F1FF35B2F2FF35B2F1FE36B2 - F2FF36B2F2FF36B2F1FE37B2F2FF37B2F2FF37B2F1FE37B3F2FF37B3F2FF37B2 - F1FE38B3F2FF38B3F2FF38B3F1FE38B3F2FF38B3F2FF38B3F1FE38B3F2FF39B3 - F2FF38B3F1FE38B3F1FF38B2F0FF38B1EFFE36B0EEFF34AEECFE30AAE9FF2CA6 - E4FF27A0DEFE1E97D4FF4C97B8FF6A797BFE515252FF4A4848FF494747FE4947 - 47FF494747FF484646FE494747FF3C3A3AD7070707600000003F000000200000 - 0008000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000000000B0202 - 022A333131B6484646FE484646FE484646FE484646FE494747FE4B4A4AFE5D61 - 61FE79959BFE3B9DCBFE1F9AD8FE24A0E0FE28A6E6FE2AAAEAFE2DACEDFE2FAE - EFFE30AFF0FE30AFF0FE31B0F0FE31B0F0FE31B0F0FE32B0F1FE32B0F1FE32B0 - F1FE32B0F1FE33B1F1FE33B1F1FE33B1F1FE33B1F1FE34B1F1FE34B1F1FE34B1 - F1FE34B1F1FE35B1F1FE35B1F1FE35B1F1FE35B1F1FE35B2F1FE36B2F1FE36B2 - F1FE36B2F1FE36B2F1FE36B2F1FE36B2F1FE35B1F0FE34B0EFFE32AEEDFE2FAB - EAFE2BA7E6FE27A1E0FE1E98D7FE3B97C2FE6E7F81FE535555FE4A4848FE4846 - 46FE484646FE484646FE484646FE484646FE353434C801010152000000380000 - 0018040404040000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000050000001C2726 - 268E494747FF484646FE494747FF484646FE494747FF4B4A4AFF5D6363FE789B - A4FF2F9BCFFF1E9ADAFE22A1E2FF26A6E8FF28A9EBFE2AACEDFF2BADEFFF2CAE - F0FE2DAFF1FF2DAFF1FF2DAFF0FE2DAFF1FF2EAFF1FF2EAFF1FF2EAFF0FE2FAF - F1FF2FAFF1FF2FAFF0FE2FAFF1FF2FAFF1FF30AFF0FE30B0F1FF30B0F1FF30B0 - F0FE31B0F1FF31B0F1FF31B0F0FE31B0F1FF31B0F1FF32B0F0FE32B0F1FF32B0 - F1FF32B0F1FE32B0F1FF33B1F1FF33B0F1FE33B1F1FF32B0F0FE32AFF0FF30AE - EEFF2EABEBFE2AA7E7FF26A2E1FF1E99D9FE3197C7FF6C8489FF545656FE4A48 - 48FF494747FF484646FE494747FF494747FF484646FE292828A90000004D0000 - 00300000000F1312120200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000002B373702000000111616165E4644 - 44F4494747FF484646FE494747FF494747FE4B4A4AFF5C6161FF78989FFE2D9B - CFFF1C9ADAFF20A0E2FE24A6E8FF26A9EBFF27ABEEFE28ACEFFF29ADF0FF29AD - F0FE29ADF1FF2AADF1FF2AADF0FE2AAEF1FF2AAEF1FF2BAEF1FF2AAEF0FE2BAE - F1FF2BAEF1FF2BAEF0FE2CAEF1FF2CAEF1FF2CAEF0FE2CAFF1FF2DAFF1FF2DAE - F0FE2DAFF1FF2DAFF1FF2EAFF0FE2EAFF1FF2EAFF1FF2EAFF0FE2EAFF1FF2FAF - F1FF2FAFF0FE2FAFF1FF2FB0F1FF2FAFF0FE30B0F1FF30AFF0FE2FAFF0FF2FAE - F0FF2EADEEFE2BABECFF28A7E8FF24A1E2FE1C99D9FF3296C6FF6B8287FE5253 - 53FF494747FF484646FE494747FF494747FF484646FE474545F8181717830000 - 0044000000220101010800000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000008050505283F3E3EDB4846 - 46FE484646FE484646FE484646FE4A4848FE575A5AFE799397FE359CCDFE1A99 - D9FE1D9FE1FE21A4E8FE23A8ECFE25AAEEFE25ABEFFE26ACF0FE26ACF0FE26AC - F0FE27ACF0FE27ACF0FE27ACF0FE27ACF0FE27ACF0FE28ACF0FE28ACF0FE28AC - F0FE28ADF0FE28ADF0FE28ADF0FE28ADF0FE28ADF0FE29ADF0FE29ADF0FE29AD - F0FE29ADF0FE29ADF0FE2AADF0FE2AADF0FE2AAEF0FE2AAEF0FE2BAEF0FE2BAE - F0FE2BAEF0FE2BAEF0FE2CAEF0FE2CAEF0FE2CAEF0FE2CAEF0FE2CAEF0FE2CAE - F0FE2CADEFFE2BACEEFE29AAECFE26A6E8FE22A0E1FE1B98D9FE3897C4FE6C79 - 7BFE505050FE494747FE484646FE484646FE484646FE484646FE403E3EE30706 - 065D000000370000001606060603000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000A090903000000172B2A2A98494747FF4947 - 47FF494747FF484646FE494747FF525454FE778B8DFF43A0CAFF1797D8FE1A9E - E1FF1DA3E8FF20A7EBFE21A9EEFF22AAEFFF23AAEFFE23ABF0FF23ABF0FF23AB - F0FE24ABF0FF24ABF0FF24ABF0FE24ABF0FF24ABF0FF25ABF0FF25ABF0FE25AB - F0FF25ABF0FF25ABF0FE26ACF1FF26ACF1FF26ACF0FE26ACF1FF26ACF1FF27AC - F0FE27ACF1FF27ACF1FF27ACF0FE27ACF1FF27ACF1FF28ACF0FE28ACF1FF28AC - F1FF457995FE3C8CB5FF2EA4E1FF28ADF0FE29ADF1FF29ADF0FE29ADF1FF29AD - F1FF29ADF0FE29ACF0FF28ABEEFF27A9EBFE23A5E7FF1F9FE1FF1896D7FE4798 - BBFF667172FF4D4D4DFE494747FF494747FF484646FE494747FF494747FF302E - 2EB800000049000000290000000B000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000A11111148464444F2494747FF4947 - 47FF494747FF494747FE4E4E4EFF6D7878FE59A4C3FF1696D6FF189CDFFE1BA2 - E7FF1DA5EBFF1EA7EDFE1FA8EFFF238BBFFF2F7295FE377B9EFF3B7FA1FF3C7F - A2FE3C7FA2FF3C7FA2FF3C7FA2FE2A9AD3FF21AAF0FF21AAF0FF22AAEFFE22AA - F0FF22AAF0FF22AAEFFE22ABF0FF22ABF0FF23AAF0FE23ABF0FF23ABF0FF23AB - F0FE23ABF0FF24ABF0FF24ABF0FE24ABF0FF24ABF0FF24ABF0FE25ABF0FF2F98 - CEFF585757FE5A5859FF565F63FF48768DFE3692C2FF29A6E7FE26ACF1FF26AC - F1FF27ACF0FE27ACF1FF26ABF0FF25AAEEFE24A8EBFF20A3E6FF1C9DDEFE1795 - D4FF5A94ACFF5D6363FE4A4949FF494747FF484646FE494747FF494747FF4846 - 46FB121212740000003C00000019090808030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000200000016353434B6484646FE484646FE4846 - 46FE484646FE4B4949FE5F6565FE75A2AFFE1794D3FE1599DCFE179FE4FE1AA4 - EAFE1BA6EDFE1CA7EEFE1CA8EFFE1F92CDFE33393DFE474646FE525050FE5453 - 53FE545353FE545353FE545353FE44677AFE1FA6EBFE1EA9EFFE1EA9EFFE1EA9 - EFFE1FA9EFFE1FA9EFFE1FA9EFFE1FA9EFFE1FA9EFFE20A9EFFE20A9EFFE20A9 - EFFE20AAEFFE20AAEFFE21AAEFFE21AAEFFE21AAEFFE21AAEFFE22AAEFFE3F73 - 8EFE575656FE585656FE585656FE585656FE585757FE52616AFE417C9BFE2E9A - D1FE23ABF0FE23ABF0FE23ABF0FE23AAEFFE22A9EDFE21A6EAFE1DA1E5FE199A - DCFE1E94CFFE6B8B94FE535454FE494747FE484646FE484646FE484646FE4846 - 46FE383636CE0202024E0000002A0000000A0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000819181859484646F9484646FE494747FF4947 - 47FF494747FF545656FE799295FF309CCFFE1397DAFF159DE3FF17A2E9FE18A5 - EDFF19A6EFFF19A7EFFE19A7F0FF1AA7EFFF236282FE3A3939FF4B4949FF514F - 4FFE535151FF535151FF535151FE515051FF2D88B7FF1BA8F0FF1CA8EFFE1CA8 - F0FF1CA8F0FF1CA8EFFE1CA8F0FF1CA8F0FF1DA8EFFE1DA8F0FF1DA8F0FF1DA8 - EFFE1DA8F0FF1DA8F0FF1EA8EFFE1EA9F0FF1EA9F0FF1EA8EFFE239EDDFF4E57 - 5CFF565454FE565454FF565454FF565454FE565454FF565454FE565454FF5755 - 55FF4E626EFE3A82A7FF299CD7FF21A9EFFE20A9EEFF1FA7ECFF1DA4E9FE1A9F - E2FF1697D9FF3698C6FE697576FF4D4D4DFF494747FE494747FF494747FF4846 - 46FE484646FE1A1919840000003B000000151312120200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000002000000123B3939BE494747FF484646FE494747FF4947 - 47FF4C4B4BFF6B7575FE5BA4C1FF1193D6FE139AE0FF15A0E7FF16A3ECFE16A5 - EEFF16A6EFFF16A6EFFE17A6F0FF17A6F0FF189CE0FE2C363BFF413F3FFF4D4B - 4BFE504E4EFF514F4FFF514F4FFE514F4FFF465B67FF1CA1E5FF19A7EFFE19A7 - F0FF19A7F0FF19A7EFFE19A7F0FF19A7F0FF1AA7EFFE1AA7F0FF1AA7F0FF1AA7 - EFFE1AA7F0FF1AA8F0FF1BA8EFFE1BA8F0FF1BA8F0FF1BA8EFFE317FA7FF5250 - 50FF535252FE545252FF545252FF535252FE545252FF545252FE545353FF5453 - 53FF545252FE545353FF505559FF3D5F71FE2488BBFF1DA7EEFF1CA6EBFE1AA1 - E7FF169BDFFF1293D4FE5D94AAFF5A5E5EFF4A4848FE494747FF494747FF4846 - 46FE494747FF393737D00101014A000000240101010800000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000611111142484646FC494747FF484646FE494747FF4947 - 47FF565959FF7C9CA3FE1F96D1FF1096DBFE129DE4FF13A1EAFF14A4EDFE14A5 - EEFF14A5EFFF15A5EFFE15A6EFFF15A6EFFF15A5EFFE1D6B92FF343333FF4644 - 44FE4E4C4CFF4F4D4DFF4F4D4DFE4F4D4DFF4E4D4DFF2F7BA2FF16A6EFFE17A6 - F0FF17A6F0FF17A6EFFE17A6F0FF17A6F0FF17A6EFFE17A6F0FF17A7F0FF17A6 - EFFE17A7F0FF18A7F0FF18A7EFFE18A7F0FF18A7F0FF19A4EBFE435C69FF514F - 4FFF525050FE525050FF525050FF525050FE525050FF525050FE525050FF5250 - 50FF525050FE525050FF4E4C4CFF3E3D3DFE23749DFF1AA7EFFF1AA6EDFE19A3 - EAFF169FE4FF1497DBFE2795CBFF6B7E82FF4E4E4EFE494747FF494747FF4846 - 46FE494747FF474545F914131375000000320000001022212101000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000D343232A5484646FE484646FE484646FE494747FE4D4C - 4CFE6C7777FE53A5C7FE0E93D6FE0F9AE0FE119FE7FE12A2ECFE12A3EEFE12A4 - EEFE13A4EEFE13A4EEFE13A4EEFE13A4EEFE13A4EEFE149DE4FE253C49FE3B39 - 39FE494747FE4D4B4BFE4D4B4BFE4D4B4BFE4D4B4BFE494E52FE1A9BDDFE15A5 - EFFE15A5EFFE15A5EFFE15A5EFFE15A5EFFE15A5EFFE16A5EFFE16A5EFFE16A5 - EFFE16A5EFFE16A5EFFE16A5EFFE16A6EFFE16A6EFFE248BC0FE4C4D4EFE4F4D - 4DFE4F4D4DFE4F4D4DFE4F4D4DFE4E4C4CFE4C4A4AFE4D4B4BFE4F4D4DFE504E - 4EFE514F4FFE504E4EFE464545FE32383CFE19A0E5FE18A6EFFE18A6EEFE17A4 - ECFE16A0E8FE139AE0FE0F92D5FE5696B1FE5C6161FE494747FE484646FE4846 - 46FE484646FE484646FE313030BB000000410000001C00000005000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000209090928464444EA494747FF494747FF484646FE494747FF5658 - 58FF809CA1FF1A94D1FE0E96DBFF0E9CE4FE10A0EAFF10A2EDFF10A3EEFE11A4 - EFFF11A4EFFF11A4EEFE11A4EFFF11A4EFFF11A4EEFE11A4EFFF1777A8FF2D2D - 2EFE413F3FFF4B4949FF4C4A4AFE4C4A4AFF4C4A4AFF4C4A4AFF336C89FE13A4 - EDFF13A4EFFF13A4EEFE13A5EFFF13A5EFFF13A5EEFE13A5EFFF13A5EFFF13A5 - EEFE14A5EFFF14A5EFFF14A5EFFE14A5EFFF14A5EFFF36667FFE4D4B4BFF4E4C - 4CFF4E4C4CFE4E4C4CFF4D4B4BFF474545FE3E3C3CFF3D3B3BFE434242FF4947 - 47FF4C4A4AFE4B4949FF3D3C3CFF235C79FE16A6EFFF16A6EFFF16A5EFFE15A4 - EDFF14A1EAFF129DE4FE0F96DAFF2695CBFF6C7E81FE4D4C4CFF494747FF4846 - 46FE494747FF494747FF474545F5050505520000002B0000000C000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000005201F1F68484646FE494747FF494747FF484646FE4B4A4AFF676F - 6FFF60A6C1FF0C91D6FE0D98E0FF0E9EE7FE0FA1ECFF0FA2EEFF0FA3EEFE0FA3 - EFFF0FA3EFFF0FA3EEFE10A4EFFF10A4EFFF10A3EEFE10A4EFFF109FE8FF1F42 - 54FE373535FF454343FF4A4848FE4A4848FF4A4848FF4A4848FF474A4DFE1C90 - CCFF11A4EFFF11A3EEFE11A4EFFF11A4EFFF11A4EEFE11A4EFFF11A4EFFF11A4 - EEFE11A4EFFF12A4EFFF12A4EEFE12A4EFFF169BDFFF474A4CFE4C4A4AFF4C4A - 4AFF4C4A4AFE4C4A4AFF4A4848FF3D3B3BFE2C2A2AFF272626FE2D2C2CFF3635 - 35FF3E3C3CFE3F3D3DFF313335FF1887BFFE14A5EFFF14A5EFFF14A5EEFE13A4 - EEFF12A2EBFF109EE7FE0E98DEFF0F91D4FF6094A9FE565959FF494747FF4846 - 46FE494747FF494747FF484646FE1E1D1D8E0000003B00000017121111020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000A3B3939B8484646FE484646FE484646FE494747FE515151FE7A8F - 91FE2D9BCFFE0C95DAFE0D9BE3FE0D9FE9FE0EA1EDFE0EA2EEFE0EA2EEFE0EA2 - EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE1283 - BDFE2A292AFE3D3C3CFE484646FE494747FE494747FE494747FE494747FE385E - 72FE10A1EBFE0FA3EEFE0FA3EEFE0FA3EEFE0FA3EEFE0FA3EEFE0FA3EEFE10A3 - EEFE10A3EEFE10A3EEFE10A3EEFE10A3EEFE28769EFE494747FE4A4848FE4A48 - 48FE4A4848FE4A4848FE444242FE313132FE186A93FE174A64FE1C2428FE2120 - 20FE272626FE292828FE203F50FE12A2ECFE12A4EEFE12A4EEFE12A4EEFE11A3 - EEFE10A2EDFE0F9FE9FE0E9AE2FE0D94D9FE3698C6FE666F6FFE4B4A4AFE4846 - 46FE484646FE484646FE484646FE3B3939D70202024C00000026000000080000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000C0C0C22464444EA484646FE494747FF494747FF494747FE5B5F5FFF77A4 - B1FF1092D3FF0C97DEFE0D9DE6FF0DA0EBFE0EA2EEFF0EA3EFFF0EA2EEFE0EA3 - EFFF0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2 - EEFE1B4A62FF323131FF434141FE494747FF494747FF494747FF494747FE4748 - 49FF2183B5FF0EA2EEFE0FA3EFFF0FA3EFFF0FA3EEFE0FA3EFFF0FA3EFFF0FA3 - EEFE0FA3EFFF0FA3EFFF0FA3EEFE119FE7FF3B5461FF494747FE4A4848FF4A48 - 48FF4A4848FE484646FF3E3C3CFF254150FE109FE7FF10A3EDFE1192D4FF1461 - 88FF192F3BFE1B1C1DFF146E9CFF10A3EEFE10A4EFFF10A4EFFF10A3EEFE10A3 - EFFF0FA2EEFF0FA0EBFE0D9CE5FF0D96DCFF1291D1FE70898FFF505050FF4947 - 47FE494747FF494747FF484646FE484646FC1514147700000036000000121616 - 1602000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000219191951484646FC484646FE494747FF494747FF4A4949FE6A7373FF5AA6 - C5FF0C92D6FF0C99E1FE0D9EE8FF0DA1ECFE0EA2EEFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE108AC8FF262C30FF3A3939FE464444FF484646FF494747FF484646FE4846 - 46FF3E525DFF0FA0EAFE0EA3EFFF0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2 - EEFE0EA3EFFF0EA3EFFF0EA2EEFE1B8AC4FF474647FF494747FE4A4848FF4A48 - 48FF494747FE454343FF363434FF196891FE0FA3EFFF0EA2EEFE0FA3EFFF0FA3 - EFFF0F9EE7FE117BB2FF0F9AE1FF0FA3EEFE0FA3EFFF0FA3EFFF0FA3EEFE0FA3 - EFFF0EA2EEFF0EA1ECFE0D9EE7FF0D98E0FF0C91D5FE5C96ACFF585C5CFF4947 - 47FE494747FF494747FF484646FE494747FF323131BF000000440000001F0505 - 0506000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00032B2A2A8B484646FE484646FE484646FE494747FE4E4E4EFE7B8D8EFE309B - CEFE0C94DAFE0D9BE4FE0D9FEAFE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE18597BFE2F2E2EFE424040FE484646FE484646FE484646FE4846 - 46FE484646FE2777A0FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE30637DFE484646FE484646FE484646FE4846 - 46FE484646FE3F3E3EFE2B2D2FFE0F97DCFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2 - EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2 - EEFE0DA2EEFE0DA1EDFE0D9FE9FE0D9AE3FE0C94D9FE3B97C2FE646D6DFE4A48 - 48FE484646FE484646FE484646FE484646FE454343F40D0C0C65000000300000 - 000F252424010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00063F3E3EBB494747FF484646FE494747FF494747FF545656FE7E9FA6FF1994 - D2FF0D96DDFF0D9CE5FE0EA0EBFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0F93D7FF233037FE393737FF454444FF484646FF484646FE4947 - 47FF494747FF414E55FE1497DBFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF1397DBFE414B50FF484646FF484646FE494747FF4947 - 47FF464444FE393737FF1F4D65FF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA0EAFF0D9CE4FF0C95DBFE2295CDFF6C7E82FF4C4C - 4CFE494747FF494747FF484646FE494747FF494747FE282727A60000003F0000 - 001B030303040000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0008474545E4494747FF484646FE494747FF494747FF5B6060FE74A7B7FF0F92 - D4FF0D98DFFF0D9EE7FE0EA1ECFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF16658DFE2E2D2DFF403E3EFF484646FF484646FE4947 - 47FF494747FF484646FE2E6B8BFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF237AA7FE474545FF494747FF484646FE494747FF4846 - 46FF434141FE313131FF147AAEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1EBFF0D9DE6FF0C97DDFE1292D2FF6C8C96FF5051 - 51FE494747FF494747FF484646FE494747FF494747FF444242EB0302024E0000 - 002A0000000B0000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000D0D - 0D16484646FE484646FE484646FE484646FE4A4848FE646B6BFE64A9C3FE0C92 - D6FE0C99E1FE0D9EE8FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0E9EE7FE21333CFE363535FE454343FE484646FE4846 - 46FE484646FE484646FE45494CFE198ECAFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0EA2EEFE395463FE484646FE484646FE484646FE484646FE4745 - 45FE3D3B3BFE263944FE0E9CE5FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA1ECFE0D9DE7FE0C98E0FE0C91D4FE6395A8FE5557 - 57FE484646FE484646FE484646FE484646FE484646FE484646FE1F1E1E8E0000 - 003A000000160D0D0D0200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001818 - 1834494747FF494747FF484646FE494747FF4B4A4AFF6C7777FE51A7CBFF0C93 - D8FF0D9AE2FF0D9FE9FE0EA1EDFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE1472A2FF2B2B2CFF3E3D3DFF474545FE4947 - 47FF494747FF484646FE484646FF365E73FF0EA2EDFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF1790CEFF454445FE484646FF494747FF484646FE484646FF4543 - 43FF363434FE1A5F83FF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1EDFF0D9EE8FF0C99E1FE0C92D6FF5497B4FF5A5F - 5FFE494747FF494747FF484646FE494747FF494747FF484646FE3A3838D20202 - 024B000000250000000800000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001A19 - 194B494747FF494747FF484646FE494747FF4D4C4CFF748181FE40A3CFFF0C94 - D9FF0D9BE3FF0D9FE9FE0EA2EDFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0E9EE8FF1E3D4EFF343333FF444242FE4846 - 46FF494747FF484646FE494747FF474546FF1D87BDFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF2A6C8FFF484646FE494747FF494747FF484646FE484646FF413F - 3FFF2D2F30FE118BCAFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1EDFF0D9FE9FF0D9AE2FE0C93D8FF4798BCFF5F66 - 66FE494747FF494747FF484646FE494747FF494747FF484646FE484646FB1312 - 127300000035000000111A191901000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A60484646FE484646FE484646FE484646FE4E4E4EFE7A8A8AFE349FD1FE0C95 - DAFE0D9BE4FE0D9FEAFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE1280B9FE282A2BFE3D3B3BFE4745 - 45FE484646FE484646FE484646FE484646FE3C5563FE109DE5FE0DA2EEFE0DA2 - EEFE109DE4FE3C4F59FE484646FE484646FE484646FE484646FE464444FE3A39 - 39FE21465AFE0EA0EBFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0D9FE9FE0D9AE3FE0C94D9FE3E99C3FE646C - 6CFE494747FE484646FE484646FE484646FE484646FE484646FE484646FE312F - 2FBD000000440000001F03030306000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A64494747FF494747FF484646FE494747FF4F4F4FFF7F9090FE2A9BD2FF0C95 - DBFF0D9BE5FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA0EBFF1B4B63FF323131FE4341 - 41FF484646FF484646FE494747FF494747FF484646FE2679A4FF0EA3EFFF0DA2 - EEFE1B87BFFF454444FF484646FE494747FF494747FF484646FE434242FF3331 - 31FF1672A1FE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA2EEFF0E9FEAFF0D9BE4FE0C94D9FF3799C6FF6771 - 71FE4A4848FF494747FF484646FE494747FF494747FF484646FE494747FF4543 - 43F20C0C0C630000002F0000000E292727010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A64494747FF494747FF484646FE494747FF505050FF819393FE279AD1FF0C95 - DBFF0D9CE5FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF108CCCFF27282AFE3B39 - 39FF464444FF484646FE494747FF494747FF484646FE414E56FF1399DDFF0DA2 - EEFE2B6A8BFF474545FF484646FE494747FF494747FF484646FE3E3D3DFF2930 - 34FF0E9CE4FE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA2EEFF0E9FEAFF0D9BE4FE0C94D9FF3498C7FF6973 - 73FE4A4848FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF262525A20000003E0000001A060606040000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A64484646FE484646FE484646FE484646FE505050FE819393FE289AD1FE0C95 - DBFE0D9BE5FE0DA0EAFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE185878FE302E - 2EFE414040FE484646FE484646FE484646FE484646FE484646FE2F6B8BFE0FA0 - E9FE3E515CFE484646FE484646FE484646FE484646FE454343FE373636FE1C56 - 74FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0D9FEAFE0D9BE4FE0C94D9FE3599C7FE6973 - 73FE4A4848FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE444242EA0202024E0000002A0000000B0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A63494747FF494747FF484646FE494747FF4F4F4FFF7F9090FE2D9DD2FF0C95 - DBFF0D9BE4FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0EA3EFFF0F92D4FE242F - 36FF393737FF464444FE484646FF494747FF484646FE494747FF46494CFF2381 - B1FE46494BFF494747FF484646FE494747FF484646FF424040FE2F3032FF1382 - BCFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA2EEFF0E9FEAFF0D9BE3FE0C94D9FF3999C6FF6770 - 70FE4A4848FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE1B1B1B880000003A000000161312120200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A5E494747FF494747FF484646FE494747FF4E4E4EFF7A8989FE38A0D1FF0C95 - DAFF0D9BE4FF0D9FEAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0EA3EFFF0DA2EEFE1662 - 89FF2E2C2CFF413F3FFE484646FF494747FF484646FE494747FF494747FF454B - 4FFE494747FF494747FF484646FE494747FF474545FF3B3A3AFE243D4AFF0E9F - EAFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA2EDFF0E9FE9FF0D9AE3FE0C93D9FF419AC2FF646C - 6CFE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE393737CF0202024A000000240000000700000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001A1A - 1A48484646FE484646FE484646FE484646FE4C4C4CFE738080FE47A5CFFE0C94 - D9FE0C9AE3FE0D9FE9FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0FA3EFFE149B - E1FE293D48FE414040FE504E4EFE555353FE565454FE575555FE575555FE5654 - 54FE565454FE555353FE535151FE514F4FFE4B4949FE373636FE196B94FE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA1EDFE0D9FE8FE0C9AE2FE0C93D7FE4D9ABBFE5F65 - 65FE494747FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FB1212127200000035000000111D1C1C01000000000000 - 0000000000000000000000000000000000000000000000000000000000001A19 - 1931494747FF494747FF484646FE494747FF4B4A4AFF6B7575FE59A9CAFF0C93 - D7FF0D99E2FF0D9EE9FE0EA1EDFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0EA3EEFE10A4EFFF17A6EFFF1FA9F0FF24ABF0FE25AB - F0FF2B7FAAFF413F3FFE515050FF595858FF5B5959FE5B5959FF5B5959FF5B59 - 59FE5B5959FF5B5959FF5B5959FE5A5858FF535151FF3F4549FE269BD8FF1EA9 - F0FF16A6EFFE10A3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1ECFF0D9EE8FF0C99E1FE0C92D6FF5C9AB2FF5A5E - 5EFE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF302E2EB9000000430000001E04040405000000000000 - 0000000000000000000000000000000000000000000000000000000000000F0F - 0F0F494747FF494747FF484646FE494747FF4A4848FF626A6AFE6CACC3FF0C92 - D6FF0D98E0FF0D9EE8FE0EA1ECFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF12A4EFFF1FA9F0FE28ADF0FF2BAEF1FF2BAEF1FF2BAEF0FE2BAE - F1FF2BACEEFF3A525FFE4E4C4CFF5B5959FF5F5D5DFE5F5D5DFF5F5D5DFF5F5D - 5DFE5F5D5DFF5F5D5DFF5F5D5DFE5D5B5BFF525050FF3A6378FE2BADEFFF2BAE - F1FF2BAEF0FE27ACF0FF1EA9F0FF11A4EFFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1ECFF0D9DE7FF0C98DFFE0D91D4FF6A96A5FF5456 - 56FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF444242F00A09095F0000002E0000000D222121010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0001484646E6484646FE484646FE484646FE494747FE5A5E5EFE7CA9B6FE1292 - D3FE0C97DEFE0D9DE7FE0DA0EBFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE11A4 - EFFE22AAF0FE2FAFF1FE30B0F1FE30B0F1FE30B0F1FE30B0F1FE30B0F1FE30B0 - F1FE30B0F1FE3490BFFE484A4CFE585757FE626060FE636161FE636161FE6361 - 61FE636161FE636161FE636161FE5E5C5CFE4F4E4EFE368EBCFE30B0F1FE30B0 - F1FE30B0F1FE30B0F1FE30B0F1FE2EAFF1FE20A9F0FE10A3EFFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA0EBFE0D9CE6FE0C96DDFE1793D1FE708C92FE4F50 - 50FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE252424A00000003E0000001A0A0909040000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000444242BA494747FF484646FE494747FF494747FF535454FE84A0A3FF2097 - D1FF0D96DCFF0D9CE5FE0EA0EAFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF1AA7EFFF30B0 - F1FE37B2F2FF37B2F2FF36B2F1FE37B2F2FF37B2F2FF37B2F2FF36B2F1FE37B2 - F2FF37B2F2FF37B1EFFE42687BFF555454FF636161FE676565FF676666FF6766 - 66FE676666FF676666FF666464FE5E5C5CFF4B575DFF37B0EEFE37B2F2FF37B2 - F2FF36B2F1FE37B2F2FF37B2F2FF36B2F1FE36B2F2FF2FAFF1FE17A6EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EDFE0E9FEAFF0D9BE4FF0C95DAFE2B97CBFF6E7D7FFF4C4B - 4BFE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF424040E70101014D000000290000000A0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002D2B2B86484646FE484646FE484646FE494747FE4D4D4DFE7A8B8BFE40A2 - CEFE0C94D9FE0D9AE3FE0D9FE9FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE22AAF0FE3AB4F1FE3CB5 - F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5 - F1FE3CB5F1FE3CB5F1FE3F9FCFFE535759FE656363FE6B6A6AFE6C6A6AFE6C6A - 6AFE6C6A6AFE6C6A6AFE696868FE5D5C5CFE477E9AFE3CB5F1FE3CB5F1FE3CB5 - F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE39B3F1FE1EA9 - EFFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA1EDFE0D9EE8FE0D9AE2FE0C93D7FE4A9BBFFE636B6BFE4A48 - 48FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE1A19198300000038000000150000 - 0002000000000000000000000000000000000000000000000000000000000000 - 00001C1B1B46494747FD484646FE494747FF494747FF4A4949FE677070FF6BAC - C3FF0C91D5FF0C98E0FE0D9EE7FF0DA1ECFE0EA2EEFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF26ACF0FE42B7F2FF43B7F2FF43B7 - F2FE43B7F2FF43B7F2FF43B7F2FE43B7F2FF43B7F2FF43B7F2FF43B7F2FE43B7 - F2FF43B7F2FF43B7F2FE43B6F1FF528099FF6A6868FE706F6FFF716F6FFF716F - 6FFE716F6FFF716F6FFF6B6969FE5B5F61FF46A5D5FF43B7F2FE43B7F2FF43B7 - F2FF43B7F2FE43B7F2FF43B7F2FF43B7F2FE43B7F2FF43B7F2FE43B7F2FF41B6 - F2FF21AAF0FE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA2EEFF0DA0EBFE0D9DE7FF0D97DEFF0C90D4FE6C99A9FF575959FF4947 - 47FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE383737CE02010149000000240000 - 0007000000000000000000000000000000000000000000000000000000000000 - 00000F0F0F17474545E9484646FE494747FF494747FF494747FE595D5DFF81A6 - ADFF1894D2FF0C96DCFE0D9CE5FF0DA0EAFE0EA2EEFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF21AAF0FF47B8F2FE49B9F3FF49B9F3FF49B9 - F2FE49B9F3FF49B9F3FF49B9F2FE49B9F3FF49B9F3FF49B9F3FF49B9F2FE49B9 - F3FF49B9F3FF49B9F2FE49B9F3FF4DAFE1FF717070FE757474FF767474FF7574 - 74FE767474FF747373FF6B6A6AFE597380FF4AB8F1FF49B9F2FE49B9F3FF49B9 - F3FF49B9F2FE49B9F3FF49B9F3FF49B9F2FE49B9F3FF49B9F2FE49B9F3FF49B9 - F3FF46B8F2FE1BA7EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA2EDFF0D9FEAFE0D9BE4FF0C95DBFF1D95D0FE75888AFF4F4F4FFF4947 - 47FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE474545F91010106E000000340000 - 0010000000010000000000000000000000000000000000000000000000000000 - 0000000000003F3D3DB8484646FE484646FE484646FE484646FE505050FE7A8C - 8DFE41A2CEFE0C93D8FE0D9AE2FE0D9EE8FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE13A5EFFE47B8F2FE50BCF3FE50BCF3FE50BCF3FE50BC - F3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BC - F3FE50BCF3FE50BCF3FE50BCF3FE5AA7CFFE797777FE7B7979FE7B7979FE7B79 - 79FE7B7979FE777676FE6B6A6AFE5698B9FE50BCF3FE50BCF3FE50BCF3FE50BC - F3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BC - F3FE50BCF3FE41B6F2FE11A4EFFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA1ECFE0D9EE8FE0C99E1FE0C92D7FE4B9EC2FE646C6CFE4A4949FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE2E2D2DB4000000430000 - 001D000000050000000000000000000000000000000000000000000000000000 - 00000000000024232360484646FE494747FF494747FF484646FE4A4949FF646C - 6CFF77ADBEFF0C90D4FE0D97DEFF0D9DE6FE0EA0EBFF0EA2EEFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE34B1F1FF58BEF4FF57BEF3FE58BEF4FF58BEF4FF57BE - F3FE58BEF4FF58BEF4FF57BEF3FE58BEF4FF58BEF4FF58BEF4FF57BEF3FE58BE - F4FF58BEF4FF57BEF3FE58BEF3FF6E94A8FF807E7EFE807F7FFF807F7FFF807F - 7FFE807E7EFF797878FF6A7277FE59B7E7FF58BEF4FF57BEF3FE58BEF4FF58BE - F4FF57BEF3FE58BEF4FF58BEF4FF57BEF3FE58BEF4FF57BEF3FE58BEF4FF58BE - F4FF57BEF3FE58BEF4FF2AADF0FF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA2 - EDFF0EA0EAFF0D9CE6FE0D96DDFF1392D2FF6F97A3FE545656FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF444242F00909095E0000 - 002D0000000D0000000100000000000000000000000000000000000000000000 - 0000000000000C0C0C19484646E9494747FF494747FF484646FE494747FF5456 - 56FF849A9BFF2E9CD1FE0C94DAFF0D9AE3FE0E9FE9FF0EA1EDFF0DA2EEFE0EA3 - EFFF0EA3EFFF0FA3EFFE54BDF3FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1F4FF5EC1 - F4FE5EC1F4FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1F4FF5EC1F4FF5EC1F4FE5EC1 - F4FF5EC1F4FF5EC1F4FE60BDECFF7E888FFF858484FE868484FF868484FF8584 - 84FE848282FF7A7A7AFF688EA1FE5EC1F3FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1 - F4FF5EC1F4FE5EC1F4FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1F4FE5EC1F4FF5EC1 - F4FF5EC1F4FE5EC1F4FF4BBAF2FF0FA3EFFE0EA3EFFF0EA3EFFF0DA2EEFE0EA1 - ECFF0D9EE8FF0D9AE2FE0C93D8FF3B9BC7FF6E7B7CFE4C4B4BFF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE2423239C0000 - 003D000000190000000300000000000000000000000100000000000000000000 - 000000000000020202013B39399D484646FE484646FE484646FE484646FE4C4B - 4BFE697272FE6DAEC5FE0E91D4FE0C97DEFE0D9DE6FE0DA0EBFE0DA2EDFE0DA2 - EEFE0DA2EEFE1DA8F0FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 - F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 - F4FE65C4F4FE65C4F4FE6EB4D8FE898889FE8B8989FE8B8989FE8B8989FE8A89 - 89FE868585FE7B7A7AFE68B0D5FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 - F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 - F4FE65C4F4FE65C4F4FE5FC1F4FE18A6EFFE0DA2EEFE0DA2EEFE0DA1EDFE0DA0 - EAFE0D9CE5FE0C97DDFE1091D3FE6B9AAAFE595D5DFE494747FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE413F3FE30000 - 0049000000280000000A00000000000000000000000200000000000000000000 - 000000000000000000001A1A1A2E494747FD494747FF484646FE494747FF4947 - 47FF545656FF849C9DFE329DCFFF0C93D8FE0D9AE2FF0D9EE8FF0DA1ECFE0EA2 - EEFF0EA3EFFF2CAEF1FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6DC7F5FF6CC7 - F5FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6DC7F5FF6DC7F5FF6CC7F5FE6DC7 - F5FF6DC7F5FF6CC7F5FE81A5B8FF908F8FFF908F8FFE908F8FFF908F8FFF8F8E - 8EFE898787FF7A8890FF6CC7F5FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6DC7 - F5FF6CC7F5FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6CC7F5FE6DC7F5FF6DC7 - F5FF6CC7F5FE6DC7F5FF6BC6F5FF22AAF0FE0EA2EFFF0EA2EEFF0DA1ECFE0D9E - E7FF0D99E1FF0C93D8FE3E9CC6FF6E7B7CFF4D4D4DFE494747FF494848FF4B4A - 4AFE4D4D4DFF4E4D4DFF4E4D4DFE4E4D4DFF4E4D4DFF4E4D4DFE4E4D4DFF4E4D - 4DFF4D4D4DFE4C4B4BFF4A4949FF494747FE494747FF494747FF484646FE1A19 - 1982000000390000001500000002000000000000000100000000000000000000 - 0000000000000000000000000000484646B7494747FF484646FE494747FF4947 - 47FF4B4A4AFF677070FE77ADBEFF1192D3FE0D96DDFF0D9CE5FF0D9FEAFE0EA1 - EDFF0EA2EEFF32B1F1FE74CAF6FF74CAF6FF74CAF5FE74CAF6FF74CAF6FF74CA - F5FE74CAF6FF74CAF6FF74CAF5FE76C3EBFF889EAAFF8EA0AAFF8FA1AAFE8FA1 - ABFF8FA1ABFF8FA1AAFE94989AFF969595FF969595FE969595FF969595FF9492 - 92FE8A898AFF7AA8BFFF74CAF5FE74CAF6FF74CAF6FF74CAF5FE74CAF6FF74CA - F6FF74CAF5FE74CAF6FF74CAF6FF74CAF5FE74CAF6FF74CAF5FE74CAF6FF74CA - F6FF74CAF5FE74CAF6FF74CAF6FF26ACF0FE0EA2EEFF0EA1ECFF0D9FE9FE0D9B - E4FF0C95DBFF1492D1FE7498A2FF585B5BFF494747FE494747FF4D4E4FFF5A68 - 6DFE68797EFF6B7D82FF6B7D82FE6B7D82FF6B7D82FF6B7D82FE6B7D82FF6B7D - 82FF6A7C81FE647073FF545656FF4A4848FE494747FF494747FF484646FE3735 - 35CA010101480000002300000006000000000000000100000000000000000000 - 000000000000000000000000000048464640484646F8484646FE484646FE4846 - 46FE494747FE525353FE7B8E8EFE4FA7CDFE0C92D6FE0D98DFFE0D9DE7FE0DA0 - EBFE0DA1EDFE2CAEF0FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCD - F5FE7BCDF5FE7BCDF5FE7BCDF5FE7EC5E8FE93979AFE9B9A9AFE9C9B9BFE9C9B - 9BFE9C9B9BFE9C9B9BFE9C9B9BFE9C9B9BFE9C9B9BFE9C9B9BFE9B9A9AFE9796 - 96FE8C8F92FE7DC3E6FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCD - F5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCD - F5FE7BCDF5FE7BCDF5FE78CBF5FE22AAEFFE0DA1EDFE0DA0EAFE0D9DE6FE0C97 - DEFE0D92D5FE56A1C0FE677070FE4C4B4BFE494747FE494747FE515B5EFE66BB - E3FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0 - F6FE7FD0F6FE86BCD6FE646969FE4C4A4AFE484646FE484646FE484646FE4745 - 45F80F0E0E6A000000330000000F000000010000000100000000000000000000 - 000000000000000000000000000048464601535858B1484646FE494747FF4947 - 47FF494747FF4A4848FE5C6161FF87A5A9FE2699D1FF0C94D9FF0C99E1FE0D9E - E8FF0EA0EBFF1AA6EEFE81CFF6FF83CFF7FF83CFF6FE83CFF7FF83CFF7FF83CF - F6FE83CFF7FF83CFF7FF83CFF6FE85C8EAFF9A9EA0FFA1A0A0FFA1A0A0FEA1A0 - A0FFA1A0A0FFA1A0A0FEA1A0A0FFA1A0A0FFA1A0A0FEA1A0A0FFA09F9FFF9998 - 98FE8CA3AFFF83CFF7FF83CFF6FE83CFF7FF83CFF7FF83CFF6FE83CFF7FF83CF - F7FF83CFF6FE83CFF7FF83CFF7FF83CFF6FE83CFF7FF83CFF6FE83CFF7FF83CF - F7FF83CFF6FE83CFF7FF76CAF6FF16A5EEFE0EA0EBFF0D9DE7FF0C99E1FE0C93 - D8FF329ACAFF75898CFE515252FF494747FF484646FE494747FF535B5FFF68BC - E2FE80D1F7FF80D1F7FF82CBEDFE82C8E7FF7FC5E5FF7EC4E4FE7EC4E4FF7EC4 - E4FF7EC4E4FE81B0C6FF616565FF4B4A4AFE494747FF494747FF484646FE4947 - 47FF2E2D2DB4000000420000001D000000050000000000000000000000000000 - 0000000000000000000000000000000000008AAEAE2F484646F2494747FF4947 - 47FF494747FF494747FE4D4D4DFF687171FE79AEBEFF1794D2FF0C95DBFE0D9B - E3FF0D9EE8FF0EA1EBFE6CC6F4FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2F7FF8AD2 - F7FE8AD2F7FF8AD2F7FF8AD2F7FE8CCBEBFF9FA3A5FFA6A5A5FFA6A5A5FEA6A5 - A5FFA6A5A5FFA6A5A5FEA6A5A5FFA6A5A5FFA6A5A5FEA6A5A5FFA4A3A3FF9B9B - 9BFE8DBED8FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2 - F7FF8AD2F7FE8AD2F7FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2F7FE8AD2F7FF8AD2 - F7FF8AD2F7FE8AD2F7FF5DC0F3FF0EA0EBFE0D9EE8FF0D9AE2FF0C94DAFE1D95 - D0FF7298A3FF5A5F5FFE4A4848FF494747FF484646FE494747FF4F5050FF5D8E - A3FE7CCFF6FF80D1F7FF86C7E4FE899DA0FF6E7B7DFF636D6FFE626B6DFF626B - 6DFF616B6CFE5C6263FF515151FF4A4848FE494747FF494747FF484646FE4947 - 47FF434141ED0808085A0000002B0000000B0000000000000000000000000000 - 000000000000000000000000000000000000ABE2E2015E696989484646FE4846 - 46FE484646FE484646FE494747FE515252FE768484FE68ADC7FE0F91D3FE0C96 - DCFE0D9BE4FE0D9EE8FE39B1EFFE8FD4F6FE91D5F7FE91D5F7FE91D5F7FE91D5 - F7FE91D5F7FE91D5F7FE91D5F7FE93CEECFEA3A6A9FEA8A7A7FEA8A8A8FEA8A8 - A8FEA8A8A8FEA8A8A8FEA8A8A8FEA8A8A8FEA8A8A8FEA8A8A8FEA5A4A4FE9CA4 - A8FE92D1F2FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5 - F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5 - F7FE91D5F7FE8DD3F6FE2AACEDFE0D9EE8FE0D9AE3FE0C95DBFE1091D2FE6CA1 - B3FE636B6BFE4C4B4BFE494747FE484646FE484646FE484646FE4A4949FE5659 - 59FE65AAC8FE7ED0F6FE7FD0F6FE89BACFFE6F7879FE535454FE4B4A4AFE4B4A - 4AFE4B4A4AFE4A4949FE494848FE494747FE484646FE484646FE484646FE4846 - 46FE484646FE2121219600000038000000140000000100000000000000000000 - 00000000000000000000000000000000000000000000ADE4E409494747D64947 - 47FF494747FF484646FE494747FF494747FE555757FF7C8E8FFF5BAACAFE0D91 - D4FF0C96DDFF0D9BE4FE11A0E9FF6DC6F3FF99D7F7FE99D7F8FF99D7F8FF99D7 - F7FE99D7F8FF99D7F8FF99D7F7FE9AD0ECFFA3A6A8FFA6A5A5FFA6A5A5FEA6A5 - A5FFA6A5A5FFA6A5A5FEA6A5A5FFA6A5A5FFA6A5A5FEA5A5A5FFA4A3A3FF9DBA - C9FE99D7F8FF99D7F8FF99D7F7FE99D7F8FF99D7F8FF99D7F7FE99D7F8FF99D7 - F8FF99D7F7FE99D7F8FF99D7F8FF99D7F7FE99D7F8FF99D7F7FE99D7F8FF99D7 - F8FF99D7F7FE5DBFF1FF0F9FE8FF0D9AE3FE0C96DBFF1092D3FF5FA2BCFE6973 - 73FF4E4E4EFF494747FE494747FF494747FF484646FE494747FF494747FF4B4A - 4AFE596467FF6BB8DAFF7FD0F6FE80D0F6FF88ABBAFF656C6CFE4E4D4DFF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF3F3D3DDD000000430000001E0000000500000000000000000000 - 000000000000000000000000000000000000000000000000000088ABAB414A49 - 49F3494747FF484646FE494747FF484646FE4A4949FF595C5CFF819597FE50A7 - CCFF0E92D4FF0C96DCFE0D9BE3FF22A6EAFF89D0F5FEA1DAF8FFA1DAF8FFA0DB - F8FEA1DBF8FFA1DBF8FFA0DBF8FEA1D1E9FFA5A6A7FFA5A5A5FFA5A5A5FEA5A5 - A5FFA5A5A5FFA5A5A5FEA5A5A5FFA5A5A5FFA5A5A5FEA5A5A5FFA5A5A5FFA1D2 - EAFEA1DBF8FFA1DBF8FFA0DBF8FEA1DBF8FFA1DBF8FFA0DBF8FEA1DBF8FFA1DB - F8FFA0DBF8FEA1DBF8FFA1DBF8FFA0DBF8FEA1DBF8FFA0DBF8FEA1DAF8FFA0DA - F8FF81CDF4FE17A2E8FF0D9AE3FF0C96DCFE1092D3FF58A1BEFF6F7C7DFE5051 - 51FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4947 - 47FE4E4D4DFF5C747CFF72C5EAFE80D1F7FF82CDF1FF849DA6FE5C6161FF4C4B - 4BFF494747FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FD0E0E0E60000000270000000800000000000000000000 - 0000000000000000000000000000000000000000000000000000000000006777 - 777C484646FE484646FE484646FE484646FE494747FE4B4A4AFE5A5E5EFE8299 - 9AFE55A9CCFE0D90D4FE0C96DBFE0D9AE2FE2AA9E9FE98D6F6FEA7DCF8FEA7DD - F8FEA7DDF8FEA7DEF8FEA7DEF8FEA8DBF5FEA8D1E5FEA8D0E4FEA8D0E4FEA8D0 - E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D1E5FEA7DE - F8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DE - F8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DDF8FEA7DDF8FEA7DCF8FE8CD1 - F4FE22A5E8FE0D99E1FE0C95DAFE0E90D3FE5DA3BFFE707E7FFE525353FE4947 - 47FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE494747FE505151FE5E8594FE7ACEF5FE80D0F6FE85C9E9FE7D8A8DFE575A - 5AFE4A4949FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE242323970000002E0000000C00000000000000000000 - 000000000000000000000000000000000000000000000000000000000000B8F6 - F6065B6363A9484646FE494747FF484646FE494747FF494747FF4B4949FE595D - 5DFF7E9091FF68ADC8FE1392D2FF0C94DAFF0C99E0FE26A6E8FF8BD0F4FFAFDF - F8FEAFDFF9FFAFE0F9FFAFE0F9FEAFE0FAFFAFE0FAFFAFE0FAFFAFE0F9FEAFE0 - FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0 - F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0 - FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFDFF9FFAFDFF8FE7FCCF3FF1EA2 - E6FF0C98DFFE0C94D9FF1994D1FF69A4B9FE6D7878FF515252FF494747FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF4A4848FF535555FE639AB1FF7DCFF5FF80D0F6FE87C1DCFF7480 - 81FF545555FE4A4848FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE343333C5000000320000000E00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000A2D3D311464A4DCE494747FF484646FE494747FF494747FF494747FE4B49 - 49FF565959FF768585FE74AEC1FF2398D1FF0C92D7FE0D97DDFF1AA0E4FF6BC3 - F0FEAFDFF8FFB6E2F9FFB5E2F9FEB6E3FAFFB6E3FAFFB6E3FAFFB5E3F9FEB6E3 - FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3FAFFB5E3 - F9FEB6E3FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3 - FAFFB5E3F9FEB6E3FAFFB6E2F9FFB5E2F8FEAADDF7FF61BFEEFE149DE3FF0C96 - DDFF0C92D6FE2998CEFF729FADFF687272FE4F5050FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF4B4949FE575E5FFF73B2CDFF91D7F8FE8FD6F7FF91B8 - C9FF6B7474FE4F5050FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE3F3E3EDB040404370000000E00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000001B79A921464A4DDE484646FE484646FE484646FE484646FE4947 - 47FE4A4848FE525353FE6D7878FE83A9B1FE44A4CFFE0C90D4FE0C94DAFE0D98 - DFFE37ACE8FE8CD0F3FEBBE4F9FEBDE5F9FEBDE5F9FEBDE5FAFEBDE5FAFEBDE6 - FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6 - FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE5FAFEBDE5 - FAFEBDE5F9FEBDE5F9FEB9E3F8FE81CCF2FE2EA8E7FE0D98DFFE0C94D9FE0F91 - D3FE49A2C9FE7A969BFE606767FE4D4D4DFE494747FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE494747FE4C4C4CFE5F6C70FE95CDE6FEA9E0F9FEA8DE - F7FE94ABB4FE5F6565FE4C4B4BFE494747FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE444242E6060606390000000C00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000001A7BAC29454B4FDD494747FF494747FF484646FE4947 - 47FF494747FF494747FE4E4D4DFF5E6464FF809393FE71AEC4FF2799D1FF0C91 - D5FE0C95DBFF0E99E0FF34ABE7FE80CBF1FFB3E0F7FFC4E7FAFFC3E7F9FEC4E7 - FAFFC4E7FBFFC3E8FAFEC4E8FBFFC4E8FBFFC3E8FAFEC4E8FBFFC4E8FBFFC3E8 - FAFEC4E8FBFFC4E8FBFFC3E8FAFEC4E8FBFFC4E7FBFFC3E7FAFEC4E7FAFFC4E7 - FAFFAEDEF7FE76C7F0FF2EA8E6FF0C98DFFE0C95DAFF0C91D4FE2E9ACEFF71A4 - B4FF728080FE565858FF4B4A4AFF494747FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF4E4E4EFF677B82FEA6DCF4FFB0E1 - FAFFAEDDF3FE808C8EFF555757FF494747FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE434141E1060606310000000800000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000001A7BAC29464A4DDC494747FF484646FE4947 - 47FF494747FF484646FE494747FF4B4949FF545656FE6C7777FF83A2A6FF60AB - C8FE2197D1FF0D92D5FF0C94DAFE0E98DEFF1EA1E3FF49B4EAFF83CCF2FEAADD - F6FFBEE5F9FFC8E9FAFECAEAFAFFCAEAFAFFCAEAFAFECAEAFBFFCAEAFBFFCAEA - FAFECAEAFBFFCAEAFAFFCAEAFAFEC7E9FAFFBDE5F8FFA5DBF6FE7CC9F1FF45B2 - E9FF1A9EE2FE0D97DEFF0C94D9FF0E92D5FE2798CFFF61A5BFFE7A9093FF6168 - 68FF4F5050FE4A4848FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4A49 - 49FE4B4A4AFF4B4949FF494848FE494747FF494848FF525252FE80A3B1FFB4E3 - FAFFB5E4FAFE9EB8C2FF606666FF4B4949FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE3D3C3CD3030303220000000500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001B79A921464A4DCA484646FE4846 - 46FE484646FE484646FE484646FE494747FE494747FE4D4C4CFE595D5DFE717D - 7DFE85A5AAFE65ADC7FE2C9CD1FE0C90D3FE0C93D7FE0C95DBFE0C97DDFE119B - E1FE25A4E5FE3EAEE8FE58BAECFE6BC2EFFE79C8F0FE82CCF2FE86CDF2FE81CB - F2FE78C7F0FE69C1EEFE55B9EBFE3AADE8FE23A3E4FE0F99E0FE0C97DDFE0C95 - DAFE0C92D7FE0E91D3FE309CD0FE68A7BEFE7C9699FE677070FE535454FE4B4A - 4AFE494747FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE494747FE4D4C4CFE575A - 5AFE616767FE5D6363FE525353FE4A4848FE494747FE4A4949FE637175FEAFDE - F2FEBBE6FAFEAECDDBFE6A7171FE4C4B4BFE484646FE484646FE484646FE4846 - 46FE484646FE484646FE343333B2000000130000000200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000001A7BAC0F3F515BA14947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494848FF4D4C - 4CFE585B5BFF6B7575FF84999AFE7CACBAFF54A7CAFF2C9CD1FF1192D2FE0C91 - D5FF0C93D8FF0C94D9FE0D95DBFF0D96DCFF0C96DDFE0D97DDFF0D97DDFF0C96 - DDFE0D96DDFF0D96DCFF0C95DBFE0C94D9FF0C93D7FF0C91D5FE1492D2FF2F9C - CFFF57A5C5FE7AA4B0FF7B8C8CFF626969FE525454FF4B4A4AFE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF555C5FFFA2D0 - E4FEBBE2F5FFAECEDDFF6B7272FE4D4D4DFF494747FF494848FE5C6263FFB0D9 - EBFFC2E8FBFEB4D1DEFF6C7474FF4C4C4CFE494747FF494747FF484646FE4947 - 47FF494747FF484646FE21202070000000090000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000E87C4053859 - 6A70484849EF484646FE494747FF494747FF484646FE494747FF494747FF4947 - 47FE494747FF4C4B4BFF535555FE606666FF717E7EFF80979AFF7FA9B3FE6AAA - C2FF51A6CBFF3AA0CEFE2799D0FF1C96D2FF1894D2FE1594D3FF1593D3FF1694 - D3FE1894D2FF1D96D2FF2999CFFE3CA0CDFF52A5C8FF6BA7BDFE7CA1AAFF7A8E - 90FF6A7474FE5B5F5FFF505151FF4A4949FE494747FF494747FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF55595AFFA9CF - DFFEC8EBFCFFC3E3F3FF869395FE585C5CFF4C4C4CFF4F4F4FFE718389FFC1E6 - F7FFC8EBFBFEB3CDD8FF686F6FFF4C4B4BFE494747FF494747FF484646FE4947 - 47FF494747FF484646F20909091F000000020000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000088B0B236535858CA484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE494747FE4A4848FE4C4C4CFE525353FE5A5F5FFE656E - 6EFE707C7CFE7B8C8CFE829899FE839FA3FE81A2A9FE7FA4ADFE7EA4ADFE7EA3 - ACFE80A1A7FE829DA0FE7F9495FE778686FE6D7777FE616868FE575A5AFE5050 - 50FE4B4A4AFE494747FE494747FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE494747FE4F5050FE8FAD - B9FECEEDFBFECEECFBFEB6CED8FE7A8787FE656D6DFE6E7B7DFEB2D2DFFECEED - FBFECEEDFBFE9FB1B7FE5D6262FE4A4949FE484646FE484646FE484646FE4846 - 46FE484646FE3130309400000006000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000ADE5E502768E8E724C4C4CE6484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF494747FF494747FE4A48 - 48FF4B4A4AFF4D4D4DFE505050FF525454FF545656FE565858FF565959FF5558 - 58FE535555FF525252FF4F4F4FFE4C4B4BFF4B4949FF494747FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF4B4949FF5F68 - 6AFEBCDCEAFFD4EFFCFFD4EFFCFECEE9F6FFC2DEEAFFCEECF9FED4EFFCFFD4EF - FCFFBFD7E2FE717A7AFF515252FF494747FE494747FF494747FF484646FE4947 - 47FF444242DC0B0A0A1D00000001000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000004A49491C4846468E494747F0494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF494747FE494747FF494747FF4947 - 47FE494747FF494747FF494747FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4E4D - 4DFE697578FFB0CBD5FFD2EBF7FED9F1FCFFDAF1FDFFD9F0FCFED2EAF6FFB4CA - D2FF798385FE565858FF4A4949FF494747FE494747FF494747FF484646FE4846 - 46F31F1F1F4C0000000100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000484646244846468A4846 - 46ED484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4947 - 47FE4D4D4DFE595C5CFE707D80FE859395FE8A979AFE869497FE768284FE6167 - 67FE525454FE4B4949FE494747FE484646FE484646FE484646FE484646FC2D2C - 2C63010101020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000004846 - 460B49474765494747BD484646F6494747FF494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF4A4848FF4C4B4BFE4E4E4EFF505050FF4F4F4FFE4D4D4DFF4B49 - 49FF494747FE494747FF494747FF484646FE494747FF464444E1302F2F4C0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000049474704484646224947476E494747B4494747E5484646F94947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FE484646EF413F3F943837371D000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000004846460F484646354846 - 46604846468B484646AE484646CD484646E4484646F3484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FC484646E2484646B24846466E484646210000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFF - FFFF80000FFFFFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFFFE00000003FFFFF - FFFFFFFFFF000000000FFFFFFFFFFFFFFE0000000003FFFFFFFFFFFFF8000000 - 0000FFFFFFFFFFFFE000000000007FFFFFFFFFFFC000000000001FFFFFFFFFFF - 8000000000000FFFFFFFFFFE00000000000007FFFFFFFFFC00000000000003FF - FFFFFFF800000000000001FFFFFFFFF000000000000000FFFFFFFFF000000000 - 0000007FFFFFFFE0000000000000003FFFFFFFC0000000000000001FFFFFFF80 - 000000000000001FFFFFFF80000000000000000FFFFFFF000000000000000007 - FFFFFE000000000000000007FFFFFE000000000000000003FFFFFC0000000000 - 00000003FFFFFC000000000000000001FFFFF8000000000000000001FFFFF800 - 0000000000000000FFFFF0000000000000000000FFFFF0000000000000000000 - 7FFFF00000000000000000007FFFE00000000000000000007FFFE00000000000 - 000000003FFFE00000000000000000003FFFE00000000000000000001FFFC000 - 00000000000000001FFFC00000000000000000000FFFC0000000000000000000 - 0FFFC00000000000000000000FFFC000000000000000000007FFC00000000000 - 0000000007FFC000000000000000000003FFC000000000000000000003FFC000 - 000000000000000001FFC000000000000000000001FFC0000000000000000000 - 01FFC000000000000000000000FFC000000000000000000000FFC00000000000 - 00000000007FC0000000000000000000007FC0000000000000000000003FC000 - 0000000000000000003FE0000000000000000000003FE0000000000000000000 - 001FE0000000000000000000001FE0000000000000000000000FF00000000000 - 00000000000FF00000000000000000000007F00000000000000000000006F000 - 00000000000000000006F80000000000000000000002FC000000000000000000 - 0002FC0000000000000000000000FC0000000000000000000001FE0000000000 - 000000000001FE0000000000000000000000FF0000000000000000000000FF80 - 00000000000000000000FFC000000000000000000000FFC00000000000000000 - 0000FFE000000000000000000000FFF000000000000000000000FFF800000000 - 000000000000FFFC00000000000000000000FFFE00000000000000000000FFFF - 00000000000000000001FFFF80000000000000000001FFFFE000000000000000 - 0003FFFFF0000000000000000003FFFFFC000000000000000007FFFFFF000000 - 00000000000FFFFFFFC0000000000000003FFFFFFFF0000000000000007FFFFF - FFFF00000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28000000480000009000 - 0000010020000000000060540000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000003737370137373702373737043737370637373707373737073737 - 3707373737063737370537373703373737010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000001000000050000 - 000B000000130000001B00000023000000290000002E00000030000000310000 - 00310000002F0000002C000000260000001E000000160000000E000000070000 - 0002000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000040000000D0000001A000000290000 - 00370000004200000049030303520C0C0C64100F0F7110101073101010741010 - 10740E0D0D6B0707075B000000500000004C000000460000003B0000002F0000 - 0020000000110000000600000001000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000028272701070707060000001300000026000000390303034E121111742423 - 23A1333232C7424040E5474545F9484646FC484646FD484646FD484646FD4846 - 46FD484646FC474545FA444242EE383636D12A2929AF171616840606065F0000 - 004C0000003F0000002D000000190101010A1F1E1E0200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000D0C - 0C04000000120000002900000040121111702D2C2CB6424040E9484646FE4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF454343F23332 - 32C7181717860101015400000046000000320000001A03030308242323010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000001A1A1A020000000D0000 - 0024020202421B1A1A873C3A3AD9484646FE494747FF484646FE494747FF4846 - 46FE494747FF494747FF484646FE494747FF484646FE494747FF484646FE4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4846 - 46FE494747FF424040E92322229F0606065E000000460000002E000000140808 - 0804000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001014140500000017000000341716 - 16783C3A3AD9484646FE494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4A4949FF4C4B4BFF4D4D4DFF4E4E4EFF4E4E4EFF4D4D - 4DFF4C4B4BFF4A4949FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF424040EA1F1E1E97020202540000003D0000 - 0020010101090000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000040505080000002009090950323131BE4846 - 46FE494747FF484646FE494747FF484646FE494747FF494747FE4C4C4CFF5456 - 56FE606666FF697879FF68848CFE638C9AFF6091A4FE5E94A9FF5E93A9FE5E90 - A4FF618A9AFE66838CFF687779FF5F6565FE545656FF4C4B4BFE494747FF4947 - 47FE494747FF484646FE494747FF484646FE494747FF3B3A3AD9100F0F740000 - 00480000002B0000000F546B6B01000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000505050A0000002718171776424141EA494747FF4947 - 47FF494747FF494747FF494747FF4B4A4AFF545656FF657071FF6A8B95FF5598 - B4FF3F9DC9FF2F9DD4FF2B9FD9FF2CA0DCFF2EA2DDFF30A3DEFF30A3DEFF2EA2 - DDFF2CA0DCFF2B9ED9FF2C9CD4FF399BCAFF4C95B5FF638895FF636E70FF5355 - 55FF4B4949FF494747FF494747FF494747FF494747FF494747FF464444F62322 - 229E010101500000003300000012515151020000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000606060A0101012B25242498484646FA494747FF484646FE4947 - 47FF494747FF4B4A4AFE575A5AFF6C7F82FE5A98B1FF399ECEFE289DD9FF2EA3 - DFFE33A7E3FF35AAE5FF38ACE7FE3AAEE9FF3BAEEAFE3CAFEAFF3CAFEAFE3CAF - EAFF3BAEE9FE39ADE8FF37ABE6FF34A8E3FE30A4DFFF279DD9FE319BCFFF4F93 - B0FE667C81FF565959FE4B4949FF494747FE494747FF494747FF484646FE4846 - 46FE323030C00404045800000037000000140327390200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000404040A0101012C2E2D2DAD484646FD494747FF494747FF494747FF4948 - 48FF525454FF6A7B7EFF599AB5FF2E9DD3FF2AA0DDFF2FA6E3FF34AAE7FF37AD - EAFF39B0ECFF3BB1EEFF3DB3EFFF3EB4EFFF3EB4F0FF3FB4F0FF3FB4F0FF3FB4 - F0FF3FB4EFFF3EB3EFFF3EB2EEFF3CB1ECFF3AAFEBFF36ACE8FF32A7E4FF2BA1 - DEFF289AD4FF4B95B5FF65787CFF525454FF494848FF494747FF494747FF4947 - 47FF494747FF393737D30606065D0000003700000013526E6E01000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000D12 - 1206010101282E2D2DAC484646FE494747FF484646FE494747FF4B4A4AFE5F65 - 65FF6994A3FF349DCFFE269FDCFF2DA6E3FE31AAE8FF35AEECFE38B0EEFF39B2 - EFFE3AB3F0FF3BB4F1FF3BB4F1FE3CB4F1FF3CB4F1FE3DB5F2FF3DB5F1FE3DB5 - F2FF3DB4F1FE3EB5F1FF3DB5F1FF3DB4F1FE3CB3F0FF3BB2EEFE38B0ECFF35AC - E9FE30A7E4FF28A0DDFE2A99CFFF5A8EA3FE5D6363FF4B4A4AFF494747FE4947 - 47FF484646FE494747FF3C3B3BDB0505055B000000350000000F5E7E7E010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000263333040000 - 001E2D2C2CA6484646FE494747FF494747FF494747FF4E4E4EFF6A7778FF539D - BDFF239BD8FF28A2E1FF2DA8E7FF31ADECFF33AFEEFF35B1F0FF36B2F1FF37B2 - F1FF37B2F2FF37B3F2FF38B3F2FF38B3F2FF38B3F2FF39B3F2FF39B3F2FF39B3 - F2FF39B3F2FF39B3F2FF3AB4F2FF3AB4F2FF3AB4F2FF39B3F1FF39B3F0FF38B1 - EFFF36AFEDFF31ABE9FF2BA5E2FF229BD9FF4196BDFF647478FF4E4D4DFF4947 - 47FF494747FF494747FF494747FF393838D4050505580000002E0304040B0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000526E6E0100000014201F - 1F82484646FE494747FF494747FF494747FF505050FF6F8285FF419DC7FF219C - DBFF27A4E4FF2BA9EAFF2EADEDFF30AEEFFF31B0F0FF32B0F1FF32B0F1FF32B0 - F1FF33B1F1FF33B1F1FF33B1F1FF34B1F1FF34B1F1FF34B1F1FF34B1F1FF35B1 - F1FF35B2F2FF36B2F2FF36B2F2FF36B2F2FF36B2F2FF37B2F2FF37B2F2FF37B2 - F1FF36B1F0FF34AFEEFF31ACEBFF2BA7E6FF239EDDFF3197C8FF657D83FF4F50 - 50FF494747FF494747FF494747FF494747FF333232C40000004B000000240E11 - 1105000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000B131313584745 - 45F7484646FE494747FF494747FE505151FF70878CFE359CCDFF1F9CDDFE24A4 - E6FF28A9EBFF2AACEEFE2BADF0FF2CAEF0FE2DAFF1FF2DAFF0FE2DAFF1FF2EAF - F0FE2EAFF1FF2EAFF1FF2EAFF0FE2FAFF1FF2FAFF0FE2FB0F1FF30B0F0FE30B0 - F1FF30B0F0FE30B0F1FF31B0F1FF31B0F0FE31B0F1FF32B0F1FE32B0F1FF32B0 - F1FE32B0F1FF32B0F0FE31AFEFFF2EACECFE29A7E7FF239FDFFF2797CEFE6481 - 8AFF505050FE494747FF484646FE494747FF484646FE262525A4000000420000 - 00181B1A1A020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001315150405040428413F3FDF4947 - 47FF494747FF494747FF4E4E4EFF6F8285FF379CCCFF1C9CDDFF21A3E6FF25A8 - ECFF27ABEFFF27ACF0FF28ACF1FF28ADF1FF28ADF1FF28ADF1FF29ADF1FF29AD - F1FF29ADF1FF29ADF1FF2AADF1FF2AADF1FF2AAEF1FF2BAEF1FF2BAEF1FF2BAE - F1FF2BAEF1FF2CAEF1FF2CAEF1FF2CAEF1FF2DAEF1FF2DAFF1FF2DAFF1FF2DAF - F1FF2EAFF1FF2EAFF1FF2EAFF0FF2DAEEFFF2BABEDFF27A7E8FF219EDFFF2796 - CDFF647D83FF4D4D4DFF494747FF494747FF494747FF474545F9121212770000 - 00330000000B0000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000102D2C2CA0494747FF4947 - 47FF494747FE4B4A4AFF6B7778FE439EC7FF199ADBFE1DA2E6FF21A7EBFE22A9 - EEFF23AAF0FF23ABF0FE24ABF0FF24ABF0FE24ABF0FF24ABF0FE25ABF0FF25AB - F0FE25ACF0FF26ACF0FF26ACF0FE26ACF1FF26ACF0FE26ACF1FF27ACF0FE27AC - F1FF27ACF0FE27ACF1FF28ADF1FF28ADF0FE28ADF1FF3990BDFE3698CAFF2AAB - EDFE29ADF1FF29ADF0FE2AADF1FF29ADF0FE29ACEFFF28AAECFF24A5E7FE1E9D - DEFF2F96C8FE647376FF4B4A4AFE494747FF484646FE494747FF3E3D3DE00303 - 034F000000201211110300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000511111148474545F7494747FF4947 - 47FF494848FF5E6465FF589FBBFF1697D9FF199FE4FF1CA5EAFF1EA8EEFF1FA0 - E2FF2F6581FF3D708AFF42748EFF42748EFF42748EFF3B7D9FFF21A9EEFF21AA - F0FF21AAF0FF22AAF0FF22AAF0FF22AAF0FF22AAF0FF23ABF0FF23ABF0FF23AB - F0FF23ABF0FF24ABF0FF24ABF0FF24ABF0FF26A7EAFF535D63FF595959FF5264 - 6EFF4180A1FF2F9ED7FF26ABEFFF26ACF0FF26ACF0FF26ABEFFF24A8ECFF20A3 - E6FF199ADBFF4194BBFF5D6363FF494747FF494747FF494747FF484646FE2524 - 24A1000000390000000E00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000001010110373636BF484646FE494747FF4947 - 47FF525454FE7096A2FF1996D5FE169CE1FF18A3E9FE1AA6EEFF1AA7EFFE1BA7 - EFFF285C77FF434242FE515050FF535252FE545252FF535152FE2B8EC1FF1DA8 - EFFE1DA8F0FF1DA8F0FF1DA8EFFE1EA9F0FF1EA9EFFE1EA9F0FF1EA9EFFE1FA9 - F0FF1FA9EFFE1FA9F0FF20A9F0FF20A9EFFE3288B4FF565454FE575555FF5755 - 55FE575555FF575657FE4B6979FF3986AEFE27A2E1FF22AAEFFF22A9EEFE20A6 - EBFF1BA0E4FE1796D7FF5B8DA1FE515252FF494747FE494747FF494747FF4442 - 42F10908085A0000002016161603000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000031615154F484646FC494747FF494747FF4B49 - 49FF6D7B7DFF359BCCFF1298DDFF15A0E7FF16A4EDFF17A6EFFF17A6F0FF17A6 - F0FF1998D9FF32373AFF494747FF504E4EFF514F4FFF514F4FFF465D6AFF1BA3 - E9FF19A7F0FF19A7F0FF19A7F0FF1AA7F0FF1AA7F0FF1AA8F0FF1AA7F0FF1AA8 - F0FF1BA8F0FF1BA8F0FF1BA8F0FF1CA7EEFF446272FF545252FF545252FF5452 - 52FF545252FF545353FF555353FF555353FF525659FF40697FFF2689BCFF1DA7 - EDFF1BA3E9FF179CDFFF2295CEFF65767AFF4B4949FF494747FF494747FF4947 - 47FF282727A8000000340202020A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000B363434B6494747FF484646FE494747FF5658 - 58FF659EB3FE1094D7FF119CE3FE13A2EAFF14A4EEFE14A5EFFF15A5EFFE15A5 - EFFF15A5EFFF1F6487FE3B3A3AFF4C4A4AFE4E4C4CFF4E4C4CFE4E4C4DFF2D7E - A9FE16A6F0FF16A6F0FF16A6EFFE16A6F0FF17A6EFFE17A6F0FF17A6EFFE17A6 - F0FF17A6EFFE18A6F0FF18A7F0FF2294CEFE4E4F50FF514F4FFE514F4FFF514F - 4FFE514F4FFF514F4FFE525050FF525050FE514F4FFF454444FF266A8DFE1AA7 - EFFF19A5ECFE16A0E6FF1396DAFE4B92B1FF555858FE494747FF494747FF4846 - 46FE434242ED0505054D00000017252424010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000010D0D0D31484646F9494747FF494747FF4B4A4AFF707F - 7FFF2B9AD0FF0E98DEFF109FE8FF11A2EDFF11A4EEFF11A4EFFF12A4EFFF12A4 - EFFF12A4EFFF139BE0FF293841FF434141FF4C4A4AFF4C4A4AFF4D4B4BFF4751 - 57FF189DE1FF13A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5 - EFFF15A5EFFF15A5EFFF15A5EFFF356D8BFF4E4C4CFF4F4D4DFF4F4D4DFF4D4B - 4BFF474545FF464545FF4C4A4AFF4F4D4DFF4C4A4AFF383A3CFF1996D7FF17A6 - F0FF16A5EEFF15A2EAFF129AE1FF1C94D0FF657A7FFF4A4949FF494747FF4947 - 47FF484646FE1D1C1C8C0000002A0A0A0A060000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000327262684494747FF494747FF494747FF535555FF6B9D - AEFF0C92D7FF0E9BE3FF0FA0EBFF0FA2EEFF0FA3EFFF0FA3EFFF10A3EFFF10A4 - EFFF10A4EFFF10A4EFFF186E9AFF353434FF474545FF4A4848FF4A4848FF4A48 - 48FF307091FF11A4EFFF11A4EFFF11A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4 - EFFF12A4EFFF12A4EFFF159FE6FF464D51FF4C4A4AFF4C4A4AFF4C4A4AFF4544 - 44FF313030FF2C2A2AFF363434FF403E3EFF3F3E3EFF265065FF14A5EFFF14A5 - EFFF14A5EEFF13A2ECFF109DE5FF0E94D9FF5192ADFF525353FF494747FF4947 - 47FF494747FF373535CD0000003E000000110000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000101010A403E3ED2484646FE494747FF494747FE666F70FF3E9E - CAFF0C96DCFE0D9DE7FF0EA1EDFE0EA2EEFF0EA2EEFE0EA3EFFF0EA2EEFE0EA3 - EFFF0EA3EFFF0EA2EEFE0F9FE9FF233B48FE3E3C3CFF494747FE4A4848FF4947 - 47FE464A4DFF1993D1FF0FA3EEFE0FA3EFFF0FA3EEFE0FA3EFFF0FA3EEFE10A3 - EFFF10A3EEFE10A3EFFF257CA9FF494747FE4A4848FF4A4848FE494747FF3A39 - 39FE1B658CFF16587AFE1C2B33FF232323FE262525FF167DB2FF12A4EEFE12A4 - EFFF11A4EEFE10A2EDFF0F9FE8FE0D97DEFF2696CCFE636B6BFF494747FF4846 - 46FE494747FF484646FC0E0E0E68000000231414140300000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000C0C0C2B484646F7494747FF494747FF4C4B4BFF758E93FF1995 - D3FF0D99E1FF0D9FEAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF1379ADFF303030FF454343FF494747FF4947 - 47FF494747FF356178FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0FA1EDFF395969FF494747FF4A4848FF494747FF454343FF2E37 - 3DFF109BE2FF0FA3EFFF0F9BE2FF1371A2FF154964FF109EE7FF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA2EEFF0EA0EBFF0D9AE3FF0D92D5FF668690FF4C4B4BFF4947 - 47FF494747FF494747FF2D2C2CB4000000370101010C00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000201F1F63494747FF484646FE494747FF535454FE689EB2FF0C93 - D7FF0D9BE4FE0EA1EBFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA1ECFE1E455AFF3B3939FE474545FF4846 - 46FE494747FF484646FF1C88C0FE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE188FCCFF464647FF494747FE494747FF484646FE3E3C3CFF1E59 - 77FE0EA3EFFF0EA2EEFE0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2EEFE0EA3 - EFFF0EA2EEFE0EA2EEFF0DA1ECFE0D9DE6FF0C94DAFE4D92B0FF525454FF4846 - 46FE494747FF484646FE444242F1070707550000001C1F1E1E02000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000067676701312F2F94494747FF494747FF494747FF5E6363FF4EA2C5FF0C95 - DBFF0D9DE7FF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1186C2FF2C2E2FFF434141FF4846 - 46FF494747FF494747FF3B5766FF0F9FE9FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF2C6B8CFF484646FF494747FF494747FF464444FF343435FF1285 - BFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EDFF0D9EE8FF0D97DDFF3396C4FF5D6262FF4947 - 47FF494747FF494747FF494747FE222121980000003001010108000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000067676703393737BE494747FF484646FE494747FF6B7575FE349ECFFF0D97 - DEFF0D9EE8FE0EA2EDFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA2EEFF1B516CFE383737FF4745 - 45FE494747FF494747FF484646FE247CA9FF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0F9EE7FE414B52FF494747FF484646FE484646FF424040FE26404DFF0EA1 - EDFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0D9FE9FF0D99E0FE1E94CFFF657274FF4947 - 47FE494747FF484646FE494747FF3F3D3DE201010145000000162A2929010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000069696907464444DC494747FF494747FF4A4949FF778787FF1E97D2FF0D99 - E0FF0E9FEAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1090D2FF292F33FF413F - 3FFF484646FF494747FF494747FF424E55FF119CE2FF0EA3EFFF0EA3EFFF0EA3 - EFFF1F81B4FF474646FF494747FF494747FF484646FF3A3838FF186B95FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0EAFF0D9AE2FF1393D4FF677F85FF4A48 - 48FF494747FF494747FF494747FF484646FE1717177D000000290B0B0B050000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000069696909484646F0494747FF484646FE4C4B4BFF7B9396FE1293D4FF0D9A - E2FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE185D80FF3534 - 34FE464444FF494747FF484646FE484646FF2C7093FE0EA3EFFF0DA2EEFE0EA2 - EEFF345E75FE484646FF494747FF484646FE454343FF2F3437FE1094D8FF0DA2 - EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA0EBFF0D9BE3FE0D92D6FF648793FF4B4A - 4AFE494747FF484646FE494747FF484646FE353434C90000003D000000100000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00006969690B484646FE494747FF494747FF4D4D4DFF78979FFF0F92D5FF0D9A - E3FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0F98DEFF2534 - 3BFF3F3E3EFF484646FF494747FF494747FF45494DFF1693D4FF0EA3EFFF1397 - DBFF43474AFF494747FF494747FF484646FF3F3D3DFF205069FF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1ECFF0D9BE5FF0C92D7FF608C9DFF4C4B - 4BFF494747FF494747FF494747FF494747FF474545F90E0E0E67000000211414 - 1403000000000000000000000000000000000000000000000000000000000000 - 00006969690B494747FF494747FF494747FF4E4E4EFF769AA3FF0E92D5FF0D9A - E3FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF166A - 96FF333232FF454444FF494747FF494747FF484646FF34637BFF0EA3EFFF227C - AAFF474545FF494747FF494747FF474545FF363536FF147CB2FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1ECFF0D9CE5FF0C93D7FF5E8EA1FF4D4C - 4CFF494747FF494747FF494747FF494747FF494747FF2B2929B0000000350100 - 000B000000000000000000000000000000000000000000000000000000000000 - 00006969690B484646FE494747FF484646FE4E4E4EFF7799A2FE0E92D5FF0D9A - E3FF0DA0EBFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0E9F - E9FE223A46FF3D3C3CFF484646FE494747FF484646FE474748FF1D89C1FE3561 - 77FF484646FE494747FF494747FF434141FE293942FF0EA0EAFE0EA3EFFF0DA2 - EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA1ECFF0D9CE5FE0C93D7FF5E8EA0FF4D4C - 4CFE494747FF484646FE494747FF484646FE494747FF464444F30504044F0000 - 001B1F1E1E010000000000000000000000000000000000000000000000000000 - 00006969690A484646FE494747FF494747FF4D4C4CFF7A989EFF0F92D5FF0D9A - E2FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF1478ABFF302F2FFF454343FF484646FF494747FF494747FF3E5866FF454B - 4FFF494747FF494747FF484646FF3C3A3AFF1B6185FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EFFF0EA1ECFF0D9BE4FF0C92D7FF628D9CFF4C4B - 4BFF494747FF494747FF494747FF494747FF494747FF494747FF201F1F940000 - 002F050505070000000000000000000000000000000000000000000000000000 - 000069696907484646F0494747FF484646FE4C4B4BFF7C9295FE1493D4FF0D9A - E1FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EEFE10A1EBFF25485BFF434141FE504F4FFF525151FE535151FF535151FE5351 - 51FF525050FE504E4EFF4B4949FF333638FE118ECDFF0DA2EEFE0EA3EFFF0DA2 - EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA0EBFF0D9BE3FE0E92D6FF678892FF4B4A - 4AFE494747FF484646FE494747FF484646FE494747FF484646FE3E3C3CDE0202 - 0246000000152928280100000000000000000000000000000000000000000000 - 000069696904484646DB494747FF494747FF4A4949FF768586FF2499D2FF0D98 - E0FF0E9FE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF11A4EFFF1BA7EFFF22AA - F0FF26ACF0FF2992C7FF434243FF565555FF5B5959FF5B5959FF5B5959FF5B59 - 59FF5B5959FF5B5959FF545353FF395A6BFF23A9EFFF1CA8EFFF13A4EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0EAFF0D9AE2FF1694D3FF697E84FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF484646FE1514 - 147A000000270B0B0B0500000000000000000000000000000000000000000000 - 0000000000003A3838BC494747FF484646FE494747FF697373FE3CA1CFFF0D97 - DDFF0D9EE8FE0EA2EDFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF13A5EFFE23ABF0FF2DAEF0FE2EAFF1FF2DAF - F0FE2EAFF1FF2EAFF1FF3A667DFE535151FF605E5EFE615F5FFF615F5FFE615F - 5FFF615F5FFE605E5EFF535151FF3586AFFE2EAFF1FF2DAFF0FE2DAFF0FF25AB - F0FE15A5EFFF0EA3EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0D9FE9FF0D98DFFE2496CDFF667172FF4947 - 47FE494747FF484646FE494747FF484646FE494747FF484646FE494747FF3533 - 33C60000003C0000001000000000000000000000000000000000000000000000 - 00000000000034323291494747FF494747FF494747FF5C6161FF58A5C4FF0C95 - DAFF0D9DE6FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0FA3EFFF21AAF0FF34B1F1FF36B2F2FF36B2F1FF36B2F2FF36B2 - F1FF36B2F2FF36B2F2FF38A1D8FF4D5255FF616060FF676565FF676565FF6765 - 65FF676565FF636161FF4F5559FF36ADEAFF36B2F2FF36B2F1FF36B2F2FF36B2 - F1FF35B1F1FF25ABF0FF10A3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA1EDFF0D9EE7FF0D96DDFF3C98C2FF5C6060FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4745 - 45FA0C0B0B610000002100000003000000000000000000000000000000000000 - 0000000000002120205C494747FF484646FE494747FF525353FE73A1B0FF0D92 - D6FF0D9BE3FE0EA0EBFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0FA3EFFF2DAFF0FE3DB5F1FF3DB5F1FE3DB5F2FF3DB5F1FE3DB5F2FF3DB5 - F1FE3DB5F2FF3DB5F2FF3DB5F1FE487D98FF636161FE6C6B6BFF6D6B6BFE6D6B - 6BFF6D6B6BFE646363FF4A7991FF3DB5F1FE3DB5F2FF3DB5F1FE3DB5F2FF3DB5 - F1FE3DB5F2FF3DB5F1FE32B0F1FF12A4EFFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA2EEFF0DA1ECFE0D9CE5FF0C94D9FE5894ACFF515252FF4846 - 46FE494747FF484646FE494747FF484646FE494747FF484646FE494747FF4947 - 47FF2A2929AD000000350000000B000000000000000000000000000000000000 - 0000000000000E0D0D22484646F7494747FF494747FF4B4A4AFF788D8FFF2298 - D2FF0D98E0FF0D9FE9FF0EA2EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0FA3 - EFFF32B0F1FF46B8F2FF46B8F3FF46B8F2FF46B8F3FF46B8F2FF46B8F3FF46B8 - F2FF46B8F3FF46B8F3FF46B8F2FF48B1E7FF697075FF737272FF737272FF7372 - 72FF727070FF636464FF4AA2CFFF46B8F2FF46B8F3FF46B8F2FF46B8F3FF46B8 - F2FF46B8F3FF46B8F2FF46B8F3FF3AB3F1FF10A4EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA2EEFF0EA0EAFF0D99E1FF1092D4FF6E868BFF4B4A4AFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF434141ED050505500000001A000000010000000000000000000000000000 - 00000000000002010101424141D1484646FE494747FF494747FE646C6CFF4EA3 - C8FF0C95DBFE0D9DE6FF0DA1ECFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE27AC - F0FF4EBBF3FF4FBBF3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBB - F3FE4FBBF3FF4FBBF3FF4FBBF3FE50B9F0FF737D82FE7A7979FF7A7979FE7A79 - 79FF757474FE61737DFF4FB9F0FF4FBBF3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBB - F3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBBF3FE31B0F1FF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA1EDFF0D9EE7FE0C96DDFF359AC9FE616868FF494747FF4846 - 46FE494747FF484646FE494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE1F1E1E900000002E000000070000000000000000000000000000 - 000000000000000000002A29297C494747FF494747FF494747FF525353FF79A0 - AAFF0F92D5FF0D9AE2FF0E9FEAFF0EA2EEFF0EA3EFFF0EA3EFFF11A4EFFF51BC - F3FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF - F4FF59BFF4FF59BFF4FF59BFF4FF61ADD4FF807E7EFF818080FF818080FF807F - 7FFF777676FF6098B5FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF - F4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF55BEF3FF18A7EFFF0EA3EFFF0EA3 - EFFF0EA2EEFF0EA0EBFF0D9BE4FF0D93D7FF6094A8FF505151FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF3D3B3BDD01010143000000140000000000000000000000000000 - 0000000000000000000012111123484646F9494747FF494747FF4A4949FF6F7A - 7BFF3EA1CFFF0C96DCFF0D9DE7FF0EA1ECFF0EA2EEFF0EA3EFFF26ACF0FF61C2 - F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2 - F4FF62C2F4FF62C2F4FF62C2F4FF769EB4FF888787FF888787FF888787FF8685 - 85FF787A7BFF63BAE7FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2 - F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF33B1F1FF0EA3EFFF0EA2 - EEFF0EA1EDFF0D9EE8FF0D97DEFF2797CDFF697779FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF484646FD15141477000000260000000500000000000000010000 - 00000000000000000000010101013C3A3AAF494747FF484646FE494747FF5456 - 56FF76A2AFFE1293D5FF0D99E1FE0D9FE9FF0DA1EDFE0EA2EEFF3AB3F1FE6BC6 - F5FF6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6 - F5FE6BC6F5FF6BC6F5FF6CC4F1FE8A959BFF8F8E8EFE8F8E8EFF8F8E8EFE8A88 - 88FF7793A2FE6BC6F4FF6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6 - F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF49B9F2FF0DA2EEFE0EA2 - EEFF0DA0EAFE0D9BE3FF0D92D7FE5F96ABFF545656FE494747FF4A4848FF4C4B - 4BFE4C4C4CFF4C4C4CFE4C4C4CFF4C4C4CFE4C4C4CFF4C4B4BFE4B4A4AFF4947 - 47FF484646FE494747FF323131C30000003B0000000F00000000000000010000 - 00000000000000000000000000002524243E484646FB494747FF494747FF4A49 - 49FF6C7777FF4AA3CAFF0C94DAFF0D9CE5FF0EA0EBFF0EA2EEFF43B7F2FF75CB - F6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF86A2B1FF919E - A6FF929FA6FF929FA6FF929EA4FF979696FF979696FF979696FF969595FF8D8C - 8CFF79B4D2FF75CBF6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF75CBF6FF75CA - F6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF75CBF6FF53BDF3FF0EA2EEFF0EA1 - ECFF0D9DE6FF0C96DCFF3299CAFF677274FF4A4949FF4A4848FF53656DFF6C8D - 9BFF70929FFF70929FFF70929FFF70929FFF70929FFF6F919EFF697B82FF4F4F - 4FFF494747FF494747FF474545F80B0B0B5F0000002000000002000000010000 - 000000000000000000000000000000000000484646B8484646FE494747FF4947 - 47FF515151FE7C979CFF2198D2FE0C97DEFF0D9DE7FE0EA1ECFF3BB3F1FE7FCE - F6FF7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE92A1AAFF9E9D - 9DFE9F9E9EFF9F9E9EFF9E9D9DFE9F9E9EFF9E9D9DFE9F9E9EFF9C9B9BFE8E97 - 9BFF80CBF2FE7FCEF6FF7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE7FCEF6FF7FCE - F6FE7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE7FCEF6FF4CBAF2FF0DA1ECFE0D9E - E8FF0D98E0FE1693D3FF6C8F99FE505050FF494747FE4A4949FF5A8CA1FF7FD0 - F6FE80D1F7FF7FD0F6FE80D1F7FF7FD0F6FE80D1F7FF7FD0F6FE82ADC0FF5456 - 56FF484646FE494747FF484646FE282727A9000000340000000A000000010000 - 000000000000000000000000000000000000748A8A33484646F7494747FF4947 - 47FF494747FF5C6060FF71A5B7FF1294D5FF0D99E0FF0D9EE8FF1EA7EDFF86D0 - F6FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF9AA9B0FFA5A4 - A4FFA6A5A5FFA6A5A5FFA6A5A5FFA6A5A5FFA6A5A5FFA5A4A4FF9F9F9FFF90B1 - C3FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2 - F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF88D1F7FF2FAEEFFF0D9FE9FF0D9A - E2FF0E93D6FF5A9AB4FF5B5F5FFF494747FF494747FF4A4848FF566F79FF78CB - F1FF80D0F6FF8BB5C4FF758C92FF697C82FF687B81FF687B81FF606B6EFF4D4D - 4DFF494747FF494747FF494747FF424141EB0404044D00000018000000010000 - 00000000000000000000000000000000000000000000626F6F91494747FF4947 - 47FF484646FE4B4A4AFF687272FE5FA7C3FF0D92D7FE0D99E1FF0D9EE8FE65C3 - F3FF92D5F7FF92D5F7FE92D5F8FF92D5F7FE92D5F8FF92D5F7FEA0ADB4FFA8A7 - A7FEA8A8A8FFA8A8A8FFA8A7A7FEA8A8A8FFA8A7A7FEA8A7A7FFA1A1A2FE94CC - E9FF92D5F7FE92D5F8FF92D5F8FF92D5F7FE92D5F8FF92D5F7FE92D5F8FF92D5 - F7FE92D5F8FF92D5F7FE92D5F8FF92D5F7FE77CAF4FF11A0E9FF0D9AE3FE0C93 - D8FF479CC1FE656F6FFF4B4949FE494747FF484646FE494747FF4E4D4DFF618D - 9FFE7DCFF5FF82CCEEFE7A8C91FF535454FE4B4949FF4A4949FE4A4848FF4947 - 47FF484646FE494747FF484646FE484646FE1D1C1C8B00000027000000040000 - 00000000000000000000000000000000000000000000ABE2E20D4E4F4FDA4947 - 47FF494747FF494747FF4D4C4CFF707D7EFF52A5C8FF0D93D7FF0D99E1FF1FA5 - EAFF8DD2F6FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FFA3ACB1FFA5A4 - A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA2B0B8FF9DD9 - F7FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9 - F8FF9DD9F8FF9DD9F8FF9DD9F8FF97D6F7FF2CABEBFF0D9AE3FF0C94D9FF3B9A - C6FF6C7A7BFF4C4C4CFF494747FF494747FF494747FF494747FF494747FF5152 - 52FF66A3BDFF7FD0F6FF84C4E2FF6F7A7CFF4E4D4DFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF383737CF000000360000000A0000 - 000000000000000000000000000000000000000000000000000092BABA3D4846 - 46F6484646FE494747FF494747FE4F4F4FFF748384FE52A5C9FF0D92D6FE0D99 - E0FF31ACEAFF9DD8F7FEA6DCF8FFA6DDF8FEA6DDF9FFA6DDF8FEA8C9D9FFA8C6 - D5FEA8C6D5FFA8C6D5FFA8C6D5FEA8C6D5FFA8C6D5FEA8C6D5FFA7D1E7FEA6DD - F9FFA6DDF8FEA6DDF9FFA6DDF9FFA6DDF8FEA6DDF9FFA6DDF8FEA6DDF9FFA6DD - F8FEA6DDF9FFA6DCF8FEA2DAF7FF45B4EDFE0D99E1FF0C93D8FF3C9BC7FE6D7F - 81FF4E4E4EFE494747FF484646FE494747FF484646FE494747FF494747FF4948 - 48FE555C5EFF6EB8D8FE80D0F6FF86B8CEFE636A6AFF4B4A4AFE494747FF4947 - 47FF484646FE494747FF484646FE494747FF474545F90707074B000000100000 - 0000000000000000000000000000000000000000000000000000000000007891 - 916A494747FE494747FF494747FF494747FF4E4E4EFF707D7DFF62A7C2FF1293 - D5FF0C97DDFF2EA9E8FF96D5F5FFB0E0F8FFB0E0F9FFB0E1FAFFB0E1FAFFB0E1 - FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1 - FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E0 - F9FFB0E0F9FFA0D9F6FF3DAFEAFF0D98DFFF0F93D6FF4C9DC1FF6C797AFF4E4D - 4DFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4949FF596A70FF75C5E9FF81D1F7FF84A9B8FF5C6060FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF17161674000000140000 - 000000000000000000000000000000000000000000000000000000000000B9F8 - F80138586992494747FE494747FF494747FF494747FF4D4C4CFF677171FF72A5 - B6FF2398D2FF0C94DAFF1A9FE2FF6FC4EFFFB2E1F8FFB9E3F9FFB9E4FAFFB9E4 - FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4 - FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB6E2 - F8FF7DCAF1FF22A3E4FF0C95DBFF1995D2FF629DB3FF656F6FFF4D4C4CFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4C4B4BFF67828DFF9CD9F6FF9FD9F5FF879AA1FF545555FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF2423238B000000120000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000E88C50638596BA1484646FE494747FF484646FE494747FF4B4949FE5B5F - 5FFF7C9599FF4EA4C9FE1293D4FF0C95DBFE28A5E4FF73C5EFFEB1DFF7FFC2E7 - FAFEC3E7FAFFC3E7FAFFC2E7FAFEC3E7FBFFC2E8FAFEC3E8FBFFC2E8FAFEC3E8 - FBFFC2E7FAFEC3E7FBFFC3E7FBFFC2E7FAFEC3E7FAFFB6E2F8FE7FCAF1FF32A9 - E6FE0D96DDFF0F93D5FE3F9DC8FF739198FE595E5EFF4A4949FF494747FE4947 - 47FF484646FE494747FF484646FE494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FE4F4F4FFF7B9EACFEADE1F9FFACD9EEFE727B7CFF4C4C - 4CFF484646FE494747FF484646FE494747FF484646FE252424890000000D0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000E88C60638596A9C494747FD494747FF494747FF494747FF4947 - 47FF505050FF6A7475FF77A1ACFF42A2CDFF1293D5FF0C95DAFF179CE0FF42B0 - E8FF75C6F0FFA0D9F5FFBCE4F8FFC5E8FAFFC9E9FAFFCBEAFAFFCBEAFAFFC9E9 - FAFFC6E8FAFFBFE5F9FFA6DBF6FF7CC9F0FF4BB4EAFF1C9FE1FF0D95DBFF0F93 - D5FF379CCCFF6B9BABFF687272FF505050FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4949FF4D4D - 4DFF4D4C4CFF494848FF494747FF545758FF9CC9DDFFB6E4FAFF95ACB4FF5355 - 55FF494747FF494747FF494747FF494747FF494747FF1C1B1B6E000000070000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000E88C50338596B7D484646FA494747FF484646FE4947 - 47FF494747FF4A4949FE535555FF6D7878FE789EA7FF54A4C6FE279AD2FF0E92 - D5FE0C94DAFF0D96DDFF129ADFFE22A2E3FF2EA7E5FE35AAE6FF36ABE6FE30A8 - E5FF24A3E3FE149BE0FF0D97DDFF0C94DAFE0C92D6FF2198D2FE4AA0C6FF7099 - A6FE6B7677FF535555FE4A4949FF494747FE494747FF494747FF484646FE4947 - 47FF484646FE494747FF484646FE494747FF484646FE4A4848FF64747AFF8DA5 - AFFE7F8F94FF525353FE494747FF4B4A4AFE84A1ACFFBFE7FAFEA5BEC9FF585B - 5BFF484646FE494747FF484646FE494747FF484646FE0F0E0E38000000020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000296A8B4D47494BE7494747FF4947 - 47FF494747FF494747FF494747FF4A4848FF515252FF616868FF76888AFF769F - ABFF5CA4C0FF43A1CCFF2C9BD0FF1C96D3FF1594D4FF1394D4FF1394D4FF1594 - D4FF1A96D3FF299AD1FF3E9FCCFF56A1BFFF6F9CAAFF748689FF616767FF5151 - 51FF4A4848FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF7B939DFFC7EA - FBFFB7D2DFFF676E6EFF4C4C4CFF505151FF98B7C3FFC7EAFBFFA5BCC5FF5759 - 59FF494747FF494747FF494747FF494747FF3F3D3DCF0101010D000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000097CDD11E5C6666AE4947 - 47FE494747FF484646FE494747FF484646FE494747FF494747FE4B4A4AFF5151 - 51FE5A5F5FFF666F6FFF728080FE798D8FFF799397FE77959CFF77959CFE7792 - 97FF788C8EFE717F80FF666F6FFF5A5E5EFE515151FF4B4A4AFE494747FF4947 - 47FE494747FF484646FE494747FF484646FE494747FF494747FF484646FE4947 - 47FF484646FE494747FF484646FE494747FF484646FE494747FF606B6FFFC7E9 - F8FECEECFAFFA4B9BFFE778588FF8CA0A6FEC9E9F8FFCFEDFBFE8B989CFF5050 - 50FF484646FE494747FF484646FE484646FD1F1E1E6100000002000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000008CB1B1015D67 - 674D494747D0494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4A4848FF4B4949FF4B4B4BFF4C4C4CFF4C4C4CFF4C4B - 4BFF4B4949FF4A4848FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4D4D4DFF8498 - 9FFFCFEAF7FFD7F0FCFFD6EFFBFFD7F0FCFFD4EEFAFFA7BAC1FF5D6262FF4A48 - 48FF494747FF494747FF494747FF393838B20302020600000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000494747084846465F494747D0484646FE494747FF484646FE494747FF4846 - 46FE494747FF494747FF484646FE494747FF484646FE494747FF484646FE4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4846 - 46FE494747FF484646FE494747FF484646FE494747FF494747FF484646FE4947 - 47FF484646FE494747FF484646FE494747FF484646FE494747FF494747FF4E4E - 4EFE6A7477FF92A2A8FE9EADB2FF98A9AEFE7C888AFF5A5E5EFE4B4A4AFF4947 - 47FF484646FE494747FF434141D00C0C0C160000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000004947473E4947479D494747E6494747FE4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4848FF4C4B4BFF4E4D4DFF4D4D4DFF4B4A4AFF494747FF494747FF4947 - 47FF484646FC3D3C3CA618181811000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000004947470C4947473F4947 - 477E494747B6494747E3494747F8494747FB494747FD494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FD494747F24846 - 46B2444242424442420200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000D1D0D00DD1D1D127D1D0D036D1D1D13FD1D0D03FD1D1 - D13FD1D0D03FD1D1D13FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D0 - D03FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D1D13FD1D0D03FD1D1 - D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D1D13FD1D0 - D03FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D0D030D1D1D10A0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000000000000FFFF - FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF00 - 0000FFFFFFFFFFFFFFFFFF000000FFFFFFC007FFFFFFFF000000FFFFFC00007F - FFFFFF000000FFFFF000000FFFFFFF000000FFFF80000003FFFFFF000000FFFF - 00000000FFFFFF000000FFFC000000007FFFFF000000FFF8000000003FFFFF00 - 0000FFF0000000000FFFFF000000FFE00000000007FFFF000000FFC000000000 - 03FFFF000000FF800000000001FFFF000000FF000000000000FFFF000000FE00 - 0000000000FFFF000000FC0000000000007FFF000000FC0000000000003FFF00 - 0000F80000000000003FFF000000F80000000000001FFF000000F00000000000 - 001FFF000000F00000000000000FFF000000E00000000000000FFF000000E000 - 000000000007FF000000C000000000000007FF000000C000000000000007FF00 - 0000C000000000000003FF000000C000000000000003FF000000C00000000000 - 0001FF0000008000000000000001FF0000008000000000000000FF0000008000 - 000000000000FF0000008000000000000000FF00000080000000000000007F00 - 000080000000000000007F00000080000000000000003F000000800000000000 - 00003F00000080000000000000001F00000080000000000000001F000000C000 - 0000000000001F000000C0000000000000000F000000C0000000000000000F00 - 0000C00000000000000007000000C00000000000000007000000E00000000000 - 000007000000E00000000000000002000000E00000000000000002000000F000 - 00000000000000000000F80000000000000000000000F8000000000000000000 - 0000FC0000000000000000000000FC0000000000000000000000FE0000000000 - 000000000000FF0000000000000000000000FF0000000000000000000000FF80 - 00000000000000000000FFC000000000000000000000FFE00000000000000000 - 0000FFF800000000000001000000FFFC00000000000001000000FFFE00000000 - 000003000000FFFF80000000000007000000FFFFF000000000000F000000FFFF - FC00000000001F000000FFFFFFE000000000FF000000FFFFFFFFFFFFFFFFFF00 - 0000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF - FFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF0000002800 - 0000400000008000000001002000000000000042000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000020000 - 00050000000A0000001000000015000000190000001B0000001B0000001A0000 - 0017000000120000000C00000007000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000020000000900000015000000230000 - 00310000003C00000044000000490000004C0000004D0000004E0000004D0000 - 004B000000470000004000000036000000280000001A0000000C000000040000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000121111040000001000000023000000380202024A131212772322 - 22A1323030C13A3939D9444242E9474545F4474545F4474545F4464444F0403E - 3EE1343333CC292828B01A19198B0707075F0000004C0000003E0000002A0000 - 0015090808072D2C2C0100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001616 - 160300000010000000280101014218171780323030C3464444F5494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF484646FD3A3939D6201F1F9B0605055C0000 - 0047000000300000001709080806000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000040404090000 - 00220303034422212198414040E9494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF474545F72D2B - 2BB70A0A0A68000000460000002B0000000F1B1A1A0200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000475F5F0200000012000000331D1C - 1C88424040EA494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4B4A4AFF4E4E4EFF515252FF545656FF555858FF545656FF525353FF4E4E - 4EFF4B4A4AFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF474545F92A2929B10404045A0000003D0000001C232F2F05000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000272F2F040000001B0A0A0A51383737CE4947 - 47FF494747FF494747FF494747FF494747FF4A4848FF505151FF5F6565FF6A7E - 82FF5F8B9BFF5594AEFF4D99BBFF4B9DC2FF4A9EC5FF499DC3FF4B99BCFF5093 - B0FF598A9EFF667E85FF606767FF515252FF4A4949FF494747FF494747FF4947 - 47FF494747FF494747FF424040EB1616168200000048000000260B0F0F090000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000002F2F2F050000002018181876454343F2494747FF4947 - 47FF494747FF494747FF4C4B4BFF5A5E5EFF6B8389FF5497B3FF3D9FCEFF289D - D8FF2EA2DEFF32A6E1FF35A8E3FF36A9E4FF37A9E4FF37A9E4FF35A8E3FF34A7 - E2FF2FA3DFFF279DDAFF339DD0FF4A95B7FF62838EFF5C6161FF4C4C4CFF4947 - 47FF494747FF494747FF494747FF484646FE292828AD0101014F0000002C0000 - 000B000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000002F2F2F040000002024232392484646FD494747FF494747FF4947 - 47FF4A4949FF5A5E5EFF698A94FF479EC5FF289DD9FF2EA4E0FF33A9E5FF37AC - E8FF3AAFEBFF3CB1ECFF3DB2EDFF3EB2EEFF3FB3EEFF3FB3EEFF3EB2EDFF3DB1 - EDFF3CB0EBFF39AEE9FF36AAE6FF31A6E1FF269DDAFF399AC9FF5C899AFF5C61 - 62FF4B4A4AFF494747FF494747FF494747FF494747FF363434CB030303560000 - 002E00080C0B0000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002F3F3F030000001D27262698494747FF494747FF494747FF494747FF5051 - 51FF6B7E81FF4C9CC0FF269DD9FF2CA4E2FF32AAE7FF36AEEBFF39B1EEFF3AB2 - EFFF3BB3F0FF3CB4F1FF3DB5F1FF3DB5F1FF3EB5F1FF3EB5F1FF3EB5F1FF3EB5 - F1FF3EB4F1FF3DB4F0FF3CB2EEFF39B0ECFF36ACE9FF30A7E4FF259EDBFF3998 - C5FF637F87FF525353FF494747FF494747FF494747FF494747FF3A3838D60504 - 04580000002C0B0F0F0800000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000005F7F - 7F010000001625242490494747FF494747FF494747FF494848FF585B5BFF6892 - A1FF2D9CD3FF27A1DFFF2DA8E7FF31ADECFF34B0EEFF36B1F0FF37B2F1FF38B3 - F1FF38B3F2FF38B3F2FF39B3F2FF39B3F2FF3AB4F2FF3AB4F2FF3AB4F2FF3AB4 - F2FF3BB4F2FF3BB4F2FF3AB4F1FF3AB3F1FF39B2EFFF37AFEDFF32ABE9FF2BA4 - E1FF249BD6FF538FA9FF5B6060FF4A4848FF494747FF494747FF494747FF3837 - 37D30303035100000025232F2F05000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000D1A191970484646FD494747FF494747FF4A4848FF5F6464FF5E9BB3FF229B - D8FF26A3E3FF2BA9EAFF2FADEEFF30AFF0FF31B0F1FF32B0F1FF32B1F1FF33B1 - F1FF33B1F1FF33B1F1FF34B1F1FF34B1F1FF35B1F1FF35B2F1FF35B2F2FF36B2 - F2FF36B2F2FF36B2F2FF37B2F2FF37B2F2FF37B2F1FF36B1F1FF35B0EFFF31AC - EBFF2BA7E5FF229CDBFF4295BBFF60696AFF4A4949FF494747FF494747FF4947 - 47FF333131C4000000480000001B272A2A020000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000171F1F050D0C - 0C43464444F3494747FF494747FF4A4848FF606666FF569DBBFF1D9ADAFF24A3 - E5FF28A9EBFF2AACEEFF2BAEF0FF2CAEF1FF2CAFF1FF2DAFF1FF2DAFF1FF2EAF - F1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FAFF1FF2FB0F1FF30B0F1FF30B0 - F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF32B0F1FF32B0F1FF32B0F1FF31AF - EFFF2FADEDFF29A7E7FF219EDDFF3895C2FF616B6DFF4A4949FF494747FF4947 - 47FF494747FF242323A10000003C0000000F0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000242323010202021A3C3A - 3AD2494747FF494747FF494747FF5B6060FF5B9DB8FF1A99D9FF20A2E5FF24A8 - ECFF26ABEFFF27ACF0FF27ACF1FF27ACF1FF28ACF1FF28ADF1FF28ADF1FF28AD - F1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF2AADF1FF2AAEF1FF2AAEF1FF2BAE - F1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAEF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAF - F0FF2DAEF0FF2BABEDFF26A6E8FF1F9DDDFF3A95BFFF5E6565FF494848FF4947 - 47FF494747FF484646FB101010710000002A0908080500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000004040409242323854947 - 47FF494747FF494747FF545555FF6799AAFF1998D8FF1BA0E4FF1FA6EBFF21A9 - EEFF22AAF0FF22AAF0FF22ABF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF24AB - F0FF24ABF0FF25ABF0FF25ABF0FF25ACF0FF25ACF0FF26ACF0FF26ACF1FF26AC - F1FF26ACF1FF27ACF1FF28AAEDFF4B7185FF3D8BB2FF2CA7E6FF28ADF1FF28AD - F1FF28ADF0FF28ACF0FF27AAEDFF22A5E7FF1B9ADBFF4993B3FF565A5AFF4947 - 47FF494747FF494747FF3D3C3CDE010101470000001500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000010707072B474545F24947 - 47FF494747FF4C4C4CFF708A8FFF2098D3FF179DE1FF1BA4EAFF1CA7EEFF1DA7 - EEFF314855FF4C4A4AFF555353FF555353FF555353FF3484ADFF1FA9F0FF1FA9 - F0FF20A9F0FF20A9F0FF20AAF0FF20AAF0FF21AAF0FF21AAF0FF21AAF0FF22AA - F0FF22AAF0FF22AAF0FF338CB9FF585656FF595757FF57595BFF487287FF3591 - C0FF25A9ECFF24ABF0FF24AAEFFF22A8ECFF1EA2E5FF1897D8FF5C899AFF4E4E - 4EFF494747FF494747FF494747FF201F1F970000002E09080806000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000072E2D2D9E494747FF4947 - 47FF494747FF646B6BFF409EC9FF1499DDFF16A1E8FF18A5EEFF18A7EFFF19A7 - F0FF1E84B8FF3C3A3AFF4F4D4DFF525050FF525050FF4D565CFF1DA2E5FF1BA8 - F0FF1BA8F0FF1BA8F0FF1BA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1DA8 - F0FF1DA8F0FF1DA8F0FF456577FF555353FF555353FF555353FF565454FF5654 - 54FF525A5FFF407794FF2B95CBFF1FA8EEFF1DA5EAFF199EE2FF2396CEFF6371 - 74FF4A4848FF494747FF494747FF434242EE0303034900000013000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000007070725474545F5494747FF4947 - 47FF505151FF6998A9FF1094D7FF129EE5FF14A3ECFF15A5EFFF15A5EFFF16A6 - EFFF16A6EFFF264D61FF444242FF4E4D4DFF4F4D4DFF4F4D4DFF357394FF17A6 - F0FF17A6F0FF17A6F0FF18A6F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF19A7 - F0FF19A7F0FF2197D4FF504E4EFF525050FF525050FF525050FF525151FF5351 - 51FF535151FF525050FF454343FF2282B3FF1BA6EDFF18A2E8FF1498DCFF4892 - B3FF525454FF494747FF494747FF494747FF1F1E1E92000000261B1A1A030000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000327262684494747FF494747FF4947 - 47FF687272FF329CCEFF0F99DFFF11A0E9FF12A3EDFF12A4EFFF12A4EFFF12A4 - EFFF13A4EFFF168DCAFF323233FF494747FF4D4B4BFF4D4B4BFF4B4C4EFF1C97 - D6FF14A5EFFF14A5EFFF15A5EFFF15A5EFFF15A5EFFF15A5EFFF15A5EFFF16A6 - EFFF16A6EFFF347090FF4E4D4DFF4F4D4DFF4F4D4DFF4C4A4AFF494747FF4E4C - 4CFF504E4EFF4D4B4BFF343F46FF18A3EBFF17A6EFFF16A3ECFF139CE3FF1794 - D3FF65787CFF4A4848FF494747FF494747FF3D3C3CDD0000003B0000000B0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000009424040DC494747FF494747FF4E4E - 4EFF6C97A5FF0D92D7FF0E9CE5FF0FA1ECFF0FA3EEFF10A3EFFF10A3EFFF10A4 - EFFF10A4EFFF10A4EFFF1D5673FF3D3B3BFF4A4848FF4B4949FF4B4949FF3764 - 7BFF11A4EFFF11A4EFFF11A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4 - EFFF14A0E8FF464E52FF4C4A4AFF4D4B4BFF4B4949FF3B3939FF2C2B2BFF3534 - 34FF413F3FFF3F3E3EFF216385FF15A5EFFF14A5EFFF14A4EDFF119FE7FF0E96 - DBFF4B90AFFF505151FF494747FF494747FF494747FF100F0F690000001C2927 - 2701000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000013121239494747FF494747FF494747FF5D62 - 62FF459FC7FF0D97DDFF0D9EE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF1094D8FF2C3033FF454343FF4A4848FF4A4848FF4947 - 47FF1D8AC2FF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF10A3EFFF10A3EFFF10A3 - EFFF247FAEFF4A4848FF4A4848FF4A4848FF454343FF27485AFF14709FFF1A3A - 4BFF222121FF242425FF1492D2FF12A4EFFF11A4EFFF11A3EEFF0FA0EAFF0E99 - E1FF2195CEFF616969FF494747FF494747FF494747FF2E2D2DB8000000330908 - 0807000000000000000000000000000000000000000000000000000000000000 - 000000000000000000003F3F3F012726267F494747FF494747FF4A4848FF7383 - 85FF1A96D3FF0D9AE2FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF186085FF383737FF484646FF494747FF4947 - 47FF3D5663FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF395A6CFF4A4848FF4A4848FF494747FF3C3A3AFF1775A5FF0FA3EFFF0FA3 - EFFF1189C6FF136792FF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EEFF0EA1ECFF0D9C - E5FF0C92D7FF618490FF4A4949FF494747FF494747FF474545F7060606510000 - 0015000000000000000000000000000000000000000000000000000000000000 - 000000000000000000003F3F3F02383737B9494747FF494747FF4D4D4DFF6B98 - A7FF0C93D8FF0D9CE6FF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0E9CE5FF27343BFF424040FF484646FF4947 - 47FF484646FF247DABFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1692 - D2FF474545FF494747FF494747FF464444FF2E3539FF0E9DE6FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9E - E8FF0C96DCFF4A91B1FF4F4F4FFF494747FF494747FF494747FF2422229D0000 - 002B121111040000000000000000000000000000000000000000000000000000 - 000000000000000000003F3F3F05474545E6494747FF494747FF545656FF569F - BDFF0C96DCFF0D9EE8FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF156E9CFF353434FF474545FF4947 - 47FF494747FF424E54FF109DE5FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF2B6D - 90FF484646FF494747FF484646FF403E3EFF1E5978FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0E9F - EAFF0D98DFFF3397C6FF585B5BFF494747FF494747FF494747FF413F3FE70101 - 01420000000F0000000000000000000000000000000000000000000000000000 - 000000000000000000004B4A4A14494747FF494747FF494747FF5D6262FF43A0 - CAFF0D97DFFF0E9FE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA0EBFF233B47FF403E3EFF4846 - 46FF494747FF484646FF2C7093FF0EA3EFFF0EA3EFFF0EA3EFFF0EA0EBFF404C - 53FF494747FF494747FF474545FF363535FF1287C2FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0 - EBFF0D9AE2FF1F96D1FF626A6AFF494747FF494747FF494747FF494747FF1918 - 1882000000231B1A1A0200000000000000000000000000000000000000000000 - 000000000000000000005150502F494747FF494747FF494747FF676F6FFF319E - D1FF0D99E1FF0EA0EAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF137BB1FF323131FF4644 - 44FF494747FF494747FF46484AFF1596D8FF0EA3EFFF0EA3EFFF1D84B9FF4846 - 46FF494747FF494747FF444242FF27404DFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - ECFF0D9BE4FF1092D5FF68787AFF494747FF494747FF494747FF494747FF3836 - 36CE0000003A0404040A00000000000000000000000000000000000000000000 - 0000000000000000000051515141494747FF494747FF494747FF6E7A7AFF259A - D3FF0D9AE2FF0EA0EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1F4559FF3E3C - 3CFF484646FF494747FF494747FF33647DFF0EA3EFFF0EA3EFFF31627BFF4846 - 46FF494747FF484646FF3C3B3BFF196B95FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0D9CE5FF0C92D6FF678086FF494747FF494747FF494747FF494747FF4846 - 46FE0E0D0D650000001B29272701000000000000000000000000000000000000 - 0000000000000000000052515143494747FF494747FF494747FF737F7FFF1F98 - D3FF0D9AE2FF0EA0EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1189C6FF2F2E - 2FFF454343FF494747FF494747FF484646FF1B8BC5FF0F9FE8FF434649FF4947 - 47FF494747FF464545FF313335FF0F98DEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0D9CE5FF0C92D6FF65828BFF494848FF494747FF494747FF494747FF4947 - 47FF2D2B2BB50000003209080807000000000000000000000000000000000000 - 0000000000000000000052515142494747FF494747FF494747FF727F7FFF1F98 - D3FF0D9AE2FF0EA0EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1C52 - 6EFF3B3A3AFF484646FF494747FF494747FF3C5867FF1F85BAFF484646FF4947 - 47FF494747FF424040FF215069FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0D9CE5FF0C92D6FF66838BFF494848FF494747FF494747FF494747FF4947 - 47FF464444F50505054F00000015000000000000000000000000000000000000 - 0000000000000000000051515140494747FF494747FF494747FF6E7979FF289B - D3FF0D99E1FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0F93 - D7FF2B2F32FF444242FF494747FF494747FF494747FF41525BFF494747FF4947 - 47FF484646FF383737FF147DB3FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0D9CE5FF0C92D6FF698085FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF2221219A0000002A121111040000000000000000000000000000 - 000000000000000000005151512C494747FF494747FF494747FF666E6EFF369F - D0FF0D99E0FF0EA0EAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF10A3EFFF16A6 - EFFF256789FF464444FF555353FF575555FF585656FF575555FF575555FF5553 - 53FF4F4E4EFF334148FF11A2ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - ECFF0D9BE3FF1293D4FF6A7779FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF403E3EE5000000400000000F0000000000000000000000000000 - 000000000000000000004C4C4C10494747FF494747FF494747FF5C6161FF49A2 - C9FF0D97DEFF0D9FE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF17A6EFFF23ABF0FF29ADF0FF2AAD - F1FF2AA6E6FF404B50FF585757FF5E5C5CFF5E5C5CFF5E5C5CFF5E5C5CFF5E5C - 5CFF555353FF367494FF2AADF1FF25ABF0FF1BA7EFFF0FA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0 - EBFF0D99E1FF2497D0FF626969FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF1716167D000000221B1A1A0200000000000000000000 - 0000000000000000000000000000484646E7494747FF494747FF535555FF5EA1 - BCFF0C95DBFF0D9EE7FF0EA2EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF16A6EFFF2BAEF1FF32B0F1FF32B0F1FF32B0F1FF32B0 - F1FF32B0F1FF3982A8FF545353FF636161FF646262FF646262FF646262FF6361 - 61FF525252FF34A1D8FF32B0F1FF32B0F1FF32B0F1FF2EAFF1FF1BA8F0FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9F - E9FF0D98DFFF3A98C4FF575A5AFF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF363535CB000000390404040A00000000000000000000 - 00000000000000000000000000003A3939B7494747FF494747FF4D4C4CFF759A - A5FF0C92D6FF0D9CE5FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF22AAF0FF3AB4F1FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4 - F2FF3BB4F2FF3BB2EFFF4E6069FF666565FF6B6969FF6B6969FF6B6969FF6665 - 65FF4D6A79FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF2BAE - F0FF0FA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0D9E - E7FF0C95DBFF5393AEFF4F4F4FFF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF484646FD0C0C0C620000001A00000001000000000000 - 000000000000000000000000000028272778494747FF494747FF494848FF7381 - 81FF259AD3FF0D99E1FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF26ACF0FF44B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7 - F2FF45B7F2FF45B7F2FF4C9BC4FF6D6C6CFF727171FF727171FF727070FF6766 - 66FF4B93B9FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7 - F2FF33B1F1FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0D9B - E4FF0E92D6FF6A858CFF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF2B2A2AB10000003000000006000000000000 - 000000000000000000000000000016151531494747FF494747FF494747FF5B5F - 5FFF53A3C5FF0C96DCFF0D9EE8FF0EA2EDFF0EA3EFFF0EA3EFFF0EA3EFFF1CA8 - EFFF4DBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBB - F3FF4EBBF3FF4EBBF3FF53B1E1FF787777FF7A7878FF7A7878FF787676FF666B - 6EFF4FB7ECFF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBB - F3FF4EBBF3FF2BAEF0FF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9FEAFF0D98 - E0FF2E99CBFF606667FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF464444F30504044D00000014000000000000 - 000000000000000000000000000000000000444242DB494747FF494747FF4D4D - 4DFF7899A1FF1093D5FF0D9BE4FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF46B8 - F2FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF - F4FF59BFF4FF59BFF4FF6A9FBBFF818080FF828080FF818080FF7C7B7BFF648C - A1FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF - F4FF59BFF4FF54BDF3FF12A4EFFF0EA3EFFF0EA2EEFF0EA1ECFF0D9DE6FF0C94 - D9FF5993AAFF4F4F4FFF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF2120209600000029000000030000 - 0000000000000000000000000000000000002D2C2C79494747FF494747FF4947 - 47FF656E6EFF43A2CCFF0C97DDFF0D9EE8FF0EA1EDFF0EA2EEFF15A5EFFF63C3 - F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3 - F4FF64C3F4FF64C3F4FF80939EFF8A8888FF8A8888FF898888FF7E7D7DFF67B1 - D7FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3 - F4FF64C3F4FF64C3F4FF2AADF0FF0EA3EFFF0EA2EEFF0D9FEAFF0D99E1FF2096 - D0FF697577FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF3F3D3DE10000003F0000000E0000 - 0000000000010000000000000000000000000D0D0D15484646F6494747FF4947 - 47FF4F4F4FFF789BA4FF1293D5FF0D9AE3FF0EA0EBFF0EA2EEFF23ABF0FF6EC8 - F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF70C3EDFF74BDE2FF75BE - E3FF75BEE3FF77BADCFF919091FF929191FF929191FF8F8E8EFF7E8C94FF6EC8 - F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8 - F5FF6EC8F5FF6EC8F5FF3CB4F2FF0EA2EEFF0EA1ECFF0D9CE5FF0C93D8FF5B95 - ACFF515252FF494747FF4D4D4DFF535454FF545555FF545555FF545555FF5455 - 55FF535555FF4F5050FF4A4848FF494747FF494747FF16151579000000210000 - 000200000001000000000000000000000000000000004846468F494747FF4947 - 47FF494747FF616767FF56A5C6FF0C95DAFF0D9DE6FF0EA1ECFF23AAF0FF7ACC - F6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF82B5CFFF989797FF9B99 - 99FF9B9999FF9B9999FF9B9999FF9B9999FF9A9999FF949393FF80ADC3FF7ACC - F6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACC - F6FF7ACCF6FF7ACCF6FF3EB5F2FF0EA1EDFF0D9EE8FF0C97DEFF3199CAFF656E - 6EFF494747FF4B4949FF5E8FA5FF7BBBD8FF7CBDD9FF7CBDD9FF7CBDD9FF7CBD - D9FF7CBCD9FF7896A3FF4F4F4FFF494747FF494747FF353333C8000000370000 - 00090000000100000000000000000000000000000000575D5D18484646F24947 - 47FF494747FF4C4B4BFF758889FF2C9BD0FF0D97DEFF0D9EE8FF13A3EDFF80CE - F6FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF8CBBD3FFA1A0A0FFA3A2 - A2FFA3A2A2FFA3A2A2FFA3A2A2FFA3A2A2FFA2A1A1FF979898FF86CAEDFF85D0 - F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0 - F7FF85D0F7FF85D0F7FF2CADEFFF0D9FE9FF0D99E1FF1694D4FF6B8992FF4D4C - 4CFF494747FF4B4949FF609AB3FF80D1F7FF83CAEBFF81B8CDFF79ADC3FF78AC - C2FF78ACC2FF718B95FF4E4E4EFF494747FF494747FF484646FD0B0B0B5E0000 - 0019000000010000000000000000000000000000000000000000748B8B744947 - 47FF494747FF494747FF525353FF789BA4FF1A96D4FF0D99E0FF0D9EE8FF5EC0 - F2FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF96C1D7FFA7A6A6FFA8A8 - A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA6A5A5FF98AEB9FF90D4F7FF90D4 - F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4 - F7FF90D4F7FF7CCCF5FF10A0EAFF0D9AE3FF0E93D6FF6197ABFF545656FF4947 - 47FF494747FF494747FF545C5FFF72BFE2FF80D0F5FF83A1ABFF595D5DFF4F50 - 50FF4F4F4FFF4D4C4CFF494747FF494747FF494747FF494747FF2A2929AD0000 - 002C000000040000000000000000000000000000000000000000B6F3F3045052 - 52CB494747FF494747FF494747FF585B5BFF72A3B2FF1394D5FF0D99E0FF1DA4 - E9FF8FD3F6FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9EC3D6FFA5A4A4FFA5A5 - A5FFA5A5A5FFA5A5A5FFA5A5A5FFA5A5A5FFA4A4A4FF9DC8DEFF9BD8F8FF9BD8 - F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8 - F8FF99D7F7FF36AFEDFF0D9AE3FF0C93D7FF559BB8FF5C6161FF494747FF4947 - 47FF494747FF494747FF4A4848FF596E75FF78CAF0FF82CDF0FF76878BFF4E4E - 4EFF494747FF494747FF494747FF494747FF494747FF494747FF444242EF0101 - 013E0000000B000000000000000000000000000000000000000000000000A0D1 - D127484646F3494747FF494747FF494848FF5C6161FF71A4B4FF1595D5FF0D98 - DFFF33ACEAFF9FD9F7FFA6DCF8FFA6DDF9FFA6DDF9FFA7D1E7FFA8C2D0FFA8C2 - D0FFA8C2D0FFA8C2D0FFA8C2D0FFA8C2D0FFA8C3D0FFA6DCF8FFA6DDF9FFA6DD - F9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DCF9FFA5DB - F8FF53BAEEFF0D9AE1FF0D93D7FF559CBAFF606667FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF4C4B4BFF5F8493FF7DD0F6FF85C6E4FF6B74 - 75FF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF1514 - 146F000000120000000000000000000000000000000000000000000000000000 - 000083A3A355494747FE494747FF494747FF4A4848FF5B5F5FFF76A0ACFF2198 - D2FF0C96DCFF30A9E8FF9CD7F6FFB1E0F9FFB1E1F9FFB1E1FAFFB1E1FAFFB1E1 - FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1 - FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1F9FFB1E0F9FFAADDF7FF4BB5 - ECFF0D98DFFF1294D5FF609BB2FF5E6464FF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4E4E4EFF669DB4FF80D0F7FF85B9 - D1FF606666FF4A4949FF494747FF494747FF494747FF494747FF494747FF2625 - 259D000000160000000000000000000000000000000000000000000000000000 - 00000000000032607879494747FF494747FF494747FF494747FF555757FF7993 - 98FF3FA0CDFF0C93D7FF179DE1FF6DC3EFFFB4E1F8FFBBE4F9FFBBE5FAFFBBE5 - FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5 - FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE4F9FFBAE3F9FF84CDF2FF26A4E4FF0C94 - DAFF2999CFFF6C939EFF575B5BFF494848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF535656FF8DC0D6FFA4DE - F9FF92AEB9FF565959FF494747FF494747FF494747FF494747FF494747FF3130 - 30B1000000140000000000000000000000000000000000000000000000000000 - 0000000000000000000032607887494747FF494747FF494747FF494747FF4E4E - 4EFF6C7778FF6AA4B8FF2499D2FF0C94D9FF1FA0E2FF66C0EDFFA5DBF6FFC5E8 - FAFFC5E8FAFFC5E8FBFFC5E8FBFFC5E9FBFFC5E9FBFFC5E9FBFFC5E8FBFFC5E8 - FBFFC5E8FAFFC5E8FAFFB3E1F8FF76C7F0FF2FA7E5FF0C95DBFF1695D4FF549D - BCFF6D7C7DFF505050FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF5B6568FFA4D5 - ECFFB0E0F7FF7A8688FF4C4B4BFF494747FF494747FF494747FF494747FF302F - 2FAA0000000D0000000000000000000000000000000000000000000000000000 - 000000000000000000000000000032607876494747FE494747FF494747FF4947 - 47FF4A4848FF565959FF76888AFF63A3BCFF2B9CD2FF0C92D7FF0C96DCFF24A2 - E3FF50B6EAFF71C4EFFF88CEF2FF96D4F4FF9DD7F5FF99D5F4FF8CD0F3FF78C7 - F0FF58B9EBFF2FA7E5FF0F98DEFF0C93D8FF1D97D3FF529FBFFF728A8FFF585C - 5CFF4A4949FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF515252FF5A5E5EFF525353FF494747FF4B4949FF7E9B - A6FFBAE6FBFF99B1BAFF515151FF494747FF494747FF494747FF494747FF2423 - 2387000000060000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000002A698950494747F0494747FF4947 - 47FF494747FF494747FF4B4949FF565959FF717E7FFF729DA9FF53A3C5FF2E9D - D2FF1193D4FF0C92D7FF0C94D9FF0C95DAFF0C95DBFF0C95DBFF0C94DAFF0C93 - D8FF0E92D5FF2599D2FF48A0C7FF679AACFF718183FF585B5BFF4B4A4AFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4949FF8EAFBEFFBFE5F7FF839195FF4D4D4DFF4A4848FF768B - 92FFC4E9FBFFA1B8C0FF525353FF494747FF494747FF494747FF494747FF1312 - 1240000000010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000074B4C422575E5EC24947 - 47FF494747FF494747FF494747FF494747FF494848FF4E4E4EFF5A5E5EFF6C77 - 77FF7A8F91FF7399A4FF689DB0FF619FB7FF5E9FB9FF5F9FB7FF659DB1FF6E98 - A5FF788F93FF6E7979FF5B5F5FFF4F4F4FFF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF8198A0FFCDECFCFFB5CDD7FF6B7474FF626A6BFFAECC - D9FFCDECFCFF91A2A7FF4E4E4EFF494747FF494747FF494747FF3E3C3CCA0000 - 0006000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000099C5C5016675 - 7563494747E7494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4848FF4C4B4BFF4F4F4FFF515151FF525353FF515252FF4F4F4FFF4C4C - 4CFF4A4949FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF55595AFFB4D0DCFFD6F0FCFFCEE9F5FFCFEAF7FFD6F0 - FCFFB9D0D9FF626767FF4A4848FF494747FF494747FF484646FA1414143A0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00004947470C49474776494747E4494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494848FF56595AFF87979CFFA3B3B9FFA3B4B9FF8C9A - 9EFF5E6364FF4C4A4AFF494747FF494747FF494747FE2A282867000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000004947470549474752494747AD494747F6494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4A4949FF4D4C4CFF4D4D4DFF4B4A - 4AFF494747FF494747FF494747FF484646E93533335000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000049474709494747434947 - 477C494747AB494747CF494747E9494747FA494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747F1494747C1484646704442420D0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFF8001FFFFFFFFFFFC00003FFFFFFFFFF0000007FFFFFFFFC - 0000003FFFFFFFF80000000FFFFFFFE000000007FFFFFFC000000003FFFFFF80 - 00000001FFFFFF0000000000FFFFFE00000000007FFFFC00000000003FFFFC00 - 000000001FFFF800000000001FFFF000000000000FFFF000000000000FFFE000 - 0000000007FFE0000000000007FFE0000000000003FFC0000000000003FFC000 - 0000000001FFC0000000000001FF80000000000001FF80000000000000FF8000 - 0000000000FF800000000000007F800000000000007F800000000000003F8000 - 00000000003F800000000000003F800000000000001F800000000000001F8000 - 00000000000FC00000000000000FC000000000000007C000000000000007C000 - 000000000007E000000000000003E000000000000002E000000000000000F000 - 000000000000F000000000000000F800000000000000F800000000000000FC00 - 000000000000FE00000000000000FF00000000000000FF80000000000000FFC0 - 000000000000FFE0000000000000FFF0000000000001FFF8000000000003FFFE - 000000000007FFFF80000000000FFFFFF0000000001FFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF2800000030000000600000000100200000000000802500000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000200000008000000110000001A000000210000 - 002400000025000000230000001D000000140000000B00000004000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000A09 - 0901000000090000001B000000310404044B1110106F1B1A1A8C2221219D2322 - 22A1232222A1201F1F98161616830B0B0B640101014700000036000000210000 - 000C050404020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000A0A0A0A0000 - 0024080707502221219B393838D5464444F7484646FE494747FF484646FE4846 - 46FE494747FF484646FE484646FE484646FD424040EB2E2D2DBD1414147E0000 - 00470000002C0606060F29282801000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000191818040000001C0C0C0C59302E - 2EBD484646FA494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF3F3D - 3DE41E1D1D950101014A000000250F0E0E070000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000202B2B0904040435292828A9474545F94846 - 46FE484646FE494747FE4A4949FF525353FE5D6566FE5E7379FF5B7B87FE5B7F - 8DFE5A7D8AFF5B757EFE5E6A6CFE565858FF4C4B4BFE494747FE494747FF4846 - 46FE484646FE3C3B3BDE12111178000000380C10100F00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000001C1C1C0D0D0D0D533E3C3CDF484646FE494747FF4947 - 47FE4F5050FE617073FE548CA3FF439CC5FE32A0D7FE2FA3DDFF31A5E0FE33A6 - E1FE32A6E1FF30A4DFFE2FA0DAFE399DCEFF4990B0FE5A7884FE555757FF4948 - 48FE484646FE494747FF474545FB262525A7010101430A0A0A15467287010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000001A1A1A0D16151568454343F3494747FF494747FF4D4D4DFF6174 - 79FF4C97B9FF2DA0D9FF31A7E3FF36ACE8FF3AAFEBFF3CB2EDFF3EB3EEFF3FB3 - EFFF3FB3EFFF3EB3EEFF3DB1EDFF3AAEEAFF35AAE6FF2BA2DEFF3A9AC9FF567F - 8FFF535555FF494747FF494747FF494747FF323131C50202024A000407160000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002531310816161665464444F6484646FE494747FF585C5CFE588FA6FF2C9E - D7FE2DA6E4FE33ADEBFE37B0EEFF39B2F0FE3AB3F1FE3BB4F1FF3BB4F1FE3CB4 - F1FE3CB4F2FF3CB4F1FE3DB4F1FE3CB4F1FF3BB3EFFE38B0EDFE33ABE8FF29A1 - DEFE3E95BDFE5A6A70FF4A4949FE494747FF484646FE353333CB02020248080A - 0A11000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000004F6A - 6A030E0E0E4A464444F4494747FF494747FF5E6869FF4699BEFF24A0DFFF2BA9 - E9FF30AEEEFF32B0F0FF33B1F1FF34B1F1FF34B1F1FF35B1F1FF35B2F1FF35B2 - F1FF36B2F1FF36B2F2FF37B2F2FF37B2F2FF37B3F1FF37B2F1FF36B1F0FF33AD - ECFF2BA6E4FF2C9AD1FF597884FF4C4B4BFF494747FF494747FF302F2FBF0000 - 003A171D1D090000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000505 - 0524403E3EE0494747FF494747FE5F6A6BFE3C9AC7FF21A0E1FE27A9EBFF2AAC - EFFE2BAEF0FE2BAEF0FE2CAEF1FF2CAEF0FE2DAFF0FE2DAFF1FF2EAFF0FE2EAF - F0FE2EAFF1FF2FAFF0FE30B0F0FE30B0F1FF30B0F1FE31B0F1FE31B0F1FF31AF - F0FE2FADEEFE29A7E7FF249BD7FE577C8BFF4B4A4AFE484646FE494747FF2221 - 219C000000292221210200000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000D0D0D092E2D - 2DA6484646FE494747FF5B6061FE4299C2FE1C9EE1FF21A7EBFE24AAEFFF24AB - F0FE25ABF0FE25ABF0FE26ACF0FF26ACF0FE26ACF0FE27ACF0FF27ACF0FE27AC - F0FE28ADF1FF28ADF0FE29ADF0FE29ADF1FF31A0DAFE30A3DEFE2AAEF1FF2AAE - F0FE2AADF0FE29ACEEFF24A5E7FE2299D5FF5A747EFE4A4848FE494747FF4644 - 44F80D0D0D650101011300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000111111474846 - 46FB484646FE505151FF5594AFFE179BDDFE1BA4EAFF1DA8EFFE297298FF4364 - 75FE48697AFE48697AFE2C94CAFF20A9EFFE20AAEFFE21AAF0FF21AAF0FE21AA - F0FE22AAF0FF22AAF0FE23ABF0FE23ABF0FF476E82FE58595AFE4C6D7FFF398C - B7FE28A7E8FE25ABF0FF24A9EDFE1EA2E5FF2A96CBFE596365FE494747FF4846 - 46FE373535CF000000331E1D1D03000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000007393737C34947 - 47FF4A4848FF658088FF1A98D8FF16A0E8FF17A5EEFF18A7EFFF1B93D0FF3C3E - 3FFF504E4EFF525050FF45616FFF1BA6EDFF1AA7F0FF1AA7F0FF1BA8F0FF1BA8 - F0FF1BA8F0FF1CA8F0FF1CA8F0FF239BD9FF525354FF555353FF555353FF5553 - 53FF53575AFF42728AFF298EC2FF1DA6ECFF189DE0FF448DAEFF4E4E4EFF4947 - 47FF484646FE1514147605040411000000000000000000000000000000000000 - 000000000000000000000000000000000000000000001111113E484646FE4947 - 47FE565959FE3F9AC4FF109BE2FE13A3ECFE13A5EFFF14A5EFFE14A5EFFF225E - 7CFE464444FE4E4C4CFE4E4C4CFF2A82B0FE16A6EFFE16A6EFFF16A6EFFE16A6 - EFFE17A6EFFF17A6EFFE17A6EFFE337699FF504E4EFE514F4FFE504E4EFF504E - 4EFE514F4FFE4D4C4CFF2B627FFE19A6EFFF17A1E8FE1796D7FE5B7179FF4947 - 47FE484646FE353434CA000000282D2B2B010000000000000000000000000000 - 000000000000000000000000000000000000000000022E2D2D9E494747FF4947 - 47FE67828AFE1095D8FF0F9FE8FE10A3EEFE10A3EFFF10A4EEFE10A4EFFF1297 - DBFE31393EFE494747FE4B4949FF44525AFE149FE5FE12A4EFFF12A4EEFE12A4 - EEFE12A4EFFF13A4EFFE14A2EBFE465158FF4D4B4BFE4C4A4AFE3B3A3AFF3534 - 34FE424141FE3E3D3EFF198BC5FE15A5EFFF14A3ECFE109AE1FE408EB2FF4D4D - 4DFE484646FE484646FC090808510F0F0F090000000000000000000000000000 - 0000000000000000000000000000000000000303030B444242E8494747FF4F50 - 50FF4C98B9FF0D99E0FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF19668EFF3F3D3DFF494747FF494747FF2C7297FF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF2183B5FF4A4848FF4A4848FF454343FF205F7FFF1569 - 93FF1D3642FF1E3C4CFF11A3EEFF11A4EFFF10A3EEFF0E9DE7FF1895D3FF5C65 - 66FF494747FF494747FF272525A50000001E0000000000000000000000000000 - 00000000000000000000000000000000000011101038484646FE494747FF5F66 - 66FE299AD1FE0D9CE6FF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0E9CE5FE2A3B44FE464444FF484646FE46494CFE1497DAFF0EA2EEFE0EA2 - EEFE0EA3EFFF0EA2EEFE365E73FE494747FF494747FE393939FE1191D3FF0EA2 - EEFE0EA1EDFE0F97DCFF0FA3EEFE0EA3EFFF0EA2EEFE0EA0EAFE0C96DCFF557D - 8EFE494747FE494747FF424040EC0303033E1B1A1A0500000000000000000000 - 0000000000000000000000000000000000002120206B484646FE494747FF687F - 85FE1095D8FE0D9FE9FF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE1573A3FE3B3939FF484646FE484646FE336680FF0DA2EEFE0DA2 - EEFE0EA3EFFF1496D8FE464749FE494747FF464444FE274C5FFE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA1ECFE0D99E1FF438C - AEFE4B4A4AFE494747FF484646FE1B1B1B880000001500000000000000000000 - 0000000000000000000000000000000000002E2C2C92494747FF4A4848FF618C - 9CFF0C96DCFF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA1EDFF264150FF454343FF494747FF484748FF1B8CC6FF0EA3 - EFFF0EA3EFFF297399FF484646FF494747FF403E3EFF1776A6FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0D9BE4FF3494 - C2FF505151FF494747FF494747FF3A3939D70000003024232302000000000000 - 000000000000000000000000000000000000313030AA484646FE4B4A4AFF5893 - ABFE0D98DFFE0EA1ECFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0DA2EEFE1380B7FF373737FE484646FE494747FF3A5A6BFE0EA1 - ECFE0EA1ECFF3E525DFE484646FE484646FF323B41FE0E9CE4FE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EEFE0D9DE6FF2796 - CCFE555858FE494747FF484646FE484646FD1110106A0707070E000000000000 - 000000000000000000000000000000000000323030B1484646FE4C4B4BFF5496 - B2FE0D98E0FE0EA1ECFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0DA2EEFE0EA2EEFF214C62FE434141FE494747FF484646FE2281 - B1FE188ECAFF474546FE484646FE444343FF205C7BFE0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EEFE0D9DE7FF2196 - D0FE595D5DFE494747FF484646FE484646FE302E2EBD00000025302F2F010000 - 000000000000000000000000000000000000323030B1494747FF4C4B4BFF5596 - B1FF0D98E0FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF118CCAFF333537FF484646FF494747FF4150 - 59FF2D6F91FF484646FF484646FF3B3A3BFF1287C3FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9DE7FF2296 - D0FF595D5DFF494747FF494747FF494747FF474545F90707074E100F0F090000 - 000000000000000000000000000000000000323030A9484646FE4B4A4AFF5B94 - AAFE0D97DEFE0EA1ECFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0DA2EEFE0EA3EFFF0EA3EFFE205A77FE464545FF4F4D4DFE504E - 4EFE4F4F50FF4E4C4CFE4B4949FE2C4654FF0EA2EDFE0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EEFE0D9CE6FF2A96 - CBFE555858FE494747FF484646FE484646FE494747FF252424A10000001C0000 - 0000000000000000000000000000000000002F2D2D8F484646FE494848FF658D - 9BFE0C95DBFE0DA0EAFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE13A5EFFE1FA9F0FF26ACF0FE29A1DEFE464B4FFF5B5A5AFE5D5B - 5BFE5D5B5BFF5D5B5BFE575555FE327CA2FF22AAF0FE19A7EFFE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EDFE0D9BE4FF3895 - C0FE505050FE494747FF484646FE484646FE494747FF413F3FE90202023B1918 - 18050000000000000000000000000000000023222268494747FF494747FF6B7F - 83FF1395D7FF0D9EE8FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF11A4 - EFFF27ACF0FF33B1F1FF34B1F1FF34B1F1FF34B1F1FF3D7D9DFF5C5B5BFF6563 - 63FF656363FF656363FF555759FF35A8E3FF34B1F1FF34B1F1FF2FAFF1FF19A7 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1ECFF0D99E0FF488D - ABFF4B4A4AFF494747FF494747FF494747FF494747FF494747FF1A1919840202 - 02140000000000000000000000000000000012111133484646FE494747FF5E64 - 64FE319DD0FE0D9CE5FF0DA2EDFE0DA2EEFE0EA3EFFF0DA2EEFE14A5EFFF38B3 - F1FE3FB6F2FE3FB6F2FE40B6F2FF3FB6F2FE3FB6F2FE40B0E9FF5D696FFE6E6D - 6DFE6F6D6DFF6C6A6AFE51778BFE40B6F2FF3FB6F2FE3FB6F2FE40B6F2FF3FB5 - F2FE23ABF0FE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0D9FEAFE0C95DBFF5C7E - 8BFE494747FE494747FF484646FE484646FE494747FF484646FE393737D40000 - 002F0000000200000000000000000000000003030305464444E8494747FF4F4F - 4FFE559AB7FE0D98DFFF0DA0EBFE0DA2EEFE0EA3EFFF0FA3EFFE40B5F2FF4DBA - F3FE4DBAF3FE4DBAF3FE4DBAF3FF4DBAF3FE4DBAF3FE4DBAF3FF648FA6FE7877 - 77FE787777FF706F6FFE529FC7FE4DBAF3FF4DBAF3FE4DBAF3FE4DBAF3FF4DBA - F3FE4CBAF3FE1EA9F0FF0DA2EEFE0EA3EFFF0DA2EDFE0D9DE6FE2097D1FF5D63 - 63FE484747FE494747FF484646FE484646FE494747FF484646FE484646FD0F0F - 0F660000000D00000000000000000000000000000000302F2F98494747FF4947 - 47FF6D8287FF1596D7FF0D9DE7FF0EA2EEFF0EA3EFFF29ADF0FF5BC0F4FF5BC0 - F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BBFF2FF7C888EFF8382 - 82FF828181FF717C82FF5BBEF0FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0 - F4FF5BC0F4FF4BBAF3FF0EA3EFFF0EA2EEFF0DA0EBFF0D98DFFF4B90AEFF4C4C - 4CFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2F2D - 2DBA000000240000000100000000000000000000000016151533494747FE4846 - 46FE545757FE4C9EC2FF0D98E0FE0DA0EBFE0EA2EEFF47B8F2FE69C5F5FF69C5 - F5FE69C5F5FE69C5F5FE69C5F5FF69C5F5FE69C5F5FE70B9DEFF8D8C8CFE8D8C - 8CFE8A8989FF729EB5FE69C5F5FE69C5F5FF69C5F5FE69C5F5FE69C5F5FF69C5 - F5FE69C5F5FE67C4F5FF15A5EFFE0EA2EDFF0D9DE6FE1A96D3FE607074FF4947 - 47FE4A4949FE4B4A4AFF4B4A4AFE4B4A4AFE4B4A4AFF4A4848FE494747FE4745 - 45F80606064B0000000800000000000000000000000000000000484646BB4947 - 47FF494747FF6B7F84FF1E98D5FF0D9CE5FF0EA1EDFF53BDF3FF78CBF6FF78CB - F6FF78CBF6FF78CBF6FF84AFC6FF959DA2FF959EA3FF979B9FFF999898FF9998 - 98FF909091FF7AC0E4FF78CBF6FF78CBF6FF78CBF6FF78CBF6FF78CBF6FF78CB - F6FF78CBF6FF77CBF6FF19A6EFFF0D9FEAFF0D96DDFF518FA9FF4D4D4DFF4C4E - 4FFF699BB1FF75A7BCFF75A7BCFF75A7BCFF75A6BCFF687B82FF4A4848FF4947 - 47FF2322229D0000001B000000010000000000000000000000005C6565384846 - 46FB484646FE4F4F4FFF6397AAFE0F95DAFE0D9EE8FF45B7F1FE87D1F7FF87D1 - F7FE87D1F7FE87D1F7FE93B5C7FFA3A2A2FEA4A3A3FEA4A3A3FFA4A3A3FEA3A2 - A2FE93A5AEFF87D1F7FE87D1F7FE87D1F7FF87D1F7FE87D1F7FE87D1F7FF87D1 - F7FE87D1F7FE78CBF5FF10A1EBFE0D99E1FF3396C5FE5A6061FE494747FF4D4E - 4FFE70BBDCFE82CDF0FF7EA9BAFE7098A9FE7098A8FF647278FE494848FE4947 - 47FF413F3FE80202023900000004000000000000000000000000000000006777 - 7799484646FE494747FF595D5DFE539EBDFE0D96DCFF19A3E9FE8AD1F6FF95D6 - F7FE95D6F7FE95D6F7FE9DBBCAFFA7A6A6FEA7A6A6FEA7A6A6FFA7A6A6FEA6A5 - A5FE99C2D7FF95D6F7FE95D6F7FE95D6F8FF95D6F7FE95D6F7FE95D6F8FF95D6 - F7FE95D6F7FE49B7EFFF0D9AE2FE2397CFFF627378FE494848FE494747FF4947 - 47FE586C74FE7ACAEFFF80ABBEFE545656FE4A4848FF494747FE494747FE4947 - 47FF484646FE1817177C0000000E00000000000000000000000000000000B0EA - EA10515353DB494747FF494747FF5F6667FF4D9FC2FF0D96DCFF38AEEBFFA0DA - F7FFA4DCF8FFA4DCF8FFA6C9DAFFA7BBC5FFA7BBC5FFA7BBC5FFA7BBC5FFA7BB - C5FFA4DAF5FFA4DCF8FFA4DCF8FFA4DCF9FFA4DCF8FFA4DCF8FFA4DCF9FFA4DC - F8FF74C7F2FF0F9BE2FF2297D0FF627C84FF4B4949FF494747FF494747FF4947 - 47FF4A4848FF5F8493FF7FCFF5FF79959FFF4E4D4DFF494747FF494747FF4947 - 47FF494747FF313030BD0000001A000000000000000000000000000000000000 - 00009DCBCB30484748F2484646FE494747FE5E6464FF599DB8FE1296D8FF36AB - E7FE9ED8F6FEB2E1F9FEB2E2FAFFB2E2F9FEB2E2F9FEB2E2FAFFB2E2F9FEB2E2 - F9FEB2E2FAFFB2E2F9FEB2E2F9FEB2E2FAFFB2E2F9FEB2E1F9FEAFE0F8FF69C2 - EFFE1199DEFE3098C9FF63777DFE4B4A4AFF484646FE484646FE494747FF4846 - 46FE484646FE4C4B4BFF6B9EB5FE8AD0F0FE718085FF4B4949FE484646FE4947 - 47FF484646FE413F3FE701010121000000000000000000000000000000000000 - 00000000000021729B4A484849F6484646FE494747FF555858FE69919EFF2C9B - D0FE179BDEFE62BEEDFEABDDF7FFC0E6FAFEC0E6FAFEC0E7FAFFC0E7FAFEC0E7 - FAFEC0E7FAFFC0E7FAFEC0E7FAFEC0E6FAFFBBE4F9FE86CEF2FE32A8E4FF1596 - D7FE4F96B4FE5F6869FF4A4848FE494747FF484646FE484646FE494747FF4846 - 46FE484646FE494747FF515354FE93C1D5FEA7D2E6FF606565FE494747FE4947 - 47FF484646FE464444F10303031F000000000000000000000000000000000000 - 0000000000000000000021729B49484748F1494747FF494747FF4C4B4BFF6570 - 72FF5E99B0FF2B9CD2FF1197DBFF39ABE5FF68C0EDFF8ACFF2FF9ED7F5FFA7DB - F6FFA3DAF6FF94D3F4FF78C7F0FF4FB5E9FF1E9EDFFF1696D6FF469ABFFF657E - 86FF515252FF494747FF494747FF494747FF494747FF494747FF494747FF4A48 - 48FF535555FF515252FF494747FF606C70FFB5E3F8FF86979DFF4A4848FF4947 - 47FF494747FF413F3FE00000000F000000000000000000000000000000000000 - 00000000000000000000000000001D77A52D444B50D7484646FE494747FF4947 - 47FE4D4D4DFE636B6CFE688E9AFF4F9BBCFE359DCEFE1E98D5FF1396D7FE1195 - D8FE1295D8FF1897D6FE2A9BD1FE429BC3FF5B91A6FE68787BFE525353FF4947 - 47FE484646FE494747FF484646FE494747FF484646FE484646FE494747FF4F51 - 52FEB4DBEDFE99AEB6FF4F4F4FFE595F60FEBFE5F6FF8FA0A6FE4A4949FE4947 - 47FF484646FE2F2D2DA000000003000000000000000000000000000000000000 - 000000000000000000000000000000000000A5E4E80D7084848F494848F84846 - 46FE484646FE494747FE4A4848FF4F5050FE5A5F5FFE677071FF6B7B7EFE6A7E - 83FE6A7C80FF687476FE5F6565FE535454FF4B4A4AFE494747FE494747FF4846 - 46FE484646FE494747FF484646FE494747FF484646FE484646FE494747FF4B4A - 4AFE9EB7C2FECBE6F3FF9CAFB5FEB1CAD4FECCE8F5FF707779FE494747FE4947 - 47FF474545F60F0E0E2E00000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000004947472A4947 - 47A7494747FA494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF535656FF93A4AAFFB1C3CAFFAABCC3FF788284FF4D4C4CFF494747FF4947 - 47FE262424690000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00004846461C48464676494747C8484646F7484646FE494747FF484646FE4846 - 46FE494747FF484646FE484646FE494747FF484646FE484646FE494747FF4846 - 46FE484646FE494747FF484646FE494747FF484646FE484646FE494747FF4846 - 46FE494747FE4A4848FF4C4B4BFE4B4A4AFE494747FF484646FE474545E03C3B - 3B52000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000A3A2A211A3A2A23BA4A3A35FA3A2A276A3A2 - A27FA4A3A37FA3A2A27FA3A2A27FA4A3A37FA3A2A27FA3A2A27FA4A3A37FA3A2 - A27FA3A2A27FA4A3A37FA3A2A27FA4A3A37FA3A2A27FA3A2A27FA4A3A37FA3A2 - A27FA3A2A27FA4A3A37FA3A2A27FA3A2A27FA4A3A377A3A2A248A3A2A2080000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF - FFFFFFFF0000FFFE001FFFFF0000FFF00003FFFF0000FFE00000FFFF0000FF80 - 00007FFF0000FF0000003FFF0000FE0000000FFF0000FC0000000FFF0000F800 - 000007FF0000F000000003FF0000F000000001FF0000E000000001FF0000E000 - 000000FF0000C000000000FF0000C0000000007F000080000000007F00008000 - 0000007F000080000000003F000080000000003F000080000000001F00008000 - 0000001F000080000000000F000080000000000F000080000000000F00008000 - 000000070000800000000007000080000000000300008000000000030000C000 - 000000010000C000000000010000E000000000000000E000000000000000F000 - 000000000000F000000000000000F800000000000000FC00000000000000FE00 - 000000000000FF00000000000000FF80000000010000FFE0000000030000FFF8 - 000000070000FFFF0000000F0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF - FFFFFFFF0000FFFFFFFFFFFF0000280000002000000040000000010020000000 - 0000801000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000030000 - 000E0000001F0000002D00000033000000340000002F00000022000000110000 - 0004000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000252424040404041F121212672928 - 28AD393838D8444242F0484646F9474545F8414040EB353333CE2221219F0909 - 0958020202251F1F1F0700000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000B0B0B14181818763D3B3BDF494747FF4947 - 47FF494747FF4C4B4BFF4F4F4FFF4E4D4DFF4B4949FF494747FF494747FF4846 - 46FD323030C60B0B0B5F0606061A526262010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000BBC3C3011011112D343232C4494747FF494848FF565C5EFF507B - 8EFF4892B5FF429FCBFF40A3D4FF40A2D1FF439AC3FF4888A5FF526D78FF4E4E - 4EFF494747FF474545FA2221219D0304042A6183900300000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000151515363F3E3EE3494747FF545858FF4D88A3FF33A2DAFF34AB - E7FF39B0EDFF3DB3EFFF3EB4F0FF3EB4F0FF3DB3EEFF3AAFEBFF31A8E4FF3A9A - C8FF51717EFF4B4A4AFF494747FF2F2D2DBD0103042F7FABAB02000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00001E262625403E3EE2494747FF57696FFF379BCCFF2BA8E7FF32AFEFFF35B1 - F1FF35B2F1FF36B2F1FF37B2F1FF37B3F1FF38B3F2FF38B3F1FF38B2F1FF35AF - EDFF2BA4E2FF4488A8FF4F5050FF494747FF2E2C2CBA090C0C23000000000000 - 000000000000000000000000000000000000000000000000000000000000292E - 2E08363434C2494747FF586B71FF2B9DD5FF25A8EBFF29ACF0FF2AADF1FF2AAE - F1FF2BAEF1FF2CAEF1FF2CAEF1FF2DAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FAF - F1FF2EAEEFFF27A6E6FF3C8DB3FF4E4F4FFF494747FF1F1E1E920F0F0F0F0000 - 0000000000000000000000000000000000000000000000000000000000001E1D - 1D6B494747FF565C5EFF2E99CEFF1CA4EAFF2491C8FF397D9FFF3C7FA1FF26A1 - DFFF22AAF0FF22AAF0FF23ABF0FF23ABF0FF24ABF0FF29A3E1FF4E6A79FF3D88 - AEFF2BA5E3FF26ABEFFF1FA2E5FF4583A0FF4A4848FF464444F6080808493230 - 30010000000000000000000000000000000000000000000000000101010B4240 - 40E44B4949FF478DADFF149FE6FF16A5EFFF189EE1FF3D464BFF514F4FFF3B6E - 89FF19A7F0FF19A7F0FF1AA7F0FF1AA7F0FF1BA8F0FF357DA2FF545252FF5452 - 52FF535455FF40687DFF1E9EDEFF1A9BDDFF526871FF494747FF2C2A2AB21413 - 130F0000000000000000000000000000000000000000000000001A19195B4947 - 47FF5B686BFF1799DAFF10A2ECFF11A4EFFF11A4EFFF1D6E98FF474545FF4B4A - 4AFF1E91CBFF13A4EFFF13A5EFFF14A5EFFF15A4EDFF45555EFF4D4B4BFF3F3D - 3DFF454343FF384B55FF16A5EEFF14A1E9FF358CB6FF4B4949FF464444F60403 - 0333000000000000000000000000000000000000000000000000333131AD4947 - 47FF4C87A0FF0D9CE5FF0EA2EEFF0EA3EFFF0EA3EFFF0E9FE9FF30424CFF4947 - 47FF3B5B6DFF0FA3EEFF0FA3EFFF0FA3EFFF1F88BEFF4A4848FF454343FF1874 - A3FF176288FF16709EFF10A3EFFF0FA2EDFF1297DBFF555F62FF494747FF1F1E - 1E8D21202007000000000000000000000000000000009F9F9F02444242E74D4C - 4CFF3798C6FF0D9FEAFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1678AAFF4240 - 40FF484646FF2183B5FF0EA3EFFF0EA3EFFF34637BFF484646FF34444DFF0EA1 - ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9BE3FF497588FF494747FF3D3C - 3CE00404042000000000000000000000000000000000A6A6A610494747FF5558 - 58FF239CD7FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF2A49 - 5AFF484646FF41515BFF0F9FE9FF129AE0FF464849FF474545FF1F678DFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9DE7FF3E82A2FF494747FF4947 - 47FF1413136B2B2A2A03000000000000000000000000A8A8A821494747FF5D62 - 62FF1799DBFF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1385 - BFFF3E3D3DFF494747FF29769EFF247AA7FF484646FF3F3E3FFF1192D4FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0D9FE9FF3989AFFF494747FF4947 - 47FF333131C60C0C0C15000000000000000000000000A8A8A820494747FF5C61 - 61FF189ADBFF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF24536CFF474545FF454B4FFF3C5968FF484646FF2C5165FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0D9EE9FF3A89AFFF494747FF4947 - 47FF484646FC0A09094A353434010000000000000000A7A6A60F494747FF5557 - 57FF269CD6FF0DA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF10A3EFFF1AA7 - EFFF2498D4FF4D4E50FF5B5959FF5A5858FF565454FF2981AEFF17A6EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9DE7FF4083A1FF494747FF4947 - 47FF494747FF282727A81616160D000000000000000000000000454343E74C4C - 4CFF3B99C4FF0D9FEAFF0EA3EFFF0EA3EFFF0EA3EFFF20AAF0FF35B1F1FF36B2 - F1FF36B2F1FF457A95FF666464FF676666FF5A6064FF37AEEBFF36B2F1FF30B0 - F1FF15A5EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9AE3FF4D7587FF494747FF4947 - 47FF494747FF444242F104040430000000000000000000000000343232A94947 - 47FF51879EFF0D9BE4FF0EA2EEFF0EA3EFFF27ACF0FF49B9F3FF49B9F3FF49B9 - F3FF49B9F3FF4DB0E3FF747373FF757474FF5A879EFF49B9F3FF49B9F3FF49B9 - F3FF45B8F2FF15A5EFFF0EA3EFFF0DA1ECFF1598D9FF575F60FF494747FF4947 - 47FF494747FF494747FF1D1C1C880000000600000000000000001C1B1B554947 - 47FF5D6769FF1B9AD9FF0DA1ECFF0FA3EFFF59BFF4FF5EC1F4FF5EC1F4FF5EC1 - F4FF5EC1F4FF69ADD0FF858484FF818080FF62B0D8FF5EC1F4FF5EC1F4FF5EC1 - F4FF5EC1F4FF3DB4F2FF0EA2EEFF0D9EE7FF3C8DB3FF4A4949FF494747FF4947 - 47FF494747FF494747FF3C3A3ADD0000001E0000000000000000030303054846 - 46E14A4949FF508EA9FF0D9BE3FF18A6EEFF74CAF5FF74CAF5FF74CAF5FF80B3 - CDFF88ABBEFF8F9FA8FF969595FF88969EFF74CAF5FF74CAF5FF74CAF5FF74CA - F5FF74CAF5FF58BFF3FF0DA1ECFF1698D9FF56676DFF505B60FF678897FF6889 - 97FF688997FF585F62FF494747FF121212660000000300000000000000005E69 - 695F494747FF575B5BFF3399C9FF0F9EE7FF7CCDF5FF8AD2F7FF8AD2F7FF9BB0 - BCFFA5A5A5FFA5A5A5FFA5A4A4FF91B9CDFF8AD2F7FF8AD2F7FF8AD2F7FF8AD2 - F7FF8AD2F7FF4FBAF1FF0D99E1FF4D839AFF4A4848FF526168FF7DCAEEFF7699 - A6FF647E89FF555B5DFF494747FF313030C200000012000000000000000090B7 - B701606C6CB9494747FF5C6A6EFF2999CFFF3BAFEAFF9FD9F8FFA0DBF8FFA4BF - CCFFA6B4BAFFA6B4BAFFA6B3BAFFA1D6F1FFA0DBF8FFA0DBF8FFA0DBF8FFA0DA - F8FF8BD1F5FF179DE2FF458CACFF4E4E4EFF494747FF494747FF5F8291FF7EBA - D5FF535555FF494747FF494747FF474545FB0505053200000000000000000000 - 0000AFE8E815434D53DD494747FF5C676AFF3998C5FF3CACE6FFA1D9F6FFB6E3 - F9FFB6E3FAFFB6E3FAFFB6E3FAFFB6E3FAFFB6E3FAFFB6E3FAFFB5E2F9FF81CC - F2FF239EDDFF4D87A0FF4E4E4EFF494747FF494747FF494747FF4A4949FF71A1 - B6FF87ABBAFF4C4C4CFF494747FF494747FF1515155E00000000000000000000 - 0000000000001580B621434D53DC494747FF535555FF56879BFF2E9DD2FF49B1 - E6FF7FCAF0FFA1D9F5FFAFDFF7FFACDEF7FF97D4F4FF6DC2EDFF33A6E0FF3A95 - BFFF596F77FF4A4949FF494747FF494747FF494747FF4B4A4AFF4F4F4FFF4E4F - 50FFA3CDE1FF6C7578FF494747FF494747FF1514145100000000000000000000 - 00000000000000000000409FC71457686CB5494747FF494747FF565959FF5B7B - 86FF498DABFF3D97C1FF369AC9FF3799C7FF4093B9FF4D849CFF5C6D71FF4D4D - 4DFF494747FF494747FF494747FF494747FF494747FF69767CFFB1CCD8FF595C - 5DFFADCBD8FF757F82FF494747FF464444F10404041200000000000000000000 - 00000000000000000000000000000000000050525255494747D6494747FF4947 - 47FF494747FF4B4A4AFF4D4C4CFF4C4B4BFF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4B4CFF99ACB4FFB9CF - D8FF9EAFB6FF505050FF494747FE212020670000000000000000000000000000 - 0000000000000000000000000000000000000000000049474701494747404947 - 4790494747C9494747ED494747FD494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B49 - 49FF494848FB484646CC42404051000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF80 - 1FFFFE0007FFFC0001FFF00000FFF000007FE000007FC000003FC000001F8000 - 001F8000001F8000000F0000000F000000070000000700000003000000038000 - 0003800000018000000180000000C0000000C0000000E0000000F0000000F800 - 0000FE000001FF000003FFFFFFFFFFFFFFFFFFFFFFFF28000000180000003000 - 0000010020000000000060090000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000006767 - 67066767670F6767671267676710676767076767670100000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000021202002040404201616166F2928 - 28AC333232C9363434D0323030C6252424A510101064010101201D1C1C040000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000262B2B101F1E1E86424040ED494747FF5051 - 51FE535F63FF526269FF525B5EFF4D4C4CFE494747FF3B3A3ADD141313711A1D - 1D14000000000000000000000000000000000000000000000000000000000000 - 000000000000000000004A4A4A20363535C94A4848FE516872FF4590B5FF39A6 - DCFE37ABE6FF39ADE8FF36AAE5FF3CA1D3FE4583A0FF4F595DFE484646FE2827 - 27AB1521271D0000000000000000000000000000000000000000000000000000 - 0000000000004E6767153B3939D34E4F4FFE4789A8FE2DA7E5FE34AFEFFE37B2 - F1FE38B3F1FE39B3F1FE39B3F1FE39B3F1FE36AFEDFE31A2DBFE4A7183FE4948 - 48FE2C2B2BB42B39391500000000000000000000000000000000000000000000 - 0000171A1A022F2D2DAA4D4D4DFF3E8FB5FF23A7EAFE27ACF0FF29ADF0FF29AD - F0FE2AADF0FF2BAEF1FF2CAEF1FF2EABEBFE2FACECFF2DAEF0FE27A5E5FF4875 - 8AFF494747FE1D1C1C892B2A2A05000000000000000000000000000000000000 - 000012121245494747FE497F98FF18A1E7FF1E95D1FE46565FFF436B81FF1DA8 - EFFE1EA9F0FF1EA9F0FF1FA9F0FF3882A8FE535B60FF427793FE2D95CAFF1F9F - DFFF4D616AFE444242F30E0D0D2F000000000000000000000000000000000000 - 0000343333B6545A5CFE1C9ADAFE11A3EEFE12A4EFFE2B5C76FE4C4A4AFE2686 - B8FE14A5EFFE14A5EFFE15A5EEFE455862FE4A4848FE464444FE345E73FE16A4 - ECFE318CB9FE4A4848FE21202090333232020000000000000000000000007C7C - 7C11474545F9497A90FE0D9EE8FF0EA3EFFF0EA2EEFE1192D4FF3E4143FF4152 - 5CFE10A0E9FF0EA3EFFF1D8AC1FF494747FE2C5B73FF1478ACFE1386C1FF0FA3 - EEFF109AE0FE515C60FF3E3D3DE4151515180000000000000000000000008B8A - 8A3F494747FF398EB5FE0DA1ECFF0EA3EFFF0DA2EEFE0EA3EFFF216486FF4746 - 46FE29779FFF0EA3EFFF336580FF464444FE1682B9FF0DA2EEFE0EA3EFFF0EA3 - EFFF0D9EE8FE456F83FF494747FF16151569000000000000000000000000908F - 8F574A4848FF3296C7FE0EA2EDFF0EA3EFFF0DA2EEFE0EA3EFFF0F9AE0FF3942 - 48FE454B50FF1694D5FF45494CFF384851FE0EA1ECFF0DA2EEFE0EA3EFFF0EA3 - EFFF0D9FEAFE3E7894FF494747FF343333C91F1E1E0D0000000000000000908F - 8F564A4848FE3296C6FE0DA2EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE1D6F - 9AFE494747FE435762FE4B4949FE226A90FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0D9FEAFE3E7894FE484646FE484646FD0F0E0E4500000000000000008C8B - 8B3E494747FF3C8EB4FE0DA1ECFF0EA3EFFF0DA2EEFE15A5EFFF26ACF0FF2EAC - ECFE4F5F68FF615F5FFF5B5B5BFF2FA0DAFE22AAF0FF10A4EFFE0EA3EFFF0EA3 - EFFF0D9DE7FE476F82FF494747FF484646FE292828AA07060606000000007D7C - 7C0E484646F94D7A8EFE0D9DE7FE0DA2EEFE1CA8EFFE44B7F2FE46B8F2FE46B8 - F2FE5499BCFE737272FE607C8BFE46B8F2FE46B8F2FE3FB5F2FE12A4EFFE0DA2 - EEFE129ADFFE525C5FFE484646FE484646FE454343F304030329000000000000 - 0000363434B2555A5BFE1F9BD8FF0DA2EDFF4DBAF3FE62C2F4FF62C2F4FF62C2 - F4FE75A3BBFF878686FF6AA7C7FF62C2F4FE62C2F4FF62C2F4FE35B2F1FF0DA0 - EBFF348BB5FE4A4949FF4A4848FF4A4848FE494747FF1F1E1E88000000020000 - 0000292B2B3D494747FE4F7F94FF0E9CE5FF66C4F4FE7FCEF6FF85C0DEFF9CA0 - A3FE9E9E9FFF989C9EFF80CBF2FF7FCEF6FE7FCEF6FF7FCEF6FE46B7F1FF1799 - DBFF506167FE5D7C8BFF7AB1C8FF729FB2FE585F62FF3D3C3CE0000000160000 - 0000000000006C7F7FA14D4C4CFE438EB0FE3AAEE9FE9CD8F8FE9FCDE5FEA7B1 - B6FEA7B1B6FEA2BFCDFE9DD9F8FE9DD9F8FE9DD9F8FE91D4F6FE22A1E1FE4C74 - 85FE494747FE4D5153FE76B2CDFE596063FE494747FE484646FE121111580000 - 000000000000B5F2F20C3E525DCC4E4E4EFF4A87A2FE46AEE3FF9CD7F6FFB9E4 - FAFEB9E4FAFFB9E4FAFFB9E4FAFFB8E3F9FE86CEF2FF37A1D6FE4F707EFF4947 - 47FF484646FE494747FF546167FF8DB9CCFE4F4F4FFF494747FF232222860000 - 000000000000000000001184BF123C5461BD494848FE56676DFF428BADFF49A9 - D7FE56B5E5FF5BB8E7FF54B3E3FF42A0CCFE467F99FF525859FE494747FF4947 - 47FF484646FE687277FF606567FF8BA5B0FE6A7275FF494747FF1C1B1B640000 - 00000000000000000000000000007B9EA1035459596C484646E8494747FE4F4F - 4FFE595E5FFE596264FE56595AFE4C4B4BFE494747FE484646FE484646FE4846 - 46FE484646FE61676AFEAABFC7FEA8BCC4FE535455FE3F3E3ED70303030B0000 - 00000000000000000000000000000000000000000000767575077675754F7675 - 7590767575B4767575BF767575BF767575BF767575BF767575BF767575BF7675 - 75BF767575BF767575BF777676BF777676BD7674748C58575714000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000000000000FFFF - FF00FF03FF00F800FF00F0007F00E0003F00C0001F0080000F0080000F008000 - 0700000007000000070000000300000003000000010000000100800000008000 - 0000C0000000C0000000E0000000F0000000FC000100FFFFFF00FFFFFF002800 - 0000100000002000000001002000000000004004000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001B1A1A01050505221818186D2322 - 2292222121911615156802020220191818010000000000000000000000000000 - 00000000000000000000000000006C7B7B0B2827279349494AF74A6774FF4777 - 8EFF47758BFF4B606BFF444343F01F1E1E844E63660B00000000000000000000 - 0000000000000000000073959509373636BF4B6876FF37A0D4FF36AFEDFF3AB3 - F0FF3BB3F0FF37AFECFF3B97C5FF4A5A62FF292929A94E5F5F09000000000000 - 000000000000000000003131318D496A79FF249EDCFF3295C8FF27AAECFF27AC - F0FF29ADF0FF359BCFFF31A2DCFF2AA0DBFF49585FFF1F1E1E78000000000000 - 000000000000565656194C4E4FF8219AD6FF14A3EBFF3D525DFF2F7CA3FF16A6 - EFFF17A6EFFF475C67FF4B4A4AFF2B7DA7FF2D8CBBFF413F3FE9282727100000 - 0000000000006D6C6C65466C7EFF0DA0EBFF0EA3EFFF187FB4FF434A4EFF139B - E0FF1C8CC5FF434547FF1386C2FF1196DAFF0F9EE6FF4C585EFF201F1F650000 - 0000000000007877778C3B7C9BFF0EA2EDFF0EA3EFFF0EA2EEFF315467FF306B - 8AFF316986FF2E5F79FF0EA3EFFF0EA3EFFF0DA0EBFF426678FF363434CB3231 - 3106000000007877778B3C7C9AFF0DA2EDFF0EA3EFFF0EA3EFFF1C8DC7FF4D4E - 4FFF4D5357FF1E87BCFF0EA3EFFF0EA3EFFF0DA0EBFF436677FF484646FE1F1E - 1E40000000006E6D6D64486D7DFF0DA0EAFF14A5EFFF3AB3F1FF40B6F2FF5B80 - 94FF647077FF40B5F0FF35B1F1FF0FA3EFFF0F9DE6FF4D585DFF494747FF2B2A - 2AAA00000001575757164E4F50F72199D4FF3DB5F1FF69C5F5FF71B8DDFF8599 - A4FF78A4BBFF69C5F5FF69C5F5FF2CAEF0FF2D8AB8FF525D62FF58686FFF494A - 4AF60404042200000000667474864B6976FF3CADE6FF95D6F7FFA3B2BAFFA6AC - AFFF97CFEBFF95D6F8FF90D4F7FF2E9FD8FF4B585DFF5E7D8CFF6B8996FF4C4C - 4CFF1F1F1F8000000000A4D6D605395869B64C6773FF58AAD2FF8DD0F2FFAFDF - F8FFABDEF8FF83CBF0FF4E9BC1FF4C595FFF494747FF4B4A4AFF7A9AA8FF5253 - 54FF2F2E2EAB00000000000000005897AD05586263824C4B4BF44E6570FF4372 - 88FF437085FF4F6067FF4A4848FF494747FF494747FF808E95FF97A9B1FF5557 - 58FE1B1A1A5A00000000000000000000000000000000A4A3A310A4A3A356A4A3 - A37AA4A3A37FA4A3A37FA4A3A37FA4A3A37FA4A3A37FA4A3A37FA4A3A37EA2A1 - A147000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000FFFF0000E01F0000C00F00008007000080070000000300000003 - 0000000100000001000000000000000000008000000080000000C0000000F001 - 0000FFFF0000} - OldCreateOrder = False - Position = poScreenCenter - OnClose = FormClose - OnCreate = FormCreate - PixelsPerInch = 96 - TextHeight = 13 - object bvlSpace: TBevel - Left = 0 - Top = 314 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - object jplWizard: TJvPageList - Left = 0 - Top = 0 - Width = 527 - Height = 314 - ActivePage = jspWelcome - PropagateEnable = False - Align = alClient - OnChange = jplWizardChange - object jspWelcome: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - Color = clWhite - object imgInstall: TImage - Left = 0 - Top = 0 - Width = 164 - Height = 314 - Align = alLeft - AutoSize = True - Picture.Data = { - 07544269746D6170AE5B0200424DAE5B0200000000003600000028000000A400 - 00003A0100000100180000000000785B0200C40E0000C40E0000000000000000 - 00008C00018900028400047800036E02085F06094B02043500003404022F0401 - 3100004303024D00006200007300008304068000018200008600008700008700 - 018400018000047800046700016508094D00004D01024300004400014804053E - 00004300033C00003E00004302043D00004201034403053E00004201033C0000 - 3E00004302043D00004201034403053E00004201033C00003E00004302043D00 - 004201034403053E00004201033C00003E00004302043D00004201034403053E - 00004201033C00003E00004302043D00004201034403053E00004201033C0000 - 3E00004302043D00004201034403053E00004501023F00004100004603024000 - 004502014504033F00004302013C00003E00004104023900003E030140050338 - 00003B03023300003800003F04023B00004302014D03014C00005D0302570000 - 7002027A03047C00008702058700008A00028400018200018000018000018000 - 018000018400018400018300008000017B00027101016705055D08064E03013F - 00004003003F02004100004D02005200005E00006A00007A05087B00027F0002 - 8200018200018200018000018001008001008601008700008900008700008400 - 017D01017201046604045300014300003E00003F03043D00014300064B000845 - 00014C06063C00004F0A074000008A00018700028000047500046A03085D0609 - 4903043500003303013606043000004908074C00006701027000008405078000 - 018200008600008700008700018400017D0004760104640000680B0C49000051 - 07073E00004804054501024100003F0000420103390000500F113900004E0D0F - 3E00004201033E0000420103390000500F113900004E0D0F3E00004201033E00 - 00420103390000500F113900004E0D0F3E00004201033E000042010339000050 - 0F113900004E0D0F3E00004201033E0000420103390000500F113900004E0D0F - 3E00004201033E0000420103390000500F113900004E0D0F3E00004202024100 - 004502013C000053100F3C0000510E0D3F00004302013F00004202013900004E - 110F3700004C0F0D3C00003E03013800003C03013500004E110F3A0000530E0B - 4800005300005F03025A00007002027B03047C00008702058700008A00028600 - 018200018000017F00017F00017F00017F00017F00017E00017B00027601026A - 03016206055809064904013D0000420200490401430000580704520000670102 - 6800007D06077D00028000028200018400018200018200018001008001008200 - 008401008400008200007F00017801026D02046205044E00004901013900004E - 0F11390000510B124500024B00034D01024300005609074A0000880006820004 - 7D01076D00026403074F00004301023800003403013401003A00004A00005D03 - 036E03057B02068000028301028301018600008500008500007F000079000470 - 02046200015600004F01024500004701024100004600014300004100013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004300004200004502014100004302013F000042010041 - 00004000003E00004303023F00004404034000004303024101003E01003E0100 - 4101004300004700004C00005100005900006804046D02047402027B00028000 - 028600028700028900018700018400007F00007C000078000176000076000074 - 00007502056B00006400005600005001004200003C05003C0200480000520000 - 5A03016104036A04057103037801027C00018300038500028700028600018400 - 018100008100007F00007E03017C03017E06067903027606066900005F000051 - 00004C00014500004300033D00004300054000004700034B00005400005B0000 - 6101016303037D00047D04086B00006D06095100005006063D00003A02013802 - 013900004200004F00006202027103037E010382000183010183010184000084 - 00008100007E00007500036D02045C00005704034500004C06063C0000490506 - 3F00004501024000004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101014000004704033D000048 - 07063A00004706053D00004101003E00004404033B00004908073B0000480706 - 4000004502014300004300004800004C00005201005601005E01006400006D02 - 047201047801027D00028200028600028700028700018600008300007E000078 - 00007301016F01016E01036A0203680203670505550000570402400000440802 - 3500003F03005300005F00006602026D03027303037902037F00028100018500 - 028700028700028600018400018200018000017D01017501007708066B000073 - 0C0A6000006407065100004F00004A00004A04043C00004702054000004F0307 - 4800005801056200006A00006E00027002027602076900006E070C5200005908 - 0B3E00004405073800003D01014100004A000058000069010277020380010382 - 00018301018301018200008200007F00007A00007100036602025A0202480000 - 4F09093A00004B090A3A00004905064200004300033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004301023B00004A09083A00004B0A093900004606053E00004202013B0000 - 4A09083C00004F09093E00004C04044600004900004E00005300005700005D02 - 006403006904027004037402027801027D000280000282000284000286000286 - 00018500008100007A00007302006C02016703036302046104055F0505530000 - 5A0706470000520B083A00004309034400006102006E01007202027703027D03 - 038001028200018300008600018600018600018500028101028001027E020279 - 03026F05046200006B0C09540000630C0A4A00005106044700004C0404420000 - 5006064300005605084900005D080C6102066F00017900007D00027E02026500 - 016906085000005B080A4000004A08093700004203054100004A000055000162 - 00006E00027901028000018400018102018102018001008001007C0000740000 - 6D00026101015100005107053A00004A0D0B3700004B0B0B3B00004503043E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004C0C0B390000480B09 - 3700004003013F00004807063C0000500A0A4000005208084300005000005500 - 005B00005E00006400006902006F03027404047A03047B00027D000280000282 - 00028400028400028400028400028301017E03017602016E03006402025D0302 - 5603025503025000005704064A00005C0A09470000590E0C4700005806016F04 - 017A02027D03037F03038202038301028400018600018600018400018200017F - 00017C02027903027703027103036200006309094C00005E0C0B430000540A08 - 3F00004904014700005105064900005F0909500000690A0E5E000172070A7B00 - 028301028402038402035C03064D00005608094000004B090A37000045060840 - 00004900005300016000036B00027500037C00018200018400008001007F0100 - 8002017D02007800007001006700005C00005202013F00004B0B0A350000480C - 0C3700004808084100004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202370000 - 4A0A093700004A0D0B3500004308063C00004404033B00004F09094000005509 - 0A4500005505065200006302006A01006D02006F02007302007802017C010380 - 01038200028200028400028400028400028400028400048000028204037A0502 - 6F04016504005A03015102004A00004900004D00014900005E05085200006B0D - 0E5A00006A0D0C6702007B030382030282030284020286020285010184000184 - 00018100007E00007B01017802017203017003016D04016804025E04044E0000 - 57090A420000500A0A3C00004B08074600004B00004A0000630909570000760D - 106500007A090C7700018102038602028602028602024A00004E06063C000047 - 0A083500004408083900004601044D00005900016700057300037A00017F0000 - 8300008400008001007F01008002017C03017802016D00006300005700004900 - 00470703350000430C09330000460A0A3C00004604053E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023C0000440705370000460B09350000450A083600004003014000 - 004807063E00005208084500005808094D00005D03036D030274030176020179 - 01017D0101800001820002860002870002870002860002860002840002820002 - 8200047F00027A03017305006804005C03004F02004500004200004300004800 - 005702065300006F080D6500007F0C0F7300017F050584020285010187010187 - 01018701018701018500028101027E00007800007501006F0200690200660300 - 6302005E02015200005405084200004C08093A00004808073E00004B03034C00 - 005F05045D0000790C0E6D0000830B0C77000080010282030283010183010183 - 01014302013D00004206063300003E08083400004304064700015000005F0002 - 6E00067901057E00018200008500008400007F00007D02007E03017A03017602 - 016C01005E00005400004B01003C000040070530000040080736000044060642 - 02024100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00003F01013800004207053300004108 - 063400004005033D00004303024000004D05054300005606074D00005D060960 - 02037203017B02007D01018000018200018600018700018900018B0002890002 - 8700028600028400028200028000047B00027100006702005E02005301004801 - 004001003D00004000005104085400016A030A6A000085070D8000008E02098A - 0000870000860100870000860000860000840000830101800201790101750100 - 6D02006602006002005A02005700005300005000024700004D03093A00004706 - 083B00004805044900005A04045F000075070972000087080A7F00008B030584 - 00008001007F01007F01007F01003F00003F02003900003D05043701003E0504 - 4000004A00015400006300027201057C01058000018200008500008400007F00 - 007D01017A02027504026F03026302005700004C00004500003F02003800003B - 03023800003F03033F01014404044000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000013E00013D01023C00004201033E0000430003 - 4000004100014100014200023F00004201033E00004001033D00003C00013901 - 003A03003700003B04013800003E03013D00004100004600004C01004C000055 - 00005600006103046401036D05067501007A01007F0100800001840001880002 - 8A00028C00038B00028900048600048000047D00047900047800057002046100 - 005A00005600005100004B00004A00004A00014D00015C05096605096D00057B - 03087F00038A01058B00008B0000890000860000860000860000860000860001 - 8301027F03037801026F01016602025E02015302004B01004500004500004C00 - 004E00024900004C01034600004D03034E000057000068060672060576000080 - 01038000008700028700008701018001007C01007E00007C0100430000400000 - 4002023A00003C03023C00004401004A00005E04046802037301017B01018000 - 018301018501018301018301027D00027806066800015F02034F00004A000142 - 00004000013D00004001033C00004002023E00003F02003E00004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100023E0001390100360000 - 3C03023C00004301024100004600024700014700014400004500053F00014000 - 053800013A01043501013202013000003403013200003D04023C00004502004A - 00005000005800006301016A0203730205770205790102780000770500770500 - 7A04007D020080010083000086000086000187000484000582040A7901067303 - 0A6600026000025400004C00004A00004E00005200005800005F00016700066F - 03096F01057201047402027802017B01017D0200820100840100820000850000 - 8700008800018800028800038500057F00047A04096900055A00034800004201 - 033400002F03043100004600005100005500005900005F02016703016E040374 - 04047801027B01017F00018000018200018200018200018200018000017F0001 - 8000017F00014400004703043A00004507073500004606054100004F00006004 - 036A03017301017B01018001008301018301018301018100018205076E00006C - 0A0A4E00004F05053D00003F00023B00024003073A00004706083A0000460606 - 3C00003F02003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00003D01023600003B05043300004307073900004905064100004800024600 - 004902053D000047050A3500003F06093300003402023101003606042D00003E - 09063500004906034600005200005B00006300006D01007601027E0103810003 - 8400018100007A04007705007A04007B03008001008200018400028400028000 - 0580040A6E000172060C5C00005F03084E00004C00034300034400044E000558 - 00026200026D00037600057C00067B00047B00027901017902007902007B0300 - 7F02008002008401008600008701018500028500038000027C00047600036D00 - 056402084C00004C040A34000039070B2800003200004A00005700005E000064 - 01006B02007203017A02027F0303800001820001820001820001800001800001 - 7F00017F00018000018000018000018000014701023D0000490909370000480B - 093900004D06034E00006104036A03017402027B010180010082000083010183 - 0101820104760000790B0D5A00005E0A0C4000004605073B00003E0105360000 - 49080A3900004B090A3900004606053C00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073C00003B0302330000430A093500004A0A - 0A3A00004904074100004500033D00004A070A390000460A0B3300003F060735 - 0000390302340000430A083700004D0A09420000560403530000610101690200 - 7202027A02038102038301028600018300007F02007D02007F01008002018101 - 028101028100037E01037D03096C000070060C5500005F050A47000051040846 - 00024200024801045200055E00056700047100047A00047E00057D00027D0002 - 7D01017D02007F01007F02008201008401008802028801038402038001027901 - 027200006A00026200015E00044D00005506094000004F0A0D3A000045050A40 - 00005601006002006502006902006F02007602017C0202800102800001820001 - 8200018200018000018000017F00017F00018000018000018000018000014300 - 004A06073900004A0C0C3700004B0A094200005200006404046D03027601027D - 01018001008200008200008001007D00007F08096500006D0D0D490000510909 - 3A00004004053A000145050A3900004C0B0D3A00004A0A0A3900004003013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004001033A00 - 00410807350000480C0C370000480A0A3900004201033E00004706083900004A - 0B0D370000460A0B3500003E02023C00004707033C0000540D0A4500005C0B08 - 5300006203006904027103037803047D03038202038500028700018600008400 - 008201008200008001008001027E02027A02037702056C00026C07095200005C - 080A4300004E08093B00004503044502014D03035804066403076F0105770004 - 7D00048100038000028000027F00018000018001008200008600008600008902 - 048502057F02047702036C02016000005700004F000049000050060642000055 - 080B4500005D090D4E00005C03066303036804006C0300700301740301790101 - 7E02028101028200018200018200018200018000017F00017D01017D01018000 - 018000018000018000014501023C00004A0A0A3900004C0C0B3C00005106044F - 00006604046F03027801027D01018001008200008001007F01007F02046F0000 - 760B0D5300005B0B0C3E00004807093C00013E01053700004A090B3A00004D0B - 0C3900004707063C00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E0000400202370000480A0A350000480C0C35000041080738 - 00003C0302350000460A0A3700004A0C0C390000470707410000490000450000 - 5809064A0000650E0C5500006C0B086801007205037804037D03038103028402 - 028701018700008700008600008500008400018000017D00027801027002046B - 030460000150000059090A4000004D0B0C3700004007063B00004A0300560502 - 6206056B05067502057B00028000028301028200018200018000018000018200 - 018400018700018600018400067C01057502056A02035C02015101004401003F - 00004205013B000050090647000062070A59000074060C6F0004700403700502 - 7304027703027A02027E02028000018200018200018400018200018200018000 - 017F00017D01017D01018000018000018000018000014100004705063900004A - 0A0A3900004E08084600005700006905057103037901027F0001800100820000 - 7F00007C01007600007707075E0000640A094500004D07073B00004105063A00 - 014404093900004B080B3A00004909093A00004003013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033F000046060639000048 - 0A0A330000420A093300003B03023700003F0706350000480A0A3A00004C0809 - 3F00004C00015000005D04005300006A0C075C0000740D0A6B00007708067804 - 037A02028002018102018501018701018800018800018600008300008100007C - 00007400006D01006501015E02014C00004F04023E00004C0C0B350000420A09 - 3000003E01005204006105006B07037205037A02028000018400018500028400 - 018200017F00017F00018000018200018400028000027700037000036600025E - 01024F02004502003A02003602003901004809054200006009075A0000780508 - 79000085050A7902037504027903027A02027E02028101028200018400018400 - 018400018200018000018000017F00017D01017D01017F000180000180000180 - 00014200013D00004606063900004807064100005402015800006C0405750303 - 7C01038000018200008100007F00007A01007601026A00006907075100005004 - 053C00004304063E02033F00043A00004605073A00004806073A00004404033D - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A000044030540 - 00004400023F00004605073700004108073300003B0504360000380300350000 - 4207053900004C06064300004E02035000006102006200007007046700007609 - 076F00007B08057A03017D02007F010080010082000084000084000087010185 - 01018200017E00017700007100006700005F00005500004E01004700003C0000 - 4407053400004209083400003C04034100005E03006C04007504017A03018001 - 008600008700008802028200017F00017B00027901027901027901027B000478 - 00046600005D00005700015000014701013F02003902003801003C0200410000 - 5B0A075C00007606067500008B02068800037F00017B01017D01017F00018000 - 018200018500028700028600018400018200018000018000017F00017D01017D - 01017F00018000018000018000014100004200013E00004301024100004B0101 - 5000005C00007003057902038001038200018200008100007E00007A01007000 - 006B04025D00005502004600004201003E00014004053E00034100043F000043 - 00033F00004202023D00003E01004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004100014300014400023F00004001033800003B0302 - 3600003701003902003B02003E00004502014700005000005000005900006D03 - 027605037401007B06037700007D04027C01008002018001007F00007F00007F - 00007F00008001008102017F03037801027301016D00026600015C0000520000 - 4A00004500003F00003D03003700003C03013700003E02023E00004C01006703 - 007804007C04008103008500008800008700008602027F000179010174020270 - 02027002047002047002046B02055500004E00004900004700004201003F0200 - 3E01004001004000005103005F0400710A077802018402038700008900018100 - 007F00007F000082000184000186000187000287000286000184000182000180 - 00018000017F00017D01017D01017F0001800001800001800001420202410101 - 4404044000004701014A00005901016300027002047901028000028400018400 - 008200007F01007902007103036400005B01004E00004A02023F00003D01023A - 00003E00033F00024300034100004301023E00003F02003E01004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E0000410002410001440002420000 - 4300033E00003E02023800003B02003900004005034202014400004700004E00 - 005600005E01026804047403017B02007D02007D02007F010080010080010082 - 00008001007F00007E00007C01007B02007A03017A02027605036D0506640202 - 6103045400005000004500004502003F02003C01003900003C03013A00004202 - 013F00004400015100006F03007D010080000084000087000088000088000281 - 01027901027101016F07086503036706085F00005F00005600004C0103430102 - 4400014300004200004500004700004D00005D06046405026D03027403017B01 - 0182000086000087000084000184000184000186000186000186000186000186 - 00018400018400018200018000018000017F00017D01017D01017F0001800001 - 8000018000014000004606063C00004907084000005404055600006801047401 - 047D00028200028400018400008200007F01007803006C02016506034F000053 - 06033F00004707063800003B01023D00024402073B00004A05083A0000460606 - 3A00003D02003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004200024200004702053B00004805083900004305053900004000004502 - 014801004C00005000005A00006000006703037004037B010180010080010082 - 00008200008200008400008200007E00007C01007C03017A0502750402720301 - 6E01006601005F02035B08074B00005207053E00004607033B00003D05003900 - 003E05033600004707063C00004D050545000056000074060281040085020087 - 01018700008600008100007A00017202026E08095C0000620A0A5100005A0608 - 5100004E00014100003C00004000004600004B00005200005900006000006B04 - 027002027602017B01017F010080010082010084000086000186000186000186 - 00018700018600018600018400018400018200018200018000017F00017F0001 - 7D01017F00018000018000018000018000014103033A00004B0B0B3C00005309 - 094900006305066900017800047F00028400028600018400008200007D020076 - 03006B06045800005B08064300004E0B0A3700004206073800004000053A0000 - 4A070A3C00004B090A3900004407053A00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004401063C00004A070A3A00004C08 - 093C00004903034500004D00005200005800005F00006600016C020171030379 - 05047F01008200008200008400008400008400008200018000017D0000790101 - 7804037205036E04036702006000005700005404034400004F09093A00004909 - 083500004108063A01003C0301360000470A083A000051090943000052040553 - 00006F04017A03018103028303048402038201047B00027300036F07085C0000 - 610B0B47000057090A4300005104074700003E00003C00004300004C00015700 - 036201036D02057502057901027D00027F00018000017F01007F01007D02007F - 0100840001870001870001870001860001860001860001840001840001820001 - 8200018000017F00017F00017F00017F00018000018000018000018000013C00 - 00460808390000500C0D4300005C080A5900007002067B000482000286000287 - 00018600008200007D0200740300650100600905470000550C083A0000480D0B - 3400003C02033C000147050A3A00004F0A0D3A00004A0A0A3700003E03013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 0147050A3A00004F0A0D3E00005207094500005200005900005D00006501016B - 01007202027703027903027D0303800100840000840000840000840000820001 - 8000017F00017B01017702036F03026903046101015A00005300004C00004400 - 00480706390000490C0A350000460B093400003E05033A00004508063900004F - 0C0B4000005309094300005300006100006A00007000007702037B0307790407 - 7204066D04075F0102600A0A450000560C0C42000051080A4200004A01034400 - 004700004E000159010165020470030579040781030880000284000284000182 - 00018001007F01007B02007D0200840001870001870001860001860001840001 - 8400018200018200018200018000018000017F00017F00017F00017F00018000 - 018000018000018000013E02023800004C0C0C3C0000560A0B4C00006906086D - 00027D00048400028700028900018600008200007D0200720400670603500000 - 570A074000004D0D0C3500004208093800004000053900004B080B3C00004D0B - 0C3900004508063A00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083C00004101063700004A090B3C0000550A0C4700005C030658 - 00006601036C01037201047702037A02037E02027F00017F0000820001820001 - 8200018200018200018000027F00027B00027803046F02046501015C00005300 - 004E0000480000450000430201390000470909370000490B0B3700004507073D - 00004202013900004B0A093C0000510B0B3E00004C06064800004F0000570000 - 5D00006402026803056803056502046002065801044A0000560B0D400000560B - 0D4200005104074B00005600005B01006100026701027002047702037F020483 - 02058400028600028600018400018200017F00017D01017F0001840001860001 - 8600018400018400018400018400018200018200018000018000018000018000 - 018000018000018000018000018000018000018000013A000044060639000050 - 0A0B4300005D06095F00007403077D0004860002890002890001860000800100 - 7D02007204006001005A08034300004F0B06370000450C0A3500003D03043C00 - 014604093C00004D080B3A00004909093800003E03013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A000040010338000140050939000050 - 090C4500005F080C5A00006900037001057702057C0103800102810102820001 - 8100008100008200018200018200018200018000027F00027B00027801027002 - 046701025C00005000004800004300004000004002023D00004505053900004A - 0A0A3A00004A08093C00004301023F00004706053C00004B0A093A00004A0908 - 3A00004302014401004800004D01025101025600025500015400015100004A00 - 004F0406400000530A0C42000057080B4C00005A00026802036E020171000374 - 02027801027C0103800103830003840002840002840001840001820001800001 - 8000018000018400018400018400018400018400018200018200018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00013D01013A00004707073F00005305065100006A03067300047F0004870002 - 8B00028B00018600008001007D02007204006104014F00004F06023C00004609 - 073600003F06073A00013F00043C00004904073C00004806073A00004205033B - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053D - 000039000335000045060841000059080B5700006C050A6E00037800057D0004 - 8200028400018600018600008701018501018200018000018000028000027F00 - 027D00027900047401046800006000005500004B00004300003D00003A02013C - 02034201033E00004A05083D00004D07084000004B02044300004600013F0000 - 4706053900004508063600003E05033601003704023903023E02024200014800 - 014900004900004900004A00024300004C03054200005405084D00005C050963 - 00047800047F00017F00027F00017F00017F00017F0002800002800002800002 - 8200028200028400028400028400028400028400018400018400018200018200 - 018000018000017F00017F00017F00017F00017F000180000180000180000180 - 00018000018000018000018000013E00003F01013F0000460203480000590003 - 6700017901068400048900028900028700018400008001007D02007203015C03 - 004E04004500004303003D00004005033B02013E02034000014200023F000043 - 01023F00004202023D00003E01004000004101013E00004202023E0000420202 - 3F00004000004000014101013E00004202023E00004202023F00004000004100 - 014200013E00004202023E00004001033D00003C00013E00013F00023C000042 - 01033F00004300034200004100013E00004200014600005404055A0002690406 - 7201057B02067E00028200008500008800008900008800018901028703037F00 - 017B00027B00047900047601047201046F02046902055800005200004D000047 - 00004200013D01013A02013900013F0002430204410001470205420000480203 - 4500004700004700004600014100004202023C00003E02023800003502003002 - 013002013301013900014000014400024900024D00034B00014D00014B000052 - 00005300006100026702047406087E0001850000840001820001800001800001 - 8001038001037F00027F00028000028200028400028400028600028600028400 - 018200018200018200018000018000017F00017F00017F00017F00017F00017F - 00018000018000018000018000017F00017F00017F00017F0001460001400000 - 3F03033B00004701015200006E00047F00058900048D00028700028200017F01 - 007D02008001007403015100004200004303003F00004202013E000041010040 - 00004100004000004301023E00004202013C00003F02003E01004000003F0000 - 4301023F00004301023F00004200014100004100004000004301023F00004202 - 023E00003F01014000004300004200004301023E00004002023800003A020137 - 01003C03043A01023F03043E00004500034500004B00054A00004D0000540000 - 5E02016703017004037902037F00028500008900018D00008C00008A00008800 - 008700008502008203027800047100047304086C01046805075B00005400004B - 00004A00004400004502013E00004003013C00003D02003A0100390100380000 - 3C03023A00004202023F00004600024700014700014600004700034100004300 - 033E00004100023A00013503053001033604043800004103034200004C000150 - 00005600005D00006600016E02017503037903027B01017E0000800001820001 - 8200018000018000018000018000018000018000018000018000018000018200 - 0182000182000182000182000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017D00027B0002 - 7B00027B00024600004703043500004108073C00005804066C00008400078D00 - 048F00028600028000017B02007B02008200007602014F00004404033A000047 - 07063A00004706053D00004201004000004504033A0000470706370000440705 - 3A00003F02003F00004404033B00004807063A00004706053F00004201004000 - 004504033B00004707063900004407053A00004101004200004903033B000047 - 07063500004007053300003802013701013E0405380000480508400000530308 - 4C00005700045B00006100006902007203017A02028101028600008A00008D00 - 008F00008D00008900008600008302008102017C020272010571050B62000067 - 060A510000570406460000470101400000420503360000430806370000440705 - 3C00003F02003900003D05043400004307073700004606063F00004400024400 - 004902053F00004A040A3A00004704093C00003D00043700033B060933000042 - 08093A00004D05054A00005600005E0000660000700000790101800201830101 - 8601008500008200018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017F00027D00027F00027D00024900023E0000430A093300004D0A - 094A00007504088100048D00048F00028600028000017B02007B020082000076 - 02015200003B00004A09083A00004B0A093A00004706053F00004302013B0000 - 490908390000480B093700004407053C00004202013B00004A09083A00004B0A - 093A00004706053F00004302013A0000490908370000480B093500004207053C - 00004301023D00004A0809390000460A0A3300004007063800003D0101390000 - 4B070842000059080B4B00005F050A5D00006501006B03007004007704017F04 - 028301018700008800008B00018900018901038602028102037C030179010173 - 01017305096300016A060B5200005B0407450000500606440100420201380000 - 450A08350000480B093900004706053F00004301023A00004A08093900004B09 - 0A3A00004704073F00004201033A000049080A37000048090B3500004206073A - 00003D030437000048090B3A000052090B4500005805045900006501016B0100 - 7402027A02028103028301018401008300008200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018200018600028600028700028600024500 - 004A0607330000460D0C3C00005D090B6700008501088D00048D000286000280 - 00017B02007D02008200007602014F00004807063A00004D0C0B3A00004B0A09 - 3A00004302013F00004807063900004C0C0B370000480B093700004202013F00 - 004807063A00004D0C0B3A00004B0A093A00004202013E000045080637000048 - 0D0B350000460B093500004003013F00004806073900004C0C0C370000480A0A - 3700004202023C00004C04044300005C090B4E0000690B0C5E00006B05066F04 - 017504017A05027D040282030285010186000087000087000185000284020380 - 03057B04057303036E00006A000165000268070B5200005F0609490000520607 - 3F00004605043E0000450806350000480D0B3900004A0A093A00004502014500 - 004E05073E00004F0B0C3C00004B090A3900004001033A000043070833000046 - 0C0D330000440A0B3300004001033D00004B0407420000570A0D470000610A0D - 5700006604046B03047103037804037B03038103028102018401008400008200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018200018900 - 018B00018B00028B00014A01033D0000450C0B3300004C0B0A4A00007305097E - 00038B00048D00028600027F00017B02007D02008200007802015500003C0000 - 4D0A093C00004F0C0B3C00004807063F00004202013900004A0A093900004C0C - 0B3900004707063E00004302013C00004D0A093C00004D0C0B3A00004707063C - 0000400301350000460B09350000480D0B3300004108063A0000420103390000 - 4A090B3900004C0C0C3A00004A07064300004C00014700005E0808520000700B - 0D5F000076090B7301017B04027F040081040082040086020285010186000184 - 00018200028001037B03047704076F04066802036000005D00005E0004500000 - 5E070A49000055090A4000004906053E0000400301350000460B093500004C0C - 0B3900004807064300004C000245000054070A4000004F0B0C39000045070738 - 00003B0302300000410B0A300000450D0C3300004108073F00004B00004A0000 - 5D060A4E00006A0C10590000700B0D6B03047204067604047A04037D03037F04 - 0281020182000082000080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018200018900018B00008B00018B000045000049050633000044 - 0B0A3A00005A07096700008201088900048B00028400027F00017B02007D0200 - 8200007802015100004B05053E00004D0A093C00004C09083B00004302013E00 - 004606053900004A0A093900004909083A00004302014100004906053C00004D - 0A093A00004909083800003E03013A0000420705350000460B09330000430A08 - 3400003E02023C00004604093900004B080B3C00004E08094300004E00015200 - 00600605570000700B096400007C0A0A73000081050582040085020085020085 - 02008701018501018301028101027D00027901057103056A03066302045C0104 - 5500015100004E0000560305450000560A0B4000004C09083A00003F02003A00 - 00420705350000480B093900004909083B00004701014A000054030643000051 - 080A3C00004709093400003B03023500003B0806300000430B0A350000470909 - 3A00004B00025200006400055800006F090E5E0000750C0F6D000278070A7604 - 047902037A02027C02027E030180020181020181020180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000182000186000086000087000086 - 00004B00024000004007063200004606054A00006E03067C0004870004890002 - 8200027D01017B02007D02008200007802015600004300004D05053E00004A07 - 063D00004504034000004101003C00004407053700004707063A000044040340 - 00004401004100004906053C00004807063A00004205033B00003D0200360000 - 4007053300004308063600004005033B00003F00023C00004704093C00004E05 - 074400005401035400006305066400007408076C00007E080777000085060584 - 01008700008701008700008700008600008200008001027C0103770205700305 - 6702045F01055700034E00024A00014700004A00004500004D05053F00004B08 - 073B00004306043B00003D02003800004407053700004707063A000045040344 - 00004B00014800004F03073C00004707073600003D0504360000380300330000 - 4007053700004A07064100004D03035000006801066A00007405096B00007908 - 0C7000007C070A7901057901027901027B01017D01017F00017F000180020181 - 0201800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00017F01007D02007F01007D02004900004501023900003B03023D0000510102 - 6700017C00068700048900028200027D01017B02007D02008200007901015700 - 004A00004700004901014300004502014000004000004000004101003C000040 - 03013E00004202013F00004100004300004600004100004302013F0000400301 - 3D00003C01003A01003B02003800003E03013A00004003013D00004000004100 - 014400044300014B00034A00005300015600005C00006C06077406067602017E - 05037D00008403008500008902008901008800008800008500008100007F0001 - 7A02037603067104066803055D02055400044C00024600024100014000014400 - 014701014100004302013E00004104023D02004005033C01003D02003C000040 - 03013E00004202014000004300004700014800024100004201033A00003C0302 - 3600003701003902003D02003F00004901014A00005300005400005E00007403 - 077D03097900057D04087800037D02067A00037B00027D00027C00017C00007C - 00007E00007F0001800201810302800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017B0200790200790200790200490000430000 - 3E05043800004205034D00006902057A00068600048700028000027D01017B02 - 007D02008400007B01015F02034E00014C00014600004701014100004302013F - 00004000003D00004003013C00004202013E0000420100410000430000440000 - 4502013F00004302013C00003F02003C01003D02003B00003F04023D00004404 - 034000004403024400014801044900034900004C00005300005C00026502046D - 05066F01037500017A00008001008400008702008A01008A0200890000860000 - 8500008100007F00017A02027503036F04065E00005600005200014700004500 - 033E00013D00043C00014000004000004202013C00004003013A00003D02003C - 01003C01003B00004003013C00004202013E00004201004100004100023D0000 - 3F03043900003D05043800003C05023B02004303024701014B00005100005900 - 006100006A01047403067B000480000480000480000480000480000280000280 - 00027F00027F00017F00017F00017F00017F00017F00017F0001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017F04027D0402 - 7C03017B02004800004804053600004109083800005406076300007A02078400 - 048600027F00027B01017902007D02008400007B010161000255050646000050 - 04054000004906053D00004101003D0000420503380000450806390000460605 - 3D00004401004400004903033D00004807063900004407053800003D02003B00 - 004205033B00004807063D00004C06064400004B01014B00004E000052000158 - 00025F00046601036D02047303037700017A00007E0000820000860100880100 - 8A02008801008400008100008101027F03037903027202026901026300025600 - 005401034400004A06073900004205093500003A01023B000042050338000045 - 08063500004207053800003D02003B0000400503380000450806390000460605 - 3D00004101013900003B05053400004007083300004108073B00004302014600 - 004E00005800006100006A00017000027601047C010382000484000284000484 - 00028400028200028200028200028200018000018000017F00017F00017F0001 - 7F00017F00018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017D00007E00007F00018002014C0002400000440B0A320000490C - 0A4400006B06087400038200048400027F00027B01017902007D02008400007D - 01016603054F00005707084500005309093E00004706053E0000400301360000 - 450A083700004A0A093900004706054100004701013F00004C09083A00004A0A - 093700004207053A00004104023B00004A09083E00005309094300005404054E - 00004F00005400005C00026302046B04077104067502057901027C00017E0000 - 8200008400008401008601008702008502007D00007901017A03047404047004 - 036701025C00005500005200014400004E0809390000460A0B3300003F060937 - 00003E0202360000450A08350000460B093500004407053C0000400301380000 - 4909083900004A0A093900004706053C00003A04042E00003E0A0A300000440B - 0A3900004B05054800004D00005800006400006F01037803067D020480010382 - 0001860002860001860002860001860001840001840001820001820001800001 - 8000018000018000018000017F00017F00018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018200018300008500008500018500004800 - 004D0708330000440E0D350000550B0B5C00007802078000048200027D000279 - 01017902007D02008400007D01016400015E070A490000580A0B420000500A0A - 3B00004104023C0000430806350000480D0B3900004A0A093C00004502014300 - 004A07063A00004C0C0B390000480B093500004003013E00004807063E000055 - 0B0B4500005B080A4D00005A00025A00006000006701026E0305750407780304 - 7C01037F00018000018200018400008200008201008201008002007D02007601 - 027103056D02046902056100025A00005100004A00004700004A07063A00004A - 0C0C350000440A0B3200003C02033A0000430806350000480D0B370000480B09 - 3700004003013C00004508063900004C0C0B3900004A0A093A00004002023300 - 003A080A300000460C0D39000052090B4800005800025C000065000070000279 - 0203800305820203830102840001860001860001860001840001860001840001 - 8400018400018200018200018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018200018400 - 028400028500038300014D00033F0000460D0C300000480D0B42000068050770 - 00017F00048200027D00027901017902007B02008400007D0101690406530000 - 5D090B470000560C0C3E00004908073C0000400301350000460B093500004C0C - 0B3900004A07064100004502013C00004B0A093900004C0C0B3700004508063C - 00004403023F0000540A0A4700005F0B0D4E00006204085E00006802036C0201 - 7002027402027901027D01018000018400018400018400008400008001007F01 - 007D02007B02007602016D05066403055F01025A00025100004E000048000045 - 0000430102390000480A0A350000480C0C3500004307073A0000400301370000 - 480B093700004C0C0B3900004707063E00004202013900004A0A093900004C0C - 0B3900004707063C00003C0304310000470B0C3A0000570C0E4A000062040861 - 00006E00047300037900047D00027F0002800001800001820000820000840000 - 8400008200008400008200008200018200018200018200018200018200018200 - 0182000182000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000017F00027A00017900027C00047C01054900004C060733000041 - 0B0A3500005008085900007300047F00048000027B00027901017803007B0200 - 8400007D010166000260070A4A000059090A430000500A0A3D00004104023A00 - 00420705350000460B093900004909083D00004502014100004906053A00004A - 0A09390000470A083800004202014100004D05054500005D090B50000067080C - 5E00006B02057305057605027802017900007D00008000008500008700018701 - 018701018200008001007B02007902007502006E02016204055902065300024D - 00004700004300004100004202023C0000420606350000460A0A350000470909 - 3A00004202023C00004407053900004A0A093900004909083A00004202013E00 - 004606053900004A0A093900004909083A00004002023A00004205093A000055 - 090D4A000067070D6300007201057B03087D02067F00027D00007D00007D0000 - 7C01007F01008001008001008001008001008200008200008200018200018200 - 0182000182000182000182000182000182000182000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017B00027100046C01046D00056A - 00024C00024200004108073000004007054100006201036D00007D0004800002 - 7B00027901017803007B02008400007F00016C03065800005B04074800005206 - 074400004706053E01003D02003600004207053500004707063A000047040342 - 00004401003F0000470605390000470706380000440403400000450000450000 - 5505064F000065070B5F000070060C6F01057703027903007C01007E00008200 - 008400008800008900008800018701018301027F000179010175010071020068 - 03015600034E00034A00014600004100003F00003D01023C02033B0201360000 - 4207053500004508063A00004504034000004101003C00004706053A00004807 - 063B00004504034000004201003D00004706053A00004707063A00004205033D - 00004000013F00005004084C000065070C62000177050C7900057E0006800004 - 7F00017E00007B00007700007702007902007D02007F02007F01007F01008001 - 0080010080010080010080000180000182000182000182000182000182000282 - 0002800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000178 - 01026201035602045600035200004A00004802033B00003B0401380000460100 - 5A00006C00017900047F00027D01017B01017B02007D02008200007D01016F01 - 036502045900005400024800004805043F02003C03013A01003B02003A000040 - 02023E00004301024000004100004000004101013E00004202013F0000430201 - 4400004900004C00005200005600006201036500017204087302067A05087800 - 007B00007F01008100008601008700008900008700018700028101027C010376 - 01026F03026802036503035C04044800004400004200004100004100023F0101 - 3D01023C00003C00003D01013C00004202013F00004502014400004300003E01 - 003D02003C00004202013F000043020142000045000045000044010043000045 - 02014100004303003F00004300004A000052000156000062010567000375030A - 7901068103097C00017E00007F00007F00007D02007902007803007902007D02 - 007F01007F01007F01007F01007F010080010080010080000180000182000182 - 0001820001820001820002820002820001800001800001800001800001800001 - 8000018000018000017F00018000018000018000018000018000018001007F01 - 007F01007F01008001008001008001008000018000017F00017F00017D01017D - 00027B00027901027901026F02044F00004600004800014A01034B0002450000 - 4303023C00004104024400005401005F00007302057D02048202038301027E00 - 007C01007C03017C04047800037502056B04075100004600003A000039060333 - 03003701003900004201033F00004300033F00004100043C0003380000360000 - 3E04054000004802024600005000005500006605026B04027002027402027900 - 047B00047F00047F000481020382030284020285010186000086000085000081 - 000183030879010672040A6200035902054B00004800013F00004100003F0000 - 4202023E00004202023F00004200014100004300004200004502014300004701 - 014300004800004100003901003500003C04033B00004404044300004802024A - 00004900004A00004B00004A00004700004400004200004A0000680404720104 - 7401047402027801027901027B00027B00027D00027F00017F00017F00017F00 - 017F00017D01017F00017F000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001820001820002820002 - 8200018200018000018000017F00017F00017F01007D02007F01007F01007F01 - 007F01007F01007F02007E04007C04007D03007F03008002007F01007F00007E - 00007D01017B00027D06077502057305076800006300005600004D0003430003 - 4100013E00004700004A04053C00004707063900004906034B00005C00006F03 - 027B03048202038500028200007C01007904017A04037C000081060A6700005E - 04033E00004008033101003405013401003E05043A00004A040A3C0000470409 - 3C00003D00053600023C06063800004806074300005603015600006502006F04 - 017602017901017F000180000282000284000484000282020381020182000081 - 000083000083000182000480000578000774060C5F00015F080C460000480508 - 3600003900013B00004205033800004707063A00004706053F00004600004400 - 004903033F00004C06063E00004B05054100004201003A00003D050435000044 - 08083800004707073E00004701014902004A00004900004A00004D0000500000 - 5201005D00007601027F00017F00017D01017D01017D01017D01017D01017D01 - 017D01017F00017F000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200028400028200018200018000018000017F00017F00017F01 - 007F01007F01007F01007F01007F01008002007F02008004008004007F030080 - 02008002008002007F01007D01017901027B06076A00007008095C0000620405 - 5400005200024000003D00003F00004302044903043F0000490909370000480B - 093C00005306045700006C02017902038102038301028001007E00007A03017B - 0303800103760000770A0C5000005208063500003C0906320200390302340000 - 49080A3A00004D070D3A000046030A3C00024003073B00004E0A0B4200005A08 - 075000006908056B02007403017902007D010180000182000284000286000284 - 00028101027F01007E00007D00007E00017F00027F01067B0307720007610000 - 66080D4A000055090D3A00004005093800004002023A00004909083900004B0A - 093A00004706054100004502013D00004C09083C00004D0A093C000047060541 - 00004701024000004C0809390000460B093300003E0704370000400300410100 - 4700004E00005600006000006901027202027B00028000018000017F00017F00 - 017F00017F00017F00017F00017F00017F00017F000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018200018200018200018000 - 0180000180000180000180000180000180010080010080010080010082000082 - 01008402008601008702008502008302008102017E03017A0202780606690000 - 6E070A5500006106094A00005703074B00014702054201034000013D00004000 - 004907083700004A0C0C3700004C0B0A4500005901016701027402027E010381 - 01028000017E00007B02007D04027D00008207096400006A0D0C4300004A0B07 - 3300003B06033700004307073900004D0A0D3C00004B080D3900004200054100 - 00500709450000610E0D5200006D0C096600007807047902007D020080000182 - 00018400028400028600028200027F00017B02007B0101790101790102760102 - 7300036E00046100006304084C00005A0B0E4000004B0A0C3600003F03043C00 - 004707063900004C0C0B3A00004B0A093A00004202013E00004707063900004C - 0C0B3900004A0A093700004302014900005304074200004E0A0B370000430A08 - 3200003B04013C02004200004C00005700006400006F00017900047F02048000 - 018000018000018000018000017F00018000017F00018000017F00017F00017F - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0182000182000182000180000180000180000180000182000182000182000082 - 00008400008400008400008600008900008900008800018701018301017E0202 - 7903027303036A00016A07095200005E070A4700005306094100004903043E00 - 003E0000400001430204440404390000470B0B3500004A0D0B3A000051070552 - 00006400006E00007A02038001028000018000017F0100800201830205760000 - 7A0C0C5600005F0E0B3E00004508063A01003C03023500004A090B3A00004D0A - 0F3A000047050A4100014C00004C0000650C0F56000075100E6400007B0A0877 - 00007F01008201008400008400008600018600018400028200027A0000780201 - 7803047604047103056B00026200005C00005A00024B000057080B4200004F0A - 0D39000045050A3C00004202023A00004B0A093A00004C0C0B3900004707063C - 0000400301370000460B09350000480D0B3500004308063E00004E0104480000 - 5408093E00004C0B0A3900004508043F00004300004C00005A00006501017201 - 047B000483000384000282000182000182000182000182000180000182000180 - 00018200018000018000018000018000018000017F00017F0001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000182000182000182000182 - 00018400018400018400018400018600018600018600018700018C00018C0001 - 8700018400017F00017700016F01036801045E00014E000059090A420000510B - 0C3A00004605073B00004302044201034000013D00003C000043070733000044 - 0B0A3500004A09084500005502015F00006A00017601027F0204810102820001 - 8001008101028100008205076A0000720E0C4D00005208043D00004306043C00 - 004406063900004B080B3A00004A070C3A00004900034E00006204055D000078 - 10116800007F0C09740000810201840100860100860000860000840001840001 - 8200027F00027700017402027103036E04036703035D00005400004D00004A00 - 004F05053E00004D090A3A000049080A3B00004302043F00004706053A00004B - 0A09390000470A083800003E03013A0000400705330000440B09330000430A08 - 3400004003014500005005074200005008084200005309094900005604035500 - 005E00006901027302057B020681010684000282000084000182000182000182 - 0001820001820001820001820001820001820001820001800001800001800001 - 7F00017F00018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000017F00017F000180000180 - 0001820001820001840001840001840001840001860001860001860001860001 - 8600028700028800038700038200027C00037400026C00016400015A00004C00 - 004E04043E00004C0C0C37000045090A3300003A00013A00003E000040000143 - 02043D03043700003F06073300004307073B00004C04044E00005B0000660001 - 7202027B03048001028200018400018400018503047800007B0607650000660A - 094A00004C02004502004101003C00004606063900004706083A000045020748 - 00005A00006200007407096C00007F0908770000830403820000870000870000 - 8600008400008200018000017F00027B00027301016B00026600015F00005900 - 005200004C00004600004502013D00004707073800004706083B000044030540 - 00004200013F00004706053A00004707063800004005033900003B0200350000 - 3F08053200004009063300003E05033900003F04023D00004906054200005906 - 055600006A05076D00037100017600027B00047E00058102048001037E00017D - 0000820001820001820001820001840001840001840001840001840001820001 - 8200018200018000018000017F00017F00018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00017F00017D01017F0001800001820001820001840001840001860002860002 - 8600028600028400028400028400048200048101067A01057601046E00036500 - 015C00005300004C00004500003B000042060734000041080B3400003C030638 - 00014304064302044100023D00003A01023C03043800003D03043A0000430303 - 4500004E00015400006000006D02047604047C01038000018400018600018301 - 027D01017500007307066400005800004B00004B04014300004101003E000042 - 02023E00004201034000024A00015E00006D00026E0000790302760000800100 - 8200008702008700008700008400008200017F00017D00027901027601046C01 - 036501015D00005300004E00004900004502014404033D02003D040239000040 - 04043D00004302044000004200014300004401003F00004202013E00003E0301 - 3B00003A01003902003A03003800003C03013800003E03013B00003C01003B02 - 004003014300005000015800006A01047400037F010784000687000587000584 - 00027F00017E00017C00017D00027F0001800001800001820001820001840001 - 8600018600018400018400018400018200018200018000017F00017F00018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017F00017D01017F00017F0001800001820001 - 8400018400018400028400028400028200028200048000047F00047900047203 - 076A03066502045E00045500014E00004500003E00003B00003A020136000039 - 03033400003B02053900033C01053B00003E0000400001430204370003380002 - 3B02033800003E02023E00004401004900005100005A00006301016F03027902 - 038001038500008400008200017F00017A02027403016B010061000054000049 - 00004901014100004303033C00004302043F00004401044B00016502046F0103 - 7200007600007B00007F00008401008601008802028300008202037B00007C04 - 057601047605087005086000005800005700014E00004C00014100003F02003A - 01003901003600003B03023800003E02033E0000420002430000430000420000 - 4302013E00004202013A00003D02003A01003B02003A01004005033E01004205 - 033F00004201004000004101004300004B00005800006500027200037C000384 - 00048A00058C00058C00038700028400027F00007C00007A00008004047F0303 - 8001028000018200018400018700028700028600018400018400018200018200 - 018000017F00017F000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017E00007C0100 - 7E00007F00018000018101028300038300038300057E00028100057B00007C00 - 067700037B03087203075A00004F00004E00014700004701023F00003F010139 - 00003C03043802023B05053500003B02033700003B0002390000430204420103 - 4000013D00003600023D04073400004307083700004606063F00004800004B00 - 005300005E02016802037503037D00028500008600008200017F00017E020279 - 03027101016700005B00005000004A00004805043B0000450707390000460507 - 3E00004D00036201036D00027000027500017B01017F01008200008200008200 - 008505067500007C07086A000072070A6500016504085800005700034A000051 - 05063E00004606053600003A03003600003B0504310000400807350000460507 - 3D00004400014200004504033B00004707063700004407053800003D02003C01 - 004306043B00004908073F00004D05054600004C00015101005401005B010163 - 00026D00037600057D0004850005870004890002880001860001830000810000 - 7F00007C00007B03037A02027C02027D01018000018200018500028700028600 - 018600018600018400018400018200018000017F000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017E00007C01007E00007F00018000018101028100038100037D00 - 0281030876000080080D6E000075060A6A00006302064900004504033A000045 - 07073500003F06053400003901003700003D0405340000410708350000440507 - 3C00004100023B00003D00003F00004302043B020533000045080C3700004A09 - 0B3A00004705064100004800004E01005702006303037002027B000284000286 - 00008100008001008001027E02027801027000006500005A0000500301410000 - 490908350000480A0A3900004806074A00005C00006500006B00027202027702 - 037A02027E02027D01017F05057400007C0A0A6300006F0A0C57000060040954 - 00015200024600005207093E00004B090A370000400706370000390302310000 - 420A09330000480A0A3900004705064100004302013B00004A0908390000480B - 093700004407053C00004303023E00004E08084200005608094900005A030659 - 00006702046C01046E00047001057201047502057901057A01057B00007D0000 - 8100018100008300008500008500008100007802017203017602017901017D01 - 0180000183010287000286000186000186000184000184000182000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000017E00007E00008001008001008000 - 018000018001037E01037C01057200007E0A0F660000730C115B00006203074F - 0000430303320000400A09320000420A093300004004043800003F0000390000 - 4806073A00004D090A3E00004D07084500014502054201034000013D00003700 - 0141060A3700004C0A0F3A00004B080B3A00004301024300004800005202015D - 03026C01037901028400028600018100008001008200018101027E0103780102 - 6E01036303034F00004F0805390000480D0B3700004B0B0B3C00004D02045400 - 005D00006601036C040571040674040477020376010273010177090B5F00006E - 0B0D5000005C070B4500004C00034700004E05073E00004D0B0C390000460A0A - 3300003C0302370000410807330000480C0C3900004B090A3A00004301023F00 - 004707063900004C0C0B370000480B093700004202014200004E06064500005C - 090B4E000066070B5800006900057701067C00067A00067A0006790105780004 - 7601047800047800017800017C00007E00008000018400018600018000016F00 - 006B02006F02007403017901017D010180000184000186000187000186000186 - 0001860001840001820001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018001 - 008001008001008001008000017F00017D00027901027500037A090D61000071 - 0D125200005F080C4900004800013800003A0907300000450D0C350000490909 - 3C0000460001460000500306430000560A0B430000540A0A4500004B02043E00 - 003E00004000014302043C00063500004A080D3A00004F0A0D3C00004806073E - 00004000004201004B01005702006701027601048200028700028100007F0000 - 8400008501018301027E02027303036905055502014200004B0B0A350000480C - 0C3700004B07084600004D00005200005B01016104036905056C04056F02046E - 01036F0406610000690A0E4C000058080D4000004603083B00004300033A0000 - 4A090B3900004A0B0D3700004307083A0000400103370000480A0A3900004C0C - 0C3A00004806073F0000420201370000480B093700004A0D0B37000047070641 - 00004A02024600005C080A5200006C080D5D000074040B7100027F0005820004 - 8000048000047E00037C00037A00017A00017901027901027901017A02027C03 - 017C03017E03017904016800006401006902006F02007602017A02027F000182 - 0001860001860001870001860001860001840001820001820001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018001008002008001008001007F00017D01017B000276 - 010475060A6500006B0A0E4E00005A090C4200004A05083C00003C0403320000 - 460B09390000530B0B4300005704065100005D020554000062090C4C00005D0A - 0C4700005204054600004602034201034000013D00003A000242040A3A00004D - 070D3E00004E070A3B00004002023C01003E0100470200510100630101730003 - 8100038700037F00007F00008300008600008600018101027902036C05035300 - 00500604390000460B093500004709093F00004B02044800004B000051010258 - 02025F02036202026501016501016100006305094D000057070C3E000046060C - 3200003A000538000142060735000048090B37000047080A3A00004201033F00 - 004704073A00004B090A3A00004A08093B00004202023C000044070537000048 - 0B093700004909083B00004701014800005703055300006F090E6300007B070E - 7200007E00067E00048100038100038300038300038300038400008200008300 - 038001037C02027802017403006F03006E03006804005C00005E00006401006C - 03007203017903027D0101800001840001860001870001870001860001860001 - 8400018200018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180010083010183020082000080 - 01007F00017D01017800037300036C01046A07094E00005405083E0000450608 - 3400003E05063A00004606053C000055090A4A000063080B5A00006600056700 - 056E070A5C0000690B0C4E00005A07064700004900003F00003E000040000143 - 02043F00053A00004903093E00004E040A3F00004503043D00003900003A0100 - 4202004F02006101017100038000058601047F00007F00008500008600008600 - 008200017901026E040358010046000046070333000043080639000048040545 - 00004300004600004A00005000005500005A00005D00005D00005B0003510000 - 5504073E000045050B31000036030A3200063801043500004005093500004505 - 0A3A00004502054200004600024100004905063C00004806073B00004404043F - 00003F02003800004207053500004508063A00004704034600004E0000520000 - 67060A6600007D091077000385020C7D00037800047800037E00038300038A00 - 018E00019400029400029100028900018200017600006802005E030056030054 - 03005200005800006002006804006F04017504027B0101800001840001860001 - 8700018700018600018600018400018200018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 01008301018302008301018001007F00017C00007700036F0103660002570000 - 5603054000004203053000003706083602024000004500005505065100006706 - 0863000073040872000378040970000373080B5F00006408074F000052030047 - 00004804054302044100023D0000400003410004410000470003430000470003 - 4000003E00003900003C01004101004C01005901016802037501067D02067C00 - 007F00008200008500008700008500007C00017202025F000054010048000044 - 04003E00004303024100004301023F01014101014300004700004C0000510000 - 5500015500015100005000024700004300033A00013802073300073503073900 - 033D01023A00014001033E000143000344000045000147000146000243000045 - 01024100004301024000003E00003C00003B02003A00004003013F0000470101 - 49000050000055000061000069000177060A7A020783050B8000058100067C00 - 037C00017F00018600028900028E00039000038E000389000281000176000068 - 01005C01004F01004501004501004A00005100005D00006902007403017C0202 - 8000018300008400018400018400018400018400018400018600018400017F00 - 027B00027D00027D00027F00027F000180000180000182000182000182000180 - 00018000018001008000018001008301018301018001027B01017601026F0101 - 6802036104035200004C00004400004301023900003B02033501013C02034700 - 005400005900006700036B00007702057800047B02067E03077D040877000374 - 03066400005F03025100004B01014000003E0000400001430204410000400000 - 4301023F00004301023F00004101004000004101004000004603024500005000 - 015000005D02056803057801027F00008300008400008500008500008300017C - 00017705056C05035F03025201004900004000003C00003900003B0203390001 - 3F03043C00004601044400004C01034B00014900004600004701023F00003E02 - 0337000038020239000140000142000045000341000047000343000046000245 - 00014600024400004700034100004500054100004400043D00003D0504390302 - 3B00004000004800005200005F01026902057001057401047800047900047B00 - 027B00027B00027F00028600018800008600008500008200018001037A020374 - 03066D04076201035C03064D00004901013F00004002023F01014502014E0100 - 5D00006D00018000028B00038E00028D00008700008200007F01007D02007F00 - 018200018700028400027800047201057401047800047B00047D000280000282 - 00028702048601038501018200007F00007E00007D00007E00008202037F0002 - 7901056A00006202025000004A00003E00003A01003A03003A03003B02003E00 - 003F00004200004800005C04046802037101017901027F00018001027C02027C - 02027D01017E00008300018000047901056A0104540002460000440104420103 - 4000013D00004200004504033B00004707063900004606053C00004101004000 - 004605043E00004C06064200005105064B000060060675030380000182000183 - 00008600008600008500018100017F02047601026901025D0100520100470000 - 3F01003800003900013E050834000043060A3700004704094000004601044200 - 004702053B00004707073700004206063600003D01014200004B02043F00004C - 06073E00004B05063F00004400024200004702053D00004A040A3C0000480208 - 3E00004100013C03023D01014100004900005400006000016C01047702057B00 - 047D00027F00027F00027D01017B01017901017F00018700008C000088000184 - 02027C02027402026901026101015B02055808094600004B0708370000420607 - 3700003D03043E02034901015B00016D00018400049100039300028F00008700 - 008001007902007803007D010180000187000286000478000572010574000578 - 00057B00047F00048200028400028500028500028400018200007F01007D0200 - 7D02007B02007700027703086500006507084C00004C07043800003503003405 - 013404003601003A00004200004A00005200025A00026503036F01017A000082 - 00018600008301017E03017C03017D02008100008800018700028000066E0004 - 5600034600003C00003D00003F00004302044302013B00004A09083900004A0A - 093700004407053C00004202013C00004D0A093E000051090942000053070859 - 01017103037E02028001028200018600028500018500018300017F0002780102 - 6E02016403005902004E010047000040000042040438000045090A3700004A09 - 0B3900004805084100014300033A0000490909370000480A0A3500004206063A - 00004202023B00004A08093A00004A0A0A3900004605073E00004401043C0000 - 4A070A3A00004C070A3C00004902054100004600014A00004F00005800026300 - 046C01047701067E03078000048200028200028200018000017F00017B02007D - 02008200008400008202037D03037702036D0100620000590000570305490000 - 51080A3C000049080A35000043060A3A00013C02034201005500016800017F00 - 048B00038E00028B00008400007D02007803007603007B01017F000186000286 - 00027F00047B00047D00047F0004800004820004840002840002830001810000 - 8000018001027C02027A03017903027203016B00035C000065070B4A00005509 - 0A3C00004407053800003C04003C02003F00004700004F000057000060010568 - 03056A02037101017D01018400018600008400007E03017C03017D0200810000 - 8600018600027E00066C01045400034400004502054201034000013D00003F00 - 004707063900004A0D0B370000480B093700004003013B00004808073A000050 - 0D0C3E00005109094500005805046E04037903027C0202800102830003840002 - 8500018300017F00017B00027402026B04026202025902005201004A00004400 - 004906093A00004C0B0D3900004B0A0C3900004203053C000045060835000048 - 0C0C370000480A0A3700004002023C00004507073700004A0C0C350000460A0A - 3500004001033C00004706083A00004F0A0D3E00004E070A4000004B00015300 - 015A00006100046700037001057901057E000584010484000286000286000184 - 00018200017F00017D02007B02007D02007C03017802017403016C0000640000 - 5A00005300004F00005105064000004E0A0B39000048090B3800003E04053802 - 023F02005000016200007800048500028800028600008200007B020078030076 - 03007901017D0101840002860002840002840002840004840004860004860004 - 8600028400027F00017F00027C01037A02027702037203016F01016702005500 - 00570406450000550B0B3E00004B0A093900004303024300004600004E000055 - 00005F00006600016F02047204066F03027402027F0001860001870000840000 - 7D02007B02007D02007F00008600018600027E00066C01045400034400003E00 - 003E00004000014302044202013900004A0A093700004A0D0B3500004308063A - 00003E03013800004C0C0B3A00004F0C0B3E00004D07074F0000670303710101 - 7601027A02037E01038000028400028300018100017F00027A02037303036D03 - 026602005E010057000052020344000052090B3E00004D0B0C37000044080839 - 00003B0302320000440B0A330000480C0C3700004707073E00003E0202350000 - 440B0A330000460D0C3300004108073A00004103033900004D090A3E0000530A - 0C4300005304075100006601036E01037201057702057E000581000386000286 - 00018900028900018700018600018200007F01007D02007902007605036F0401 - 6A00006400005E00005900005200005000004C00014000004E08093C00004B0A - 0C39000047050A3B00003602023B02004A00005D01007100037E020284000183 - 00008001007B02007803007603007901017D01018200028600028B00028B0001 - 8B00028B00028900028700028400028000027F02047902037503037002026B00 - 026601006100005900004A00013900004909093900004C0C0C3A00004C060647 - 00004C00005300005D00006601007002047801027C01037B0002760102780102 - 8200018700018700008600007D02007B02007D02007F00008600018400027C00 - 066A01045300034200004401044201034000013D00003E000046060537000048 - 0B09350000450A083600003E03013900004207053700004B0B0A3A00004B0807 - 3E00005003015D00006700006D01007202027902037E01038000028100018500 - 038100038001037A02037601026F01016B010066020257000058030747000053 - 080A3C00004909093600003D05043500003D0706300000440B0A350000490909 - 3B00004202023C0000400706330000430B0A320000420A093400003E02023C00 - 004705063E000054090B4700005C080C5100006201057401047C010380000581 - 00038500038700028800018A00018900018700018600018200017F01007B0200 - 7902007403006905016203005C00005600005100004E00004C00004B01004400 - 004A04043C00004B090A3A000049080A3B00003E02033802013902004800005B - 01006E01037901018000018100008001007D02007902007902007B01017D0101 - 8200028700028D00019000018F00018D00018900028400028000027B00027904 - 057103036A02036301015D00005800005600004D00003A00003B050533000045 - 09093900004E08094500005401005900006200006D01007503037D0204820203 - 8400017E00007A02037A02038400018900018900008600007C01007801007B02 - 007E00008500018400027C00066A01045300034200003D00003E000040000143 - 02044101003C00004407053700004308063600003E05033900003A0100380000 - 4409073900004707063A00004403024800005200005B00006400006C01037302 - 057A01057F00028200028601048601048301028000017D010179010178020171 - 03036300005600005B02054700004E06063C0000410604370200360301310000 - 3D07063200004506083A00004702054000004100023800004206073300004108 - 073400004004043D00004000004100005105064C000060070A59000067060A6B - 00037D00028600018600028700018900018900018A00028A0002870001840001 - 8000017D01017902007603007403006B04015C01005300005000004D00004800 - 004800004600004502014302013E00004806073B00004906093C00004502053C - 00003901003A01004800005801006C0103790101800001820000820000800100 - 7D02007D02007F00018000018200028700028F00019000008D00008900008600 - 017F00017901027202026E03056503035D00015400004F00004A00004A000043 - 01023900013000003E05063700004A06074400005501035900006600016E0002 - 7801027E02028202038501018600008200007E02027E01038800028B00018B00 - 008500007C01007801007B02007E00008500018200027A00066A010453000342 - 00004603064302044100023D00004000004101003E00004003013A00003E0301 - 3900003A01003800003C03013C01004005033B00004101003F00004500004B00 - 005200005C00006402026D02047502057B000280000287020586010487000283 - 00008100008000018102037C04056900006300005900005600024A0000480202 - 3E01003B04013701003603013500003B03023C00004300034200004300014100 - 014100023E00004001033A00003E02023D00004000004100004A00004F00005D - 02056100026C03066F01077A0207820000870000870000880000890001880002 - 8801038702048000017D01017901017602017003016D05006B04016406014E00 - 0048000048000047000044010042020041010040000041010043030240000045 - 03044000004401044100004000013A01003E01004A00005A00006B0002780201 - 7F00008200008400008400008200008200008200018200018400028600018B00 - 018B00008700008400007D01017802017002026904026205045803014F000047 - 00004200004000004202024004043800003A01043C0000450003480000530001 - 5900006200007403067902037E02028001008300008500008500008400007E02 - 028001038A00028D00018D00008600007E00007801007B02007E000083000182 - 00027A00066A01045300034400003E00003E0000400001430204430201400000 - 4303023C00003F04023B00003D04023B02003A01003900003E03013A00004003 - 013C00004101004300004A00004B00005300005500006501016B00007A050681 - 04068100038500038700028600018600008500008300007F00007B0307700305 - 6700035C00005100004900004100003D00003B04013702003C04033800004102 - 044000004601044600024500014400004500033F00004202023E000042010043 - 00004900004F00005800006300026B00037401047900057F0004870002890001 - 8900018700018500008100007D00007800007C05067303037206056500006403 - 005900005A00004F00004900004000004302013E00004202013C00003D02003C - 01003C00003D00004202023F00004300034100004600024100014002023F0000 - 4C00005500006C01037500008000018300008800018800018800018600008600 - 018300008300018300008500028301018405067A02027606066700005F000053 - 00005200004A00004701013E00004002023900003B02013B00003D0000410000 - 4900015000035A00056302066C03067403077800047B00027F00018001008200 - 008201008201008002007D01018000028900018D00018D00008700007F010079 - 02007C03017F0100830001820002790005690003540003450000440104420103 - 4000013D00004300004605043C00004707063700004207053900003D04023900 - 003E05033600004308063700004407053C00004201004200004B040144000058 - 05045500006D07086D00017D06077E0103830102870002870000870000860000 - 8600008300007D02047601046D00026400005B00005000004800004100003E01 - 004106043500004307073700004704074000004801044800004D01054100004C - 05083C00004705063F00004600004A00005200005D00016701027201047B0004 - 8000048400028700028600008400008200007E00007A00007802017303036D03 - 026E09075D0000630A064F00005805034A00004A000042000042050338000043 - 08063500004207053600003B02003B00004004043A00004707073C0000490407 - 4100004400024100004603024500005E04036100007C08077C00008701018900 - 008B00008800008800008500008300008100017F00017C00007D070670000077 - 0B0A6000006308044F00004D00004500004603003B0000440907340000400706 - 3500004000004900005000005500035D00046600056D02057501067A02067D00 - 027F00027F00018001007F01007F02007D02007D02007D01018000028B00018F - 00018D00008700007F01007902007C03017F01008500018400027B00056B0003 - 5600034700003C00003D00003F00004302044903033F00004C09083A00004A0A - 093700004308063C01003E0301360000450A08350000480B093700004606053E - 00004202013B00004D0707450000600A0A59000071090A7202027A0203800102 - 8200018600008600008601008600008300007F00017901027500016D01006400 - 005B00005000004900004903033D00004909093700004A090B39000048050A43 - 00034C000546000052060A4000004D090A3C0000490605430000490000530000 - 6100026D02047702058001038700038700028600028300017E00007B00007700 - 007402026F05046B07076205045700005E0B09470000560B094000004D060341 - 0000420201380000470909350000460A0A3300004007063800003E0202360000 - 4909093900004D090A3C00004B05064300004501023F0000560607500000700A - 0B6A00008408088300008700008900008A00008800008500008100007E000178 - 00017404046500006F0B09550000630C0A480000500604410000410100370000 - 470A083500004A0D0B3700004505044300005A00026200036600056B00057100 - 067600057A00067E00057F00027F00027F00017F01007D02007B030079030079 - 02007D01018000028B00018F00018D00008600007D02007803007A03017F0100 - 8500018600027F00056F00045B00044A00014702054201034000013D00004600 - 004D07073E00004F0C0B3A00004B0B0A3900004005033A000043080635000048 - 0D0B370000480B093900004003013900004308063A0000540C0C490000650B0B - 5F00007105047601027B01018001008200008401008401008601008401007F00 - 007D01017901027402026D00026400005B00005100004B00004F07073C00004D - 0B0C3900004B0A0C39000045020747000153030A420000510A0D3C00004B090A - 3A00004502014800005201005F02016D03027803048102038700028700018200 - 027F00027D00027801027202026D020465030360030453000057070643000055 - 0D0D3C00004C0B0A3A00004303033E0000450707370000480C0C350000440B0A - 3300003C03023A00004307073700004C0C0C3A00004D090A3E00004501024000 - 004B0505450000610C0A570000790E0B74000085060585000088000088000085 - 00008000017D01017801027002026400006508094E00005E0D0A430000520B08 - 3B00004405013B00004407033900004D0C0B3C0000520B084400005502016801 - 047100047300047600057900057D00048000058000058000028000027F00017F - 00017D01017B02007902007902007B01018000028900018D00018B0000860000 - 7B02007803007A03017F01008600018700028100067100045D00044E00024000 - 003E00004000014302044D0303440000520A0A3E00004F0C0B3A00004808073D - 0000400301370000480B093700004C0C0B3900004807063C00003B0302320000 - 460B093A0000580D0B4A00006508076300007002027602017B02007F01008002 - 008201008402008201008100008001007E02027A02027402026D01006400005C - 000057000349000054090B3E00004C0B0D37000044070B3D0002490005430000 - 51070B3C00004A0C0C3500004308063C00004300004B01005902006703017503 - 037E02028500028600018000027C01057A02067704076E03056601035B000051 - 00004F0102430000500A0B3A00004C0C0C3700004506083C00004300033A0000 - 4B080B3900004A0B0D3500004307083A00003E0203350000480A0A3900004D0B - 0C3A00004A06074100004200013C0000540A0A490000670D0C5C00007A0B097B - 02008001008400008400008102017C02027504027004036905055E04044D0000 - 57090A4000004E0B0A3900004609073B00004205013B00004E09064200005909 - 084C00006309096501017502057C01057C01057E000580000580010380000280 - 00028000028000028000027F00027F00027D01017D01017D01017B0002800002 - 8700018B00018900008400007B02007803007A03017F01008700028900028300 - 067600056100055100034801044201034000013D00004A000051050642000051 - 09093E00004C09083D00004404033E0000440705370000480B09390000490908 - 3B00004003013400003A07053300004B0B0A4000005808075300006201006C02 - 017102007803007B02007D02007F02008103008103008301018301018001027E - 02027901027500016D00026701025A00005C030647000051080A3A000045090A - 3500004003074300014D03093C00004A090B330000400A093100003B04003E01 - 004801005402006103006E01007800008200008200017D000279010578030672 - 04066801045D00005200004A00004700004B05063A000048090B35000045080C - 3700004101064100014904073C00004B080B39000047080A3800003E02033A00 - 004206073700004A0A0A3A00004A08093D00004301023D00004606053E000056 - 0C084A0000660A056600007706037E03018002018002017B02007403016C0300 - 6703015E04034F00005106083E00004A09083700004409073700004005034102 - 004C07044300005B08065200006B09096500007606067C010381010281000381 - 0003810003810003800002800002800002800002800002800002800002800002 - 8000028000027D00027F00028700018900018700008200007902007803007902 - 008001008900028A00038400077901066400065400044100003E000040000143 - 02044F01024700005004054200004C06063E00004605044000004101003C0000 - 4606053900004807063B00004704033D00003701002F00003F07063800004D08 - 054700005902005B00006803016E03007302007803007903007C04007E040080 - 04008402028402028301018001007D0101790102760104700305630002560000 - 5702064200004805083700003E05083A00034200044100004605073500003E08 - 072D00003707033402003B03004202004D01005901006600007401007F010081 - 01027C01057600057200036C00026300025A00005100004B0000490003400000 - 47050A38000043060A3700004002083F00024600044300004B03093C00004805 - 0A3A00004403053D00003F00023A00004606063900004806073B000047030440 - 00003E00003B00004808074000005306035000006704006C0100790401790200 - 7902007401006C01006401005C01005401004B00024000004704073700004307 - 073700004106043E01004502004600005906045700007008096C00007D06077D - 0002820001840000840001820001800001800001810102810102800002800002 - 8200028400028400048600048600048400027D00027D00028600018900018700 - 008200007902007603007902008001008900028C00038600077A000667000755 - 00044A03064302044100023D00005600005600005000005101004800004A0300 - 4300004202013E01003F02003C00004202023F00004301024200004000003700 - 003603013500003D04033E00004702004A00005100006005016504016A030070 - 03017603007A04007C0400800300830403840202830101810000810000800001 - 7F02047B03076B00006600005900005400024800004602033E00014001034300 - 014400023E00003E02033500003704023202003502003A030040020048000050 - 00005B00006501007101017303037103076A01046300005C00005300004F0000 - 4C00024A01034200024302043D00024003073D00024101073D00034200044900 - 014D00024A00004E00034A00005000024D00005000005000005100004C00004E - 00014800004901014400004100003E0000400301410000490401460000520000 - 5700006103006904026804006702006302005D00005800005100004A00004100 - 004001033D00004103033D00004404034300004901014900005500005D00006E - 06077302057D06077D0004800002830000830000830000820000800001800001 - 8101028101028000028000028200028400028600028600028700048400027F00 - 027F00028400018600018400008001007902007902007D02008200018900018A - 00038400067A02076801045801044400003E00004000014302047207046E0502 - 6602005B00005100004900004100003D00003E03013A01003F03033C00004302 - 044200004800064400043C00033800003902053700003B02033800003F010141 - 00004B01005000005E02016200007002027600007F02048001028001007F0000 - 8100008200008500008500008500008300017F00027900047302056903045F03 - 025401004B00004600004A01034400014703043F00004103033A00003B020139 - 00003E03014000004603024700004F01024F00005800025400005000004B0000 - 4C00014700004701013F00003F01013C00003C02033A00013D03043B00004102 - 043F00024200054500014D00005600005C02026103046905056E040374020277 - 00017B03047901027301016B00025F02015300004700003E0000430000440000 - 4901014700004E01004A00004D00004C00004A00004700004C02024600004D03 - 034A00004F00034800013D04023904013B02003E01004400004800004E000054 - 00006603056B02057001057400057800057900047B00057D0004800001820001 - 8200018000018000018000018000018000018000018000018000018200018200 - 018200018200028200018000018000018000017F00017F00017D01017D01017F - 00018100008700028700028300007D00027503036902005800004A0103420103 - 4000013D00007B04027603006E01006501005B00005000004600003E00003C01 - 003F06053500004307083900004903094200014800073F000240030734000040 - 070A3000003D07073500003B02014100004D05054D00006306075F0000740608 - 7300007A02037C02027D02008000018300008600008800008800008800008600 - 028000027C01037303036A03016001005800005000004900004B02044000004A - 06073B00004707073B00004103033E00004305053B00004806073E00004B0506 - 4400004A01034200004404033A00004508063500004007053500003A02013900 - 014006073800004607093B00004904074100004B00015700015F00006602026B - 04027503037C02028200008600008C00018900008100007800006A02035C0201 - 4C01004400004400004903034100005006064300004F05054100004200013C00 - 003E05043500004408083A00004A05084400004701023C01003902003E010044 - 01004D00005700005E00006500007201057600057900057B00057D00057D0005 - 7D00057D00047F00028000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302047F00017B01017501006B02006001 - 005501004A000042000044040338000045090A3500004A080D3A00004A040A43 - 00034300053A000047080A350000440A0B3300004206063C0000450403430000 - 570A084A0000660A095900006B05066900007504027A02027E02027F00018400 - 018500008600018600018500018200027E01037702036F03026702006200005A - 00005100004300005106084000004E0A0B3A00004808083F0101400404380000 - 4709093700004B090A3A00004A06074300004301023A0000490909370000460A - 0A3500004206063A00004103033B00004D090A3E000054090B43000053040751 - 00006300026900036D02047103037803047C0202820000850000890000860000 - 8100007901016E03056105045303024902004502013B00004C09083C00004F09 - 093C00004706053C00003C0302340000420A09330000480A0A3A00004A040544 - 00004100004100004900005001005902006202026B03047302057800047B0004 - 7D00047F00048000048000047F00047F00048000028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00008300 - 008000017B01017203016902005D02005300004900004200004808073700004A - 0B0D3900004B090E3C00004701074100014A040A3A00004C0B0D39000048090B - 3900004202024000004D0707400000570C0A4700005C09074D00005D00006E04 - 037504027703027C02028001028200018500018500018500018400027F00027C - 01037702037002026E0103670303530000580408470000570A0D420000510B0C - 3C00004404043D0000460808350000480C0C370000490B0B3B00004404043E00 - 004707073700004A0C0C370000480A0A3900004301023F00004D050543000059 - 0B0C490000610B0B5300006204056F01057501067603067803047B03047E0202 - 8001008400008700008500007F00007901016F02046303035701014B00003F00 - 004508063900004C0C0B3A00004A0A093700003E030139000041080733000047 - 0B0B3900004C08093E00004B01014B00005000005700005E0100670303700305 - 7704077D04087D00048000048200048200048200048200048200048000028000 - 0280000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302048800008600018101027A02027202026602005D010052 - 00004E02034000004E0A0B3A00004C0B0D3900004807094000004500033E0000 - 4D080B3C00004F0B0C3C00004806073F00004504033B00004E0B0A3C00004F0C - 093E00004C07044900006304016C02017002027503037A02037F000282000283 - 00018500018300018200028100037E01037A0203790203710305650106550000 - 630A0D4A00005C0C0D4300004E06064300004504033B0000490C0A350000480D - 0B3500004209073B00004001033700004A090B3900004C0C0C3A00004C060645 - 00004900004700005B08075000006B0D0E5B0000700C0C6F02047B01077F0107 - 7F01067D02047D02047E02028001008200008501018400007E00007800006F01 - 036501015B00004D0000430201350000460B09350000480D0B35000043080638 - 0000400503360000480B093900004C0B0A3E00004E06064D00005C0000640000 - 6600016D00027401047901057F01068302078400048600048600048600048600 - 0484000484000482000280000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00008E00028C000287000281 - 01027801026E02016602025D03025100005305064000004F090A3A00004A070A - 3C00004502053F00004904073C00004D080B3E00004E08093D00004501024200 - 00470605390000490C0A350000450B063600004502005601006201006701026D - 03027303037902037D00027F0001830001830001830001840002820002810003 - 8001037A01056D00036D070C5C0000690A0E5000005E070A4B00004E00014700 - 004A07063A0000480B09370000450A083600004004043C00004604093900004B - 080B3C00005007094400005000014E00005D03025400006F0B09600000790D0C - 7000007E07088400068700068300058100038001038001028002018102018301 - 018200007E00007800007100036800015D00004F000041000042070533000044 - 0B09330000430A083400003E03013E01004707063C00004E0808420000540809 - 4700005903036802037100037300037800047B00048000058300058500058600 - 0487000487000486000486000484000484000482000280000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02049200039100038A00038400027D00027601026F02046905055C00004E0000 - 5204054200004C06063E00004604054000003F01013A00004606063A00004A06 - 073D00004903034200004502013D00004606053600004209073400003C07043E - 01004D00005800005D00016503036C04057302057800047D00047F0003810003 - 8300018500018500018600028400028100057A02076F000275060A6700006D06 - 095D00006104055700005301004900004D06033E00004808043B00004306023E - 01004100023D00004903093E0000500507460000540103540000610304620000 - 7107066900007B0A087400008108068101028900048B00058700048400028000 - 027F00018002018002018102018001007E00007B01017702056E010365000159 - 00004800003A00004207053300004108063400004005033F0000460300440000 - 5205034900005906054E00005B08076002037201047B00027D00027F00028200 - 0284000286000286000287000287000286000286000284000282000282000280 - 0002800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00009300049100038C00038500018100017B0002 - 7803067205076100005C00005200005101024800004A02024500004301023C00 - 003A02013A00004002023E00004501024200004500004200004401003E000041 - 04023900003B06033803003F04024600004F00005600005D03036403056C0405 - 7002047601047A00037E00038000008200008400008600018600018600027F00 - 037E00067900037A02077100027102066800026702045B00005800005000004F - 02004800004A03004700004701014500014600044500014C00034C0000530001 - 5600005C00006B05067307067403017C07047C01008104008100008600008D00 - 048C00048800038300017F00017D01017E03017F04027E00007F00007E00007E - 02027B03077403066D02055F01024A00004200013C00003E03013800003E0301 - 3F00004300004B00005300005500005C00005B00006303036002036B05067700 - 017F000180000282000284000286000287000387000386000286000284000282 - 00028200028000027F00027F0002800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302048D00028A0001 - 8A00018500008200007E00007A00037300037003056804046104035A02025301 - 004D00004900004100003D04023603003D06033900004104023E000044010042 - 00004500004200004501023E00004002023800003B02013C0000460001490000 - 5202035200005E03066100026A03066F01057502057B02068102048401048601 - 048800038700018600018800058700058500058200047F00047A000375000371 - 00036C01036602026101015D01005700005100005000004D00004D00014E0003 - 5000035300035900045E00046401036901026F01037500017800007D02008200 - 008502008702008A00018F00068C00068600038000007B00007A00007C03017D - 04027F01007F01008000018001027B02067601046C0001610000500000440000 - 4301023E00004003013E00004401004A00005200005D00006800016E01037003 - 057004036D02046F01017B000282000282000282000284000284000284000284 - 00028200028200028000027F00027F00027D00027B00027B00027F0001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00008800038700028700028500018300018100017E00037800037702 - 056F02046802036202025D01005500005100004A00003C02003C070434000042 - 09073600004606053D00004502014400004903033D00004A06073A0000460606 - 3A00004101014100004B02044400005406074C00005F06095B00006601036D02 - 047201047902037E01038100038500038600018700018A00038A00038A000587 - 00028600048100017E00037A00017601047101016E01036902006400005F0000 - 5F00005B00005700015600035800035D00036100046700036C01037101017500 - 017800007C010080010084010087020088020088000188000587000683000580 - 01037901027802017801007A01007F01008001008000018001027F0106780004 - 7100026300005200004D02043D00004707073700004606054300005100005E00 - 006800007400027901027A02037A02037601027700017F000282000282000282 - 00028200028200028200028200028000027F00027F00027D00027B0002790102 - 7801027901027F00018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302048001038100038100038200028200 - 028100017F00017E00017B00027801027101016C02016602006102005E020154 - 0300430300360000450B06350000490C0A3900004706054000004501023D0000 - 4E08093E00004D080B3C00004904074100004400023C00004D06094200005607 - 0A4900005A03065800006301016901026E00007301017901017D010180010283 - 01028800028A00028900028900018700028600018300017F00008001037C0202 - 7801027403017101016E03006D01006902006200016100046300046700036C01 - 046F01037401047801027A00017C000080010082000084010086010087020085 - 01018000047E00067B02067A0304780304760201760100780000800201820000 - 8200018101028101067900047300026600005700024400004E0809390000480B - 093900004D06035100006600017400027F00048300038401048101027D01017C - 00007F00018000018000018000018000018000017F00017F00017F00017D0101 - 7D01017B01017B01017901017802017901017F00018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00007702 - 037902037A02037E01038001038000028100018100018000027D000279010276 - 01027002026B04026804026106024900004C07043E00004F0C093C00004E0B0A - 3B00004504033F00004806073C00004F0B0C3C00004D080B3E00004500033E00 - 004704073C000050090C4000005306094500005300015800005D00006400006A - 00006E01007403017903027D0303820001860001860001860001870001860001 - 8600018400018200018000017F00017D01017901017903027703027304026D00 - 026C01036E01036F01037401047801027C01037E02027F000180000182000082 - 00008201008201008201007F01007901057302067002046F03026F0302710200 - 7502007A01008102018400008400018400018000057C01057400036900035300 - 005104073C00004A0C0C350000480B094000005500006D02047A02038601048B - 00038B00038701018200007F01008000018000018000018000017F00017F0001 - 7D01017D01017D01017D01017D01017D01017B01017B01017B01017B01017F00 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302046A02036C01037002027702037C01037F000282000283 - 00018500018400028000017D01017903027504027205036B06045C00004D0000 - 5C0907470000570C0A4000004D070740000042020239000048090B3900004C0B - 0D3A00004A040A4100014502073B00004C090E3C00004F0A0D3E00004D050547 - 00004F00005200005800005E00006401006902006F04017304027902007F0100 - 7F01008001008200008200008400008400008300008300008100008001007F01 - 007D02007E03017A02027602017601027801027901027C010380010281010283 - 01028200018200008200008001008001007F01007F01007802016D0506660305 - 6301016100006400006A01007403007D04028402028600008600008600018100 - 057C01057600056900055500024200004A0A0A330000430E0B3300004C070451 - 00006F04067D02048900048F00038D00038A0001820000800100800001800001 - 7F00017F00017F00017F00017F00017F00017F00017F00017F00017F00017F00 - 017F00017F000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00005D000062000067020070 - 02027902037E01038400028600018800018700028600018200018001027A0202 - 7A04037405036700006B0506590000660A094A0000570A084300004504033C00 - 00420606330000440A0B35000047080A3A000043000541000348050A3A00004C - 090E3A00004B080B3C00004603024801004A00005000005300005B0000600200 - 6403006B04017103007502007803007B02007D02007F01008301018501018300 - 008300008300008300008200008001008001007F01007D02007D020080010281 - 02018301028500028500028700028501018501018001007F01007D02007B0200 - 7A01007102006205045802025600005600005C00006501007305017F06048402 - 028800018800008700018300057D02067701066A00064F00004B040735000041 - 0B0A2C0000400B083B00005201006D05067C01038800028E00018E00018A0100 - 8302008103008001008000018000017F00018000017F00018000018000018000 - 0180000182000182000182000182000184000184000182000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02045400005800006201006C02017503037E01038400028900028B00018B0001 - 8900018700018400018001027E03017A02027A02037100007605085F00006306 - 074D00004D05054000003D01013500003D070730000040070A3400004003073D - 00024300063E00014704093A0000480709390000430505400000420200450100 - 4800004D00005100005701005E04006204006A04006E03006F03007403007803 - 007C030180020181020183010184000084000084000084000082000082000082 - 0000820000840100840000860100860000870000870000870000870101850101 - 8101027D01017B01017701007701006C02015500004B00004B00005000005700 - 006401007004007E05038602028A00018800008700018300057D020678020769 - 02074F00013D00003F07062B0000350B062C00004205014D0000690304790102 - 8700018D00008D00008700008103008003008001008200008200008001008200 - 0080010082000082000082000084000086000086000087000087000089000087 - 0000820001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004700004D00005600006003026D0204750205 - 7D00048400028900028B00018B00018900018600018400018001008000018100 - 038102047700027401046500006100025300004E00014700004200013E000040 - 01033A00003E02033B00023C00033C00013E00033B00003E02033A00003F0304 - 3C00003E02023F02004001004200004500004900004F01005302005804005E05 - 016105006504016B04017003017703027A02027C02027F030381020382020383 - 0101850101840000840000860000870000870000870000890000890000870000 - 8700008600018301028001027C01037601027202026E01036C01036104034700 - 004100004500004C00005501006001006E03007901018503048800028A000086 - 00008300037F02047A02066C03065000004200013700003505012E0100350501 - 3D00004E00006903047800018500008A00008A00008700008103008104008001 - 0082000082000082000082000082000082000082000082000084000086000086 - 0000870000870000870000860000820001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302043E02033F0000 - 4701024A00005B00036200017102067A00067D00018200008600008600008700 - 008800018802028602028200018000017F00027D00027B00027800047201046D - 02056200005B00015500015000024B00024400014200023F00023B0203370101 - 3A04043500003B03023600003901003800003B02013B00004202013E00004401 - 004100004600004400004A00004A000055010357000067020469000171030575 - 02057400007600007B00027B00008402038400008B00038B00008A00008A0000 - 8A00008900008900008700028300038101067D02067600057002086400026001 - 055600005400014A00004400013F000046030244000050000056000068020374 - 01047F00028600028900018900018400018000017B01016F0302530000450000 - 4102003700003D06033A01004701014F00006A03067A02078600068A00038800 - 0085000083010183040380010080000180000180000180000180000180000180 - 0001800001820001820001820001820001820001820001820001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003700033E05083800004B04074800006004096300017102067800 - 057D000482000284000186000186000087010187010182000182000182000182 - 00018200028200027F00047B00047400036C00026500035D00025300024D0001 - 4A00014300003B00003E05043400004108073500004206063800003D01013B00 - 004004043800004507073700004505053C00004101013D000045030443000058 - 04085200006504086200006A01046F01057507096F00007F0809760000850506 - 8100008700018600008600008500008500008300008000027D00047800047000 - 0570040A5E000062060B4C00005104084500004300013D00004204043B00004C - 06074300005A03066200007403077D0004840002890002890001860000820000 - 7D02007203015600004D03003C00004508043700004808074300005300006B01 - 077A020784000788000387000285000083010182030280000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302043D04073500004807093E00005607 - 0A4C00006504086500007102067702057C01037F000180000182000181000081 - 00008200008001008200018200018400018200018000027D00027A0105740104 - 6E00046601035E00035700015200004D00004B00024100005007094000005108 - 0A3E00004905064200004301023A0000490909370000490B0B3500004307073B - 00003E02033700004B07084200005A060A4E00006002065C0000680507620000 - 730B0C6400007C0B0E6F00007E06077800007E03017D02007D01017B01017901 - 027801027300036E01036700055A000063070C49000055080C3E00004903093E - 00004001033900004909093E00005408094C00006906086F00047B0004820002 - 8700028700018600008200007D02007203015D02004700004D0805390000490C - 0A3900004D05054E000068010677010682000787000387000285000083010182 - 0302800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003B00 - 0246060B3900004E090C42000058070A4F00005D00026702046C010371000376 - 01027901027D01017F00017F01007F0100800100800001820001840001840001 - 8200028000028000057A01057601046F00046900036300026000035D00035700 - 005E04094E000060090D4A00005A060A4500004C00024600004B05063C00004D - 0B0C370000470B0B3600003D04033800004307083900004E0A0B420000570609 - 4900005500015400005F05055200006D0D0D5A0000750D0E6A00007406067205 - 037206027205037104026F03026D03026802036502045700005A030647000055 - 0A0C3E00004A090B3700003F03043A00004507073900004F0B0C4300005F080B - 5D00007304087B00048200028700028700018600008200007D02007203015B00 - 005607044000004D0D093700004C0C0B41000053000166000576000581000687 - 0003870002850000820000820302800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044301063A00004B080B3C0000500A0B4200005204054E - 00005A00005D00006400006B01007101017703027A04037B03037D02007F0100 - 8001008200008400018400018400018400018300017F00017C00017900047601 - 047201047001056F010570020864000072080E5A00006C080D5300005D02054F - 00005200014500005309093E00004D0C0B3900004508063900003E0405350000 - 490A0C3900004C090C3E00004E05074700004A00004500005808094A0000640B - 0E52000066090A5F02016304016305006304016003005F02015E02015B010157 - 01015100004300005007093A00004A0B0D33000040070A3700003F0304380000 - 4B0B0B3C000055090A4A00006807096D00037900048200028700028700018600 - 008200007D02007403016304014C00005309073A00004B0E0C3900004D07074D - 0000620003720003800006850003860002840001820000810201800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00004100014704093A00004B - 080B3C00004B07083F00004A00004C00005100005900006000006701026D0302 - 7103037605037902007B02007D02007F01008200018400018600018600018400 - 008500018300018200028001037E01037D02067B02067800047E050D6C00007C - 080F62000070040A5D00005F00025900005A030649000057090A4200004D0707 - 3F000042000140000146060B370000490A0C37000049080A3B00004503044200 - 004B0506400000540A0A43000055070848000052000052000054000052000052 - 00005100004E00004E00004A0000430000470403390000450909330000400A0A - 3200003A04043A00004406063900004D090A4200005B07095C00007204087900 - 048000028600028700018600008200007D02007403016201005C07054300004D - 0A073700004A0A094000005000016100026F00027D0005860104870003840001 - 8200008102018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044600023F00004704073B00004808083900004306043F0000420000470000 - 4D00005300005D01006101016602026C02017403017803007902007B02007F00 - 0182000184000186000187000187000189000187000187000187000287000383 - 00038100067B000182040A7300007F050B6D00007203076A00026801045E0000 - 6306075200005C06064C00005402014B00004A00044000004704093900004306 - 0A3700004105063D01024302043F00004A05083D00004C05083F000048010444 - 00004800004900004900004900004900004700004700004300004100003B0000 - 4105053300004007083100003B05053600003E02023B00004606063C00004F05 - 054C00006305066C01047800048000028600028700018600008200007F010076 - 02016A05035800005505043E00004707063900004805044B00005E00016D0002 - 7B00058401048500038400018200008001008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004400004400024000004403053C00003E0504 - 3A01003C03013C01004000004601004B00005200005801005C00006100006D04 - 017004007403017602017901017D01018000018400018800028A00028A00028B - 00018B00018A00008A00008600018100018000057D00028100077B00037D0309 - 7701067504087102066F04076900036803056000006100025C00005900015000 - 004D00044400004400043B00003C01053900013D03043B00004100023F000044 - 0104400000450205410002440203450000470000480100470200470200460300 - 4403024403023F00003F02003A00003E02023800003C02033800003A01023C00 - 004002023F00004301024400005101025D00016C03067601047F000284000286 - 00018400008200007F01007802016B04026003024F00004B01003E0000410402 - 4100004B00005A00006900017900058201048500038400018200008001008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E0000400001430204450001420000 - 4300033C00003C03023700003802013701003902003900004202014100004B01 - 014C00005200005700006605026703006E04036B00007402027400007A00017D - 00008300008500008800008A00008A00008C00008C00008700008200047F0004 - 7F00047D00047D00047B00047900047800047800047601047401047401047201 - 047201047201046D02056400065800025000014500004302043A00013B020339 - 00003E00013F00004500054100014300053E00013F0004400001430000440000 - 4701014300004701014100004201004100004000003F00004002023C00004001 - 033C00003F00023E00013F01014000004303033F00004901014D00005F020369 - 02057401047D00028200028400018400008200007F01007802016C00005E0000 - 5400004500004201003C00004201004700005C01046A01047A02078102048300 - 0384000182000080010080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00004200004702053A00004506083300003F07063300003802013601 - 003D06033600004707063E00004F05054600005100005600005F02015900006B - 07056200007408077100007C04057D00028000018400018600018900018B0001 - 8B00018700028000027B00027B00047D00027D00047D00027D00047D00027D00 - 047D00027D00047D00027D00047D00027D00047900046E000668010851000052 - 03063D00004307083700003B01023D00004502053F00004C040A3C0000470409 - 3A00003F00024200004903033F00004C06063C00004906053D00004201003F00 - 004404043A00004806073A00004704073D00004200023F00004505053B000048 - 06074000005305065800006904067401047B0002800002840001840000820000 - 7F01007901016F00006802035200005205033A00004508063D00004800005900 - 036801047501067F020481000382000182000080010080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044301023A0000490909370000440B - 0A3200003F07063700003B03023300004509093700004B090A3C00004B050647 - 00004D00004A00005E0606500000690B0C5C000071090A6E0103750205790203 - 7C01038001038300038500038700038500037D00027901017901027B01017B00 - 027D01017D00027F000180000280000182000282000184000284000186000282 - 00027F020B6B00006A060C4A0000500A0B3700004007063700004202023F0000 - 52060A42000051070B3C00004404093E00004701024100005007093E00004D09 - 0A3C00004705063F00004301023B00004A08093C00004D090A3C00004B050641 - 00004301023B00004A0A0A3A00004F09094500005E0606620001720104790102 - 8000028200018400008200008001007B01017803046400006306074500004D0C - 0B3500004508064400005501036401037302067D020481000382000182000082 - 0000800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003C00 - 00450707370000480C0C350000460A0A3300003C03023800004307073500004A - 0C0C3700004A0A0A3900004501024500005206074500005B0B0C4A0000610909 - 5400006300026B02056F02047201047702037A02037C01038102047F02047B01 - 017901017901017B01017B01017D01017F00017F000180000182000184000186 - 000186000186000187000186000283000580080D5D0000620C0C400000470C0A - 3300003C03023E00004C060743000056090D4200004D080B3700004001034300 - 00500507400000510B0C3C00004B090A3A00004202023F00004806073A00004F - 0B0C3C00004F090A4000004701023E00004808083900004E0C0D3E0000540809 - 4F00006502047002047901027F00028200018400008200008001007D01017600 - 007306085300005B0B0A3A0000480D0B3800004502015300026100027001057A - 02037F0002820001820000830101800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302043C0302330000460A0A3500004A0C0C3700004706083E - 00004201033900004A090B3700004A0B0D3500004307083A00004504063C0000 - 4F0A0D3E0000550A0C4500005501054E00005F01056302046801046C01036F02 - 047002047502057702037901017B02007B02007D02007D02007F01007F01007F - 01008001008200008200008400008400008400008600008400018A0508760000 - 770C0E4E0000520D0A3300004009043700004202013E000054070A450000550A - 0C3C00004307083C000047000342000051070B3E00004F0A0D3A00004706083C - 00004201033900004A0A0A3A00004F0B0C3C00004C06074300004301023B0000 - 4C0C0C3A00004F0C0B4300005B05055D00006F02047801027F00028200018200 - 008200008001007D01017B03046800006807094900004F0C0B3500004207053F - 00005000015E00016F00047A02037F0002810000820000830101800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003500003F070633000046 - 0A0A3900004A08093D00004500034100004904073A00004A090B35000043090A - 3300003B020338000142050935000048090B3A00004B06094100004C00025300 - 035700035D00036100026401036602026A02036F01017901017F01007F01007F - 01007F01007F01007F01007F01007F0100800100800100800100800100800100 - 80010082000084000185080A640000630C0A3C0000400A032F00003A06003C00 - 004B050543000056070A4200004C08093600003E02034100004D03073E00004D - 080B3A000049080A3800003E02033A00004206073700004A0A0A3A00004C0809 - 3D00004501023E00004705063900004C0A0B3C00005107074C00006000016F02 - 047801027F00028200018200008001008001007D01017900007704075700005A - 08073C00004409073500004100004F00005D00016E00047801027F0002810000 - 8200008301018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02043603013300003F07063500004707073D0000490205460000480002410000 - 49030939000043060A3300003B04073400023500043200003C04093200004306 - 0A3900004603064500004900004C00005100005500005A00005D000160000168 - 00017B01018400008400008200008200008001008001007F01007F01007D0200 - 7D02007D02007B02007B02007B02007D02008301027A00007009065000004708 - 003000003608003405003D03003F00005004054300004E05073B00003E050439 - 00004200024100004B03093C000047050A3800004004053900003B0102360000 - 4206063500004507073A00004503044000004100003D00004808083C00004A07 - 064200005401005900006D02047601027D00028000018200008001008001007F - 00018003057100006904064B00004D07073700004005033D00004C00005C0000 - 6D00037801027F00027F00008200008301018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00003701003802013800004002023F0000450102 - 4400004700014700014600024100014300053C00013C01053800023700033900 - 043B01063700023D02063800013E01053C00004100014300004700004B000051 - 00005600005B00005F00006800007D0101860000860001840000820001820000 - 8000018001007F00017D02007D01017B02007901017803007901017802017600 - 007103035F02005206003D00003703003102003606003A020041020041000047 - 01013F00003E02023600003901004000014600044100014300053F0001420005 - 3D00003C00013C00013D01023A00004002023E00004202024000004100003F00 - 004202023E00004205033D00004600004C00005700006903047201047B00027F - 00018200018200008000017F0001800305780306630000560302450000420503 - 3A01003E01004A00005800026900037601047D00028100008400018501018200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302043C00013B0000 - 4001033E00004201033F00004200024100014100014000004300033E00004201 - 033C00003F00023E00014100034200024300053E00014000053C00003F000240 - 00014501024900025000015400005A00006200016800047302067F0002840001 - 8400028400018200028200018000028000017F00027D01017D00027B01017B00 - 027901017B00027202025D01005202014C02004502003F02003A020039020036 - 01003B04013B04013A03003A03003803003303003203003502003F0000420000 - 4200004200004200004200004200004000004300034100014401044200004601 - 044100004400024200004000003B00003C03013600003C03013C00004601004F - 00006205046D02047601047D00028000028200018200028000017C0001720000 - 6804025400004A03003B00003B02003C01004400005300026502047302057D00 - 028500008A000089000184000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004200024400024B01073F00004A - 05083900004405073A00004101014501024C02025300025A0002600001680002 - 6E00057800058000048400028400028200028200028200028000028000027F00 - 027F00027D00027D00027B00027B00027B00027002045700004C00014B000049 - 00004800004500004300004000004302014202013F02003D02003B02003A0100 - 3A01003C01004101014200014200024200014400024400014400024400014500 - 034A06074000004C08093E00004A060740000043010240000043060437000042 - 09073400004508044200005000006205046D02047601047D0004800002820002 - 8400028000027B00007706046200006009054100004306023600003C03014200 - 005101026302047103057D00048500018C00008D000184000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073F - 00004700033F00004C070A3A00004A0A0A390000460606410000480000500203 - 5B02056201036900036F00027700047B00058000048200028200028200028200 - 028000028000028000027F00027F00027D00027D00027B00027B00027B000276 - 01046600006000006000005D00005C00005A0000580000560000580000560000 - 5300005200005200004F00004F00004B00004200003F00003F00003F00003F00 - 003F00003F00003F00004204043A0000480A0A370000490B0B3700004406063F - 00004701014100004C09083A00004B0B073E00005005035100006604046F0204 - 7801027F0002820002840002820002800002800102720000740A09510000540A - 083900004007053B00004200005101026103047103057D00048500018C00008B - 0001840001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004300034100004A06073A00004D0B0C3900004A0A09 - 3A00004701014B00005502016104056A03067302067700037E00048000048200 - 028200018200028200018200028000018000028000018000027F00017F00027D - 01017D00027B01017D00027901027500037300037300047200026F00026F0001 - 6D00026B00006B00036901026600026501016400016400006400015E00015100 - 004B00004B00004A00004B00004A00004A00004A00004600004F080540000053 - 0C09400000510A074000004B01014D000056030545000055090A430000550806 - 4A00005B00006B03047401047B00028000028200028400028200028200027D00 - 008208086400006B0E0B4500004B0B0736000040050342000051010261030470 - 03057B00048300018A00008B0001840001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E00004301023A0000 - 4A0A093900004C0C0B3A00004A07044700005100005C02016905057305077B02 - 0680010386000486000284000184000084000182000082000182000082000180 - 01008000017F01007F00017F01007F00017D02007F00017F0001810204810003 - 8000058001038000057D00027B00047901027A01057902037800047601027500 - 037301017300037100036D020469030469020568040469020568040468030566 - 0404630204590000680A0B530000690B0C5300006305065A0000610002570000 - 6508094E0000630B0B5000006306056100007002047800047F00028200028400 - 028400028200018200018601037900007C0C0C5500005C0C0B3E00004609073E - 01004400005101026103047003057B0004830001880000890001840001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023C00004407053700004A0B073900004A0A063F00004E01005500 - 005F02016C04057604048102048400028B00028C000287000084000086000084 - 0000840000840000840000820000820000820000800100800100800100800100 - 8001008001008400018400028200028200028200028200028000027F00028102 - 047F02047F02047E01037C01037B00027B00027B00027E01037E01037E00057C - 01037C01057C01037C01057A02037700037D08096E00007F0D0D6A00007C0A0A - 6C00007302056D000274060A620000710C0E5B0000700B0D6400007103057800 - 047D00028200028600028400028400028000018200018400008707086B000070 - 0C0A4A00005009063B0000440403440000510102610304700305790004810001 - 8600008700018200018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003D02003800004208033700004708 - 043D00004B04004D00005801006302006F03027903028200018700018F000190 - 0002890000860000870000860000860000860000860000840000840000840000 - 8400008400008400008400008400008200008100007F00007F00007F00007E00 - 007E00007E00007C00007E02027C02027C02027B01017B01017B01017A00007F - 00008800008C00008C00018A00008A00018800008800018600008A0206820000 - 8C070A7F00008A070A7D00008603067F00017D02067500027A060B6C00007609 - 0B6A00007605087700037D000282000286000287000186000184000180000182 - 00018901038100007E07086000005C0606440000460504410100440000510102 - 6103046E03057800047F00018500008600018200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003C01 - 003B03003A00004003003E00004503004800004E00005A01006302006F020079 - 01018100008600008D00018E0002890000870000870000870000870000870000 - 8600008600008600008600008600008600008600008600008600008400008000 - 017F00017F00017F00017D01017D01017D01017E02027D01017D01017D01017C - 00007C00007B00007B00008000008C00029100029000029000028E00028E0002 - 8C00028C00028900018800028500008801038300008500028300008300018000 - 027F00057900017A00067200007601047600017C000182000286000289000189 - 00018700018400018000018200018900018902047700006B04025300004C0200 - 4100004303024400005101026103046E03057800047E00018300008600018200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003901003E04003C00004204004100004A01004E - 00005A0300620100710603770100830405830000890001860000870000850000 - 8500008400008400008500008500008600008600008600008600008600008700 - 008700008700008400008000017D01017D01017D01017D01017D01017F00017F - 00017F00017F00017F00017F00017F00017F00017F0001800001860103870002 - 8400018300008100008100008100007F00008000017F00017F00017D01017D01 - 017B01017D01017F00028200028200028000027E00037A00037A00037D000280 - 00028600028900018B00018B00018700008400007F0100800100890001850000 - 7C04056700005802024700004100003E00004701014E00015C00006800017601 - 047F020483010284000182000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900003E060136000045 - 08043900004907024300004D00005400006205026400007A0B09730000840808 - 7F00008301028301028001008100008100008100008100008200018301018100 - 008100008100008100008300008300008300008100007E00007E00007E00007E - 00007D00007D00007E00007E00007F00007F0000810000810000810000810000 - 8300008100008101028001027F00017E00007B00007B00007C00007C00007C02 - 027C02027C02027A02027A02027A02027A02027E020284000486000482000480 - 00047D00047E01038001038300038700018B00018D00018B0001870000820000 - 7F01008001008600008B0406740000710A084F00004D06033C00004101004502 - 014E00015900006600017401047D020481010282000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003E0301340000450A083700004A0B073A00004B0603470000520100510000 - 6909095E00007A0E0D6A00007D08097600007801027802017800017800007800 - 017800007901027901017B00027B01017B00027B01017D00027D01017D00027D - 00027E00017F00017F00017F0001810001810001830001830001860002860002 - 8700028700028700028700028900028600028101027E02027D01017C00007C00 - 007C00007C00007C00007E02027E02027E02027C02027C02027C02027C020280 - 01028200048400048000027F00027D00027D00027F00028200018700018B0001 - 8D00008B00008600008200007F01007F0100890204800000800B0C5D00005F0C - 0B3E00004606053D00004502014B00005700006501017201047D020481010282 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004001033A00004308063500004A0D0B3700004A0B07 - 3C00004702004700005607044C0000670D0C5300006D0C095F00006A03016B00 - 026B01006A00016A00006C00016C00006D00026D010071030571030371030573 - 03037302057303037302057702037A01057C01037C01057E01037E0005810204 - 8201068201048200048200028400048400028600048600028600048400028001 - 037E02027D00027C00007C00017D01017D00027E02027E00017E00007E00017E - 00007E00017E00007E00017F00017F00017F00037C00017A0001790000790000 - 7D00008000008700018B00018B00008900008600008001007D02007F01008300 - 008808096B000071100D4900004E0B083700004106044201004B000057000064 - 00007201047A0203810102810000800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000400103370000 - 480A0A3700004A0C0C3900004707063F0000480202410000550A084500005D0B - 0A4A00005A04045200005A00005A00005B00005B00005B00005B00005D00005D - 00006201036202026201036402026401036402026401036701026B00036D0002 - 6E00046F01037201057201047501067702057800057800047900057B00047D00 - 057D00047D00057D00047C01057B00027B00047A00017D00047D000280000580 - 01037F00037F00018100038100018300038300018300038100017F00027B0002 - 7901027801027700017800017C00007F00008600008900008B00008900008601 - 008002007D02007D02008503047700007A0C0C5300005A0D0B3A0000430A083B - 02004101004A00005400006200007100037A0203800001810000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E0000440507370000480A0A3700004709093800004202013F00 - 004706053C00004E09063E00004D06034200004800004B00004B00004C00004C - 00004C00004C00004F00004F0000510000510000520000520000520000520000 - 5400005600005800005A00005A00005B00005D00006000016000016200016601 - 036700036900036B00036D00036D00036E00036E00036E00036E00026E00026F - 00017000027300037300037601047901057A01057C01057C01057E00057E0005 - 7E00057E00057901027601027503037503037503037803047B03038102038400 - 008700008900008900008401008002007B03007B03007D000080060665000067 - 0C08430000490A063500003E07043F0200470000540000620000710003790102 - 7F00018100008000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100043C00004604093700004506 - 083600004004053B00003E02023900004407053700004407053700004303023E - 00004101004101004000003F0000400000410000440001440100450000450000 - 4700004700004900004900004900004700004200004200004300004600004700 - 004A00004B00004E000151010253000254000256000258000258000258000258 - 00005700005700005700005900005900005C00005E0001610002640103660103 - 6700036900036B00036B00036B00036D00026E00006F00006D00006E00007003 - 017304027903027F03038400008700008900008700008401008002007B03007B - 03007D01017200006E07055200004F05033700003C07043904013E0100470000 - 5400006100006F01037901027F00018000008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 034100043F00014300033E00004201033D00003E00003C00003B02003800003B - 04013800003E05033B02003E05033E03013D02003B02003A01003A01003D0101 - 3D01014002024202024301024500034501024501024501024301024202023900 - 003800003A00003B00003E01003F020042020143020143000045000045000047 - 00004900004900004A00004900004800004800004700004700004900004A0000 - 4D00005000005200015300005500015700005700015900005900015B00005B00 - 005D00005C00005E00005F00006302006901026E020174020278010278010278 - 01027602017203016F04016F04016D00006C01035E00005401004300003E0100 - 3801003C05023E01004700005200006100007000007B01018300008400008200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000013E00013F000043000343000049000345000046000143 - 00004000003B00003B04013501003B04003700003B03003C02004004003E0200 - 3F05003800003B03023600003A00013A00004100014200004700054300004701 - 023F00004101003E01003D01013C00003F03033B00004204043D000041030341 - 0101410101400000430102410000460203410000470102430000460203440100 - 4703044200004602034200004701024500004700004600004B00024700004B00 - 024800004B00014A00004900004600004900024500004B00024700004B00014C - 00004E00004F00005200014E00005200014C00004F0000500000510000500000 - 5200024800004900033F00003F00023E00004301024600005300005D00007302 - 007D00008C00018C000084000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F00023D00004203053D00004E - 04084300005003064500004600013F00004005033300003E0A043000003F0803 - 3800003F0300410100450700370000420A053300003F07063600003E02033F00 - 024701073F00004C05083C00004705063A00003F02003E00004305053A000046 - 08083900004507073C00004103033D00004303033900004606063A0000460405 - 3C00004000003F00004204043800004507073700004305053B00004101013F00 - 004404043B00004806073A00004705063D00004101013D000040040536000043 - 07083500004206073A00003F00023D0000420305380000450608370000440507 - 3C00004200024400004B01054100004C05083C00004704093C00003F00024000 - 004903034A00006405026800008506058900008E000086000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00004001033800004A070A3E000053080A4300004F0406430000420201360000 - 420B06300000430C073300004407033F00004404003C0000480C06350000450E - 0B3200004108093A00014000053A00004A070A3A00004A0A0A3700004207053A - 00004303033C00004A0A0A3900004B0B0B3900004707073F00004101013A0000 - 4808083900004A0A0A3900004505053D00003E0202360000440808350000460A - 0A3500004206063A00003E0202360000450909350000460A0A3500004206063A - 00003C020334000043090A330000440A0B3300004206073A00003E0203360000 - 45090A350000460A0B3500004206073C00004202023B00004A070A3A00004A09 - 0B3700004206073800004004043C0000530806500000740B087000008C070485 - 0000840001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004001033C00004506083A0000510A0D42000053080A - 4000004501023E0000430806320000450E09330000480B073A00004503004300 - 004C08013A00004D0F09350000460D0B3500003E04053A000145050A3700004A - 0B0D370000460A0A3500004003013F00004C06073E0000510B0C3E00004D090A - 3C00004301024000004907083A00004E0C0D3A00004C0A0B3B00004404043C00 - 00440808350000490D0D350000460D0C3500003F060538000041080733000045 - 0D0C320000430B0A3200003B0302380000430708350000480C0D350000440A0B - 3300003C0203380000410708330000460C0D330000430A0B3300003C03023A00 - 004507073700004A0B0D370000460A0B3200003B02033800004508063E00005F - 0D085700007C0E0A780000840300820001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C0000400103370000 - 4B080B3E0000530A0C4200004E0507410000420201350000440C073300004A0D - 093A00004C07044700004D0300440000520B073E00004E0D0C3700004607093A - 00003E0203350000460A0B350000480C0C3500004308063E00004A0202440000 - 54080943000055090A4200004E04044300004A0202410000500A0A3E0000500D - 0C3C00004B08073F0000430302370000490C0A3700004B0E0C3500004409073A - 00003C0301330000430C09320000450E0B3000003E09063700003E0202370000 - 480A0A3700004A0C0C3500004307073A00003C0302330000430B0A320000450D - 0C3000004008073700003C0302330000460A0A330000460C0D3200003E080835 - 00003B05043400004B0B074500006A0F0A6200007F0A057A0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004001033C00004405073A00004F080B4000005007093F00004301023C00 - 00420705350000480B073A00004E09064400005001005200005907024A000058 - 0B084200004E08083E00004201033C0000420607350000460A0A370000470A08 - 3A00004701015100005B04074C00005F080B4A00005A06084A00004F00004B00 - 005103044500005408094300005107074300004A00004500004B05053E00004E - 08083E00004A07063A00004100003E0000460605370000460B09350000450A08 - 3600004003013F00004905063E00004D090A3C00004A08093B00004202023C00 - 00440606350000440B0A330000430A093400003C030138000040070535000046 - 0A0A35000043090A3300003903023702004008033A0000560C06520000710D08 - 6E00007D05007F00018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003F00023A00004704073E00004E05 - 074100004703044000003F02003800004208033900004C070444000054020154 - 00006205025F01006508055500005D07074D00004F02054500004200023A0000 - 4406063700004707073D00004B03034D00006204056300006A07095C00006706 - 085900006002035A00005C00005500005D05054E00005C06064D000057040352 - 00005603025100005906054B00005705044800004E01004900004B0000460000 - 4F05034000004E07043F00004904014600004B00004800005404054500005105 - 064300004D03034600004600004100004906053A00004807063A00004404033F - 00004101003C00004707033A00004807063A00004204043B00003F04023B0000 - 4B0603470000650A066300007608047701007F00018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000013E00 - 013F00023F00004500034300004701024000004000003E01003D02003C000043 - 03004700005000005400005C00006D06047007046C02016A05036100005F0203 - 5200014F00034500014200023E00004301024300004C00014F00005700006E03 - 067504086F00047203076C00026F010569000168000267000368030564000167 - 04066000016403055F01026302046904066A0507660103670406600000610002 - 5B00005B00005900005800005300005500005100005300005000005100005500 - 005800005500005900015300005500015000005100005000004F00004A00004C - 00014800004B01014800004700004700004801004700004B01004700004B0101 - 4600004500004401004702004800005503005E00006E05027302007902007F00 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000013E00013D00004300034100004501024100004200013E - 00003D02003B0000420300430000510402560000630506690304730200790302 - 7902037500017201056C03066200065400014B00014400004501024500005103 - 045600006205066902057800047D00047B00047B000479000479000478000476 - 01047401047201047201047002046F02046F02046D0204700204760104780004 - 7800047601047601047401047201047002046F02046D02046D02046B03046903 - 046903046903046903046C05086D04076902056700036400015F00005C00005B - 00005C00005B0000590000570000570000550000550000530000550200550200 - 5601005500005600005300005000004F00004F00005100005400005B00006500 - 007001007902007E03017F000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023D00004203053B000048 - 05083C00004705063C00003F01013B00004005033A00004E07044B0000610707 - 6300007204067800008002018101027E00017B00047501066900055A00014D00 - 004D02044100005006064C00006406076400007603067F000484000284000482 - 00028200048000028000047F00027D00047B0002790004790102780004780102 - 7601047901028000048400028200048200028000048000027F00047D00027B00 - 0479010279000478010276010476010276010476010475020575020574000571 - 00037000036D00016C00026900006B0003690102670003670102660103660202 - 6401036202026104016003006203006301016400006300006100025E00015D00 - 025D00005F00006400006D00007600007F010080010080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004001033800004A070A3A00004B090A3A00004406063A00003C0301360000 - 4A0A064200005F090958000072070A7500037E00008501018700028300018200 - 047C00066E00055D00005300024400005008084300006109095C00007706097A - 0003840002870001870002870001870002860001860002840001820002800001 - 8000027F00017F00027F00017D00028000018700028B00018900028900018900 - 028700018700028600018400028200018200028000018000028000017F00027F - 00027D00027B00027C01057C01037C01057B03047B02067A0304770205750303 - 7502057303037302057303037103057004036F06036F06037005027002027201 - 047100036E00036D00036B00036900036A00016D00007600007C000084000086 - 0000820001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033C00004706083900004D0A0D3A00004A0A0A - 3700003E02023800004508063C0000570C0A5000006F0A0C6800007C03077F00 - 008701018800028600008600047E00057000055F00004E000050050740000057 - 0B0C50000070090C6E0000830205860001890001870001870001870001870001 - 8700018600018400018400018200018200018200018200018000018400018900 - 018D00018B00018B00018B00018B000189000189000187000186000186000186 - 0001860001860001840001840001820002800002810003800103820104810204 - 8203058003057C00017A00017A00017800017A00017800017800017701007706 - 037706037A04037B03037C01037C01057B000578000577010674000574010477 - 00037A00017F0000870001870000820001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0C0C3700004307073800003D04023700004D0A07450000670A - 0B5E00007A060B7900027F00008501018700028500008400047E00056E00055B - 00004F01023E00004D0A09420000630B0B5E00007E060A7E0000840001860000 - 8600008600008600008600008600008400008400008400008400008400008200 - 0082000082000084000086000087000087000087000087000087000086000086 - 0000860000840000840000840000840000840000840000840001830003830003 - 8300038100038300038000028000028000027F00017F00017F00017E00017F00 - 017E00017E00017C00007B04027B05007E03018101028300038300058200057F - 00057D01077B01077A01057B00047F0002840001870001880002820001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B3900004709093600003C03023800 - 004407053C000059090853000072070A7100008002077E000081030085000283 - 00008200047C01056D00035A0000470000460605390000520B084C00006E0809 - 7200008302058200018200008200008200008200008200008200008200008200 - 0082000082000082000082000080010082000082000082000082000082000082 - 0000820000820000800100800100800100800100820000820000820000820000 - 8200008200008402038300038300038200028100018100018000008000008300 - 038300038300038300038300038300038300038101027D02007D020082000084 - 00008700028700028600048200058200077E00067E00057D0004800002840002 - 8A00028800028200018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004507 - 073600003E05043800003B04013800004B06034800006504066600007C02087E - 00037C01007E03008101027F00007F0004790105690003560000470101380000 - 4208033B00005A07055F00007B04057E00017F00017D02007D02007D02007D02 - 007D02007F01007F01007F01007F01008001008001008001007F01008001007F - 01007B02007902007902007902007B02007B02007B02007B02007B02007B0200 - 7D02007D02007D02007D02007D02007F01008001028101028101028000018000 - 0180000181000081000083010283010285000285000285000285000285000283 - 01027E00007E01008300008600008900028900028700048400048300067F0005 - 7D00047E00038000028400028800028901038200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004002023900003A01003A01003F020043000053 - 01005C00006E00047700037E01037A01007C03018001027F00007F0004790105 - 6700035400004300003B02003800004404005000006703037600028001037D01 - 017D02007D02007D02007D02007D02007D02007D02007F01007F01007F01007F - 01007F01007F01007F01007D0200790200780300790200790200790200790200 - 7902007902007B02007B02007B02007B02007D02007D02007D02007D02007F00 - 017F000181010281010281010281010283010284020382000182000182000182 - 00018400018200018400018200017F00007F0000840000860001870001870002 - 8600028400048200047F00037E00037E00017F00018200028700028801038200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000003F00004301023F00004300033E00003F00023C - 00013B00003E00004802024B00005D00006900007A02067A00017A01007E0301 - 8101028100008000047A01056900035600004400003C01003F04024000005600 - 006700007D02068100018000017F00017F00017F00017F00017F00017F00017F - 00018000018000018000018000018000018000018000017F00017F00017D0101 - 7F00017F00017F00017F00017F00017F00017F00017F00017F00017F00017F00 - 017F00017F00017F000180000180000180000180000180000180000180000180 - 0001800001800001800001800001820001800001820001800001800001800001 - 8200018200018200018200018200018200028000028000028000028000018000 - 0180000182000182000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073C00003F00043A0000460606410000540403540000710608 - 7300007C02027A00007E03018301028100008200047A01056B00055600004500 - 004407053800004906054F00006F06097A000183000382000280000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 - 4F090A4700006507086300007C07087800007A00007E03018301028100008200 - 047A01056B00055600004800003A0000460B093C000060080861000083050A7F - 0000820002800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B - 3900004000053900004808083E0000590908530000750A0C7000007D03037A00 - 007E03018301028100008200047A01056B00055600004400004609073500004E - 0B0A4E0000730A0D770000840104820002800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 - 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 - 0A6100007E090A7800007A00007E03018301028100008200047A01056B000556 - 0000480000390000480D0B3C0000620A0A5F000085070C7F0000820002800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 - 004707073E000057070653000074090B7100007C02027A00007E030183010281 - 00008200047A01056B00055600004400004508063500004C09084E000072090C - 7800008300038200028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004402073D00023C00013E00004C06074700006103046500007B060779 - 00007A00007E03018301028100008200047A01056B00055600004700003C0000 - 4308063C00005C04046300008204098000008200028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033F00023E00033A00004303034400004F - 00005800006D02047500017B01017A00007E03018301028100008200047A0105 - 6B00055600004500004104023B00004401005300006B02057C00038200028200 - 0280000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004000003F00004301023F00004300033E00004100043E - 00033B00004000004802034B00005D00006900007803047A00007A00007E0301 - 8301028100008200047A01056B00055600004600003E01003F04024000005800 - 006700017F010681000182000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073C00003F00043A0000460606410000540403540000710608 - 7300007C02027A00007E03018301028100008200047A01056B00055600004500 - 004407053800004906054F00006F06097A000183000382000280000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 - 4F090A4700006507086300007C07087800007A00007E03018301028100008200 - 047A01056B00055600004800003A0000460B093C000060080861000083050A7F - 0000820002800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B - 3900004000053900004808083E0000590908530000750A0C7000007D03037A00 - 007E03018301028100008200047A01056B00055600004400004609073500004E - 0B0A4E0000730A0D770000840104820002800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 - 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 - 0A6100007E090A7800007A00007E03018301028100008200047A01056B000556 - 0000480000390000480D0B3C0000620A0A5F000085070C7F0000820002800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 - 004707073E000057070653000074090B7100007C02027A00007E030183010281 - 00008200047A01056B00055600004400004508063500004C09084E000072090C - 7800008300038200028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004402073D00023C00013E00004C06074700006103046500007B060779 - 00007A00007E03018301028100008200047A01056B00055600004700003C0000 - 4308063C00005C04046300008204098000008200028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033F00023E00033A00004303034400004F - 00005800006D02047500017B01017A00007E03018301028100008200047A0105 - 6B00055800004500004104023B00004401005100006B02057A00038200028000 - 0280000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017D01017D01017F00018000018300008500028301027E - 00007B01017703026E01005D00004700003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004000003F00004301023F00004300033E00004100043E - 00033B00004000004802034B00005D00006900007803047A00007800007C0100 - 8100008200018300057800036800025700004600003E01003F04024000005600 - 006700017D020681000180000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017F00017F00017D01017F00017F - 00017F00017F00017F00017D01017D01017B01017901016D03024F0003420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073C00003F00043A0000460606410000540403540000710608 - 7300007C02027800007A01008100008400018300057A00036B00035A00004700 - 004606053A00004906054D00006D060976000183000380000280000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00017F00017F00017D01017D01017D01017D01017D01017D01017D01017F0001 - 7F00017002024900003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 - 4F090A4700006507086300007C07087800007901017A01008100008400018300 - 057A00036B00035B00014A00003C0000480B093C00005C09085F00007F060A7D - 0000800002800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000017F00017F00017F00017F00017F00017F0001 - 7F00017F00017F00018000018000017202025201044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B - 3900004000053900004808083E0000590908530000750A0C7000007D03037901 - 017A01008100008300008200047B00046C00045C00024600004808073700004E - 0B0A4A0000700B0D720000820104800002800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000017F00017F0001 - 7F00017F00018000017F00018000018000018000018000018000017202024B00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 - 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 - 0A6100007E090A7800007A02027A01008000008300008400047D00046F00065E - 00044A00003B00004A0D0B3C00005D0B0A5C00007E090C7C0000800002800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000017F00017F0001 - 8000018000018000018000018000018000018200018000018200018200018200 - 018200018200017402025100034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 - 004707073E000057070653000074090B7100007C02027A02027D020080000083 - 00008400047E00057000076001054700004707063700004C09084900006D0A0C - 6F00007E01037F00028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017F00017F00018000018000018000018000018200018200018200 - 018200018200018200018200018200018200017402024A00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004402073D00023C00013E00004C06074700006103046500007B060779 - 00007A02027D02008000008500008600048000057301086102064A00003F0000 - 4508063C00005705045C00007706097900007F00028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000017F00017F00018000018000018200 - 0182000184000184000184000184000184000184000182000182000182000174 - 02025302054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033F00023E00033A00004303034400004F - 00005800006D02047500017B01017B03037D0200800000840000860004810005 - 7301086403074A00004403023D00004201004C00006403057100037B00027F00 - 0280000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000017F00 - 017F000180000180000182000182000184000184000186000186000184000182 - 00018200018000018000017202024B00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004000003F00004301023F00004300033E00004100043E - 00033B00004000004802034B00005D00006900007803047A00007901017D0200 - 8200018600018700048000047400076602074D00004200004104023E00005000 - 005900006F01037901027F000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000017F00017F000180000182000184000184000186000186 - 00018500008600018500028402038202038102037E0202700403510003420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073C00003F00043A0000460606410000540403540000710608 - 7300007C02027901017D02008200018600018700048200047600076602074D00 - 004704033900004807064500006003046900007A03047D000280000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000017F000180000182000182 - 00018400018400018600018600018700028500028200018000017D01017C0202 - 7A02026C05034700003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 - 4F090A4700006507086300007C07087800007901017D02008200018600018700 - 048200047600076802075200013E0000470A083A000056090750000070050775 - 00017D0002800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001820001840001860001860001870001860001880103830102 - 8000017C00007800007602017203016905034E01044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B - 3900004000053900004808083E0000590908530000750A0C7000007D03037901 - 017D02008200018700018900048400047800076802074E00004C06063900004D - 0C0B4300006109096200007904057D0002800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001820001840001840001860001860001 - 8700018600018400018000017E02027A02027403016F02006B02005F02004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 - 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 - 0A6100007E090A7800007901017D020084000187000189000484000478000769 - 02075400023F00004B0B0A3A0000550A084E00006F07087200007D0002800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001820001 - 8400018600018700018700018600018600017F00007E00007B03037905047205 - 036A03006300005700004A01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 - 004707073E000057070653000074090B7100007C02027901017D020084000187 - 00018900048400047900076902074F00004B05053900004A0A094300005F0707 - 6100007705057D00028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018400018600018600018700018700018600018400017E00 - 007C00007A04037506046E05026502005D00005100004300003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004402073D00023C00013E00004C06074700006103046500007B060779 - 00007901017D02008400018700018900048400047900076B0107530001420000 - 4606053900005005035100006A04057301017D00028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018400018600018600018700 - 018700018600018400018101027C02027403016E03006602005F010058000050 - 00004A04054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033F00023E00033A00004303034600004F - 00005800006D02047700017B00027B01017F0001840001860001860002820004 - 7D00056F01075100004701023F00004202014400005401006700007702037D01 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001820001820001820001820001800001800001 - 7F00017F00017F00017F00017F00017F00017F00017F00017F00018000018200 - 018200018400018400018600018600018400018000018006067803046D010063 - 00005A00005200004E02004C03004000003F00004100014401044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000003E00003F00004301023F00004300033E00004100043E - 00033D00004000004A01034D00005F00006900007A03047C00017F0002800002 - 8400018200007B02007B01018200027800055400014200004301063B00004202 - 014D00006E03007D02007F000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001820001860002870002 - 8600018400018200017F00017D01017B01017B02007902007902007B02007B02 - 007D02007D02007F01007D00007F00008200008301018301028101028001037B - 00027604046B00026303035200004B01003F00003E04003D0200440203450102 - 4300004000003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013D00004205033B000048 - 06073A00004605073C00003F00043C0000470506430000560403560000730608 - 7500007E01037F00048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018200018600028600028400018200018000017F00017D01017B01017B02 - 007B02007B02007B02007D02007F01007F020080020082000082000081020180 - 01027E02027802017301016D01006602026307064D00005107053A0000420705 - 3600003C05023B00003E00004000004402034201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004002023800004A08093A00004B080B3900004604093C00013F00023D0000 - 51080A4900006706086500007E07087A00007F00048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000017F00017F00017F00 - 017F00017F00017F00017F000180000180010082000082000084000084000086 - 00008B00038901038402037E01037402026902005F0201570200520503440000 - 4F09093C00004A09083A00004806074100004204043E02023C00003900003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023C00004508063A00004D0B0C3A00004A090B - 3700004000053B00004808084000005B0908550000750A0C7000007F02047F00 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000017F00017B01 - 017B01017B01017D01017F000180000182000184000184000186000186000086 - 00008600008600008600008700018C01048901058102047702036A02035D0100 - 5001004601003F0000430904350000490C0A3A00004D0A094100004703043900 - 003500003701003A04034201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000400202370000 - 4B090A3A00004D0A0D39000045050A3A00013D01023B0000530A0C4700006709 - 0A6100007E090A7800007F00048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000017D01017802017602017802017B01017F000182000186000187 - 00018900018B00018B00018900018900018700018700018600018400067E0005 - 7702056C01035F01025301004601003D00003B0401300000420A09330000490B - 0B3A00004C05084200003C04033704013502003200003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023C00004606053A00004B090A3A000049080A3800003E01053900 - 004507073E0000570706520000720A0B6F00007C01037F00048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017D01017802017602017802017B - 01018000018400018700018B00018D00018D00018B0001890001870001860001 - 8400027D00027200036B00036500045E01025400024C00014300003D00003700 - 003E0704320000440B0A3500004709093B00004002023600003500003702003A - 05024100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004202073B00023A00013C00004C06074500005E040461000079070777 - 00007F00048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 00017901017802017B01017F00018400018700018B00018D00018D00028B0002 - 8900028600028000027D00027B00047002045800004F00005000024E00014E00 - 024B00014900004600004701023E00004706083600004208093400003B050537 - 00004106044304004102003D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033D00023C00033800003F03034200004D - 00005500006804047101017901027F00048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017D01017D0101800001840001870001890001 - 8B00018B00018900028600028200027D00027800047201046F02046204054700 - 003E00004000004300004800014A00014A00004A00004A00014A010343000144 - 03053B00003C03043300003901004200004800004C00004F02004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004000003F00004301023F00004300033E00003F00043C - 00033C02033C00004503044800005800006000007002027902037D0004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001820001840000860000 - 8700018900018800008800008700008400008200047C00037B03076F01036B04 - 075E00005800004B00004000003900003E02033C000043000343000048000149 - 00004900024700004701024000004202023B00003C00004000005000005B0000 - 6101016303033F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073A00003B00043900013F06053C00005107054D0000660404 - 6A00007904057D00048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018200018900008A00008900008900008700008600008400028100037900 - 047605086600006706085100005705044700004901013F000040040538000045 - 06083700004406063C00004101014200014804053E00004B03034200004F0505 - 4800005602046200006A00006E00027002024201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004301023B00004C08093C00004B080B3900004205093800013C0304360000 - 4A0A0A4000005C09085600007107067601027D00048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018400018B00008C00008B00008700008400 - 008000017D02047904057306086000006508094A00005206073E000048070642 - 00014900034100004E0809390000440B0A3000003B08063101003A0704350000 - 4A07064300005B04075300006C060B6E00047500007900007D00027E02023E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023F00004807063C00004F0B0C3A00004A090B - 3500003C0105380000420908390000540D0A4A0000670A096300007806067D00 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018400018B00 - 008D00008900008400007F00017802016F01016803015F02015F090947000051 - 09093C00004608083600004505054800005504074200004D0B0C3300003D0D09 - 2900003205013101004109043E00005D0A0857000077090B7300008404098000 - 018301028402038402034201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E00004301023A0000 - 4D090A3C00004D0A0D39000043060A3800013D04053400004A0C0C3E00005C0A - 095300007009077301017D00048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018200018600008702008402027E05037504026B02005E000055 - 0000530302440000500A0A3A0000490B0B3500004206073F00004E0002490000 - 53080A3C0000480D0B3000003A0A063101003A0300390000580B085200007A0D - 0F6F00008A070A8500008601038602028602028602023E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023F00004706053C00004D090A3A000049080A3600003B02053800 - 00400807370000500B084900006408076400007606067D00048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018001008200008003007B040274 - 06026A03005D0100500000460000430000460703370000480C0C35000047080A - 3800004200024700005003064000004D0A09390000450B063600004004004300 - 00540802520000720E0C6B0000870B0B80000088000286020283010183010183 - 01014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004200013D00004905063C00004805 - 083A00004003073800023C03043700004507073F00005705045600006D060472 - 02027D00048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 01007C03017803006E02006602005C01005101004700004000003D0300360000 - 4007053400004607093B00004603084000004200013D00004706053C00004C07 - 044300005003014F00005E04035F00007009076A0000800A097800008305047E - 00007F01007F01007F01007F01004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101004100004501023F00004001033B00023C00033D01023F03033C000044 - 04004800005902006A00007A03047D00048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017F00017F00017F00017F00017F00017F00017F00017F00018000018200 - 018200018200018000018000017F00017F00017F00017F00017F000180000180 - 00018200018200018400017F00017405036A03006100005700004E0000480000 - 4303003F05003A03003904013700003C03023C00004302044200044702054100 - 004202004300004B01004E00005700005900006000006F05047505057400007A - 02027700007E03017B00007E03017D02007C01007E00007C01004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003C00003D00004501024100004001033A00003F000441 - 00034800024400003D04033600004003004D0000710101800002800004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001820001 - 8200018200018000018000017F00017D01017D01017D01017D01017D01017D01 - 017D01017D01017F00018602028701018400008100007E00007C01007A000079 - 01017C02027B00008001037C00008500038500008C0105810106600000520000 - 5200004A00004902004100003F02003C01003B03023901003C02033700003E02 - 033B00004100044200004700004E00005300005900006302006A030171030378 - 04037901017D01017F00017F00017F00017F00017F00017F00017F00017F0001 - 8000017F00013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008800048200048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018400018200018200018000018000017F00017D01017D01 - 017D01017D01017D01017D01017D01017D01017F000183010185010184000082 - 00008001008001007F00017D01017B000081050578000085080A770000840507 - 7A00007100045400004D03034100004C06063A00004606053A00003D01013800 - 003D03043700004607093800004605073B00004700005000005700005E000064 - 01006B02007203017A02027F0303800001820001820001820001800001800001 - 7F00017F00018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058500018200048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018200018200018200018000 - 018000018000017F00017F00017F00017F00017F00017F00017F00017F00017F - 00017E03018002018102018501018700028800028A00028B00038700037A0000 - 850A0C6B0000770C0E5D00006404045100004C00013F00004C08093A00004A0A - 0A3700004406063C00003C00003700004909093A00004F0B0C3E00004C030548 - 00005801006002006502006902006F02007602017C0202800102800001820001 - 8200018200018000018000017F00017F00018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058200 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 0182000182000182000180000180000180000182000182000182000182000182 - 00018200018200018200018000017D02007D02008102018802028B00038D0003 - 8F00038D000385000187080A6A0000740F0D5000005A0B084000004202003F00 - 004707073900004C0C0C370000480A0A3700004202023D00004706053E000055 - 0B0B430000570A084900005702006104016804006C0300700301740301790101 - 7E02028101028200018200018200018200018000017F00017D01017D01018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000182000182000182000184 - 0001840001840001860001860001860001860001860001840001820001800001 - 8500028801038B00048B00048800038400028204096E0000700A0B4E0000550B - 093700003E0A043300003B0203350000460A0B350000480C0C3700004707063F - 00004903034300005508064900005E08084E00006309085F02006A0602700502 - 7304027703027A02027E02028000018200018200018400018200018200018000 - 017F00017D01017D01018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058200048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001820001840001840001860001860001870001870001870001870001870001 - 8700018700018500008600018700028601038300038000027900007300006E01 - 036A08084C00005107053900003E0A042D00003708043300003F060932000044 - 0A0B3500004909093B00004701014B00005506034C00006108045300006B0A07 - 6200006F08057104027504027903027A02027E02028101028200018400018400 - 018400018200018000018000017F00017D01017D01017F000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00017F00017F0001800001800001820001840001860001870001870001890001 - 8900018900018700018700018700018900018A00018B00028700038001037800 - 046E00026300005900005503024700004906033900004005033300003E07043A - 02013802023300003F06093300004507073B00004B0303490000520000520000 - 6205025E00007009066900007709057403007802017B01017D01017F00018000 - 018200018500028700028600018400018200018000018000017F00017D01017D - 01017F00018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008700038200048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000017F00017F0001800001800001840001840001 - 8600018700018700018700018700018700018600018600018600018600018600 - 018600028001037702056A02035F02015100004800004000003C02003700003C - 03013900004003014000004002023A00013A01043800014001033F0000490101 - 4B00005100005400005E00006600007207037504017B09037903007B03007E00 - 007F00007F000082000184000186000187000287000286000184000182000180 - 00018000017F00017D01017D01017F00018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D0403320000390500490000750001860002820004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000017F00017F0001 - 8000018000018400018400018600018600018801038700028600018300008100 - 007F00007F00007F00017E03057601047204066300005C02024D00004801003E - 00003C01003700003D04033B00004404044300004802034600014102043E0203 - 4100024300004600004A00004E00005600006604046B04027203017603007902 - 007D02007F020080020082000084000184000186000186000186000186000186 - 00018400018400018200018000018000017F00017D01017D01017F0001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008800048200048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017F00017F00018000018200018400018400018600018600018400 - 018400018200017F00017D01017A02027903027303036400006205045500005C - 06064900004F05034100004201003C00004205033900004808083B00004C0607 - 4400004900024300004300004700004B00004F00005500005C00006200006D03 - 027203017803007B02007F020080020082020084010086000086000186000186 - 00018700018600018600018400018400018200018200018000017F00017F0001 - 7D01017F00018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058500018200048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018200018200018400 - 018400018400018400018000007D00007D01017A020275040272050370050265 - 06034B01003C00004B08073E00005109094200005003064900004C0002450000 - 52060A4000004F080B3C00004603064000004800004C00005000005500005D00 - 016402026903047004037402027802017D02007F010082010084010084010086 - 0100860000870001870001870001860001860001860001840001840001820001 - 8200018000017F00017F00017F00017F00018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058200 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018200018200018200018400018400018200018000017E000078000076020171 - 04026E05026805016305005605003A00003A0802320000490C0A3C0000510909 - 4600005300034F000057030747000055080C4000004C070A3900004700035000 - 005700005C00006000006802037004037505057A06057901017D010180010082 - 0000840100840100860100860000870001870001870001860001860001840001 - 8400018200018200018200018000018000017F00017F00017F00017F00018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018400018400018400018400018200018000017F - 00017B03037605037005026905016004005C04005403004903003C05002C0000 - 400D0B3300004C0C0C3E00005104084A000052000548000056060D4300005208 - 0E3E000048050A4800005C00006500006A00006D01007202027903027D030380 - 0404800001820000840000840000860000860000860000860000860001860001 - 8600018400018400018400018400018200018200018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058200048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000182000184000184000184000184 - 00018400018200018000017B01017A06057205036905015F03005602004F0100 - 4901004302003B03003F0A07330000460D0C3700004909093B00004400024500 - 014E040842000052050C42000053060D46000057020668030171030075010078 - 03007B0101800102810102850002860000860000860000860000860000860000 - 8600008600008600018400018400018400018400018200018200018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000182 - 00018400018600018600018600018400018200017F00017901017706046D0401 - 6002005600004D00004601004103004203004802024300004A06073A00004307 - 073400003905053400003A03063700004604093E000052030C4D00015D040E62 - 00067202027903007D02007F0200800100840000860000870000890000890000 - 8900018700018600018600018400018400018400018400018400018200018200 - 018000018000017F00017F00017F00017F00017F000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008700038200048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018001 - 0080010080010080010082000182000182000182000182000182000182000180 - 00018000018000018000018000018400018400018200018000017D0101790101 - 7403016F03026905035F04005501004C00004600004100004103004305004400 - 004800014100004202023800003B03023600003802013B010242010345000050 - 00025600006300086700077202097800007E0100800100820100840000860000 - 8701018800018700008700008700018600018600018400018200018200018200 - 018200018200018200018000018000017F00017F00017F00017F00017F00017F - 00018000018000018000018000018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D0403320000390500490000750001860002820004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018001007F020080020080020082010084000084000086000086 - 00008701018701018500028200018000017F00007E00017E0001830102810102 - 8205077702037307066400005A01004F00004A00004600004702004100004302 - 013F00004201004000003C02033900013C03043900003F03033F00004701014A - 00004F00005800006301016C01037503037902037D00027E00007F0001800100 - 8000018001008200018200018200018200018200018200018200018200018200 - 0182000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008800048200048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018001007F02007F030080020082 - 0100840100860100860000870000880001870101850002840001820001800001 - 7F00027F00027E0000800606720000770B0A5C00005D09044A00004602003F00 - 004006013600004308063700004606063D00004100023701013B060933000042 - 08093A00004D05054A00005600005E0000660000700000790101800201830101 - 8601008500008200018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058500018200048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 01007D02007B03007D02007F0200800100820000840000860000860001860001 - 8400018500028300038100038100037E01037B03046E000076090B5B0000670B - 0A4A00005006043F0000400301340000430A0935000048090B3900004704073F - 00003F030437000048090B3A000052090B4500005805045900006501016B0100 - 7402027A02028103028301018401008300008200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058200 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017B02007903007B03007D02007F0100800100 - 8200008200008400018400018200018200018100038001038001037A02036E00 - 006F0708590000670B0A4A0000550A083F00004404033A000041080633000048 - 0C0C3700004A090B3C00004500033F00004B0407420000570A0D470000610A0D - 5700006604046B03047103037804037B03038103028102018401008400008200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017B0200790200 - 7B02007D02007D02007F01007F00018000017F00017F00017F00027F00027D00 - 047B00047B000474010468020356000060080849000055090A3E00004808073B - 00003C0302320000440A0B3500004A0B0D3900004A05084500004D00004A0000 - 5D060A4E00006A0C10590000700B0D6B03047204067604047A04037D03037F04 - 0281020182000082000080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058200048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017F00017D02007D02007D02007D02007D02007D01017D01017D01017A00 - 017A00017800017700017200027000026F000168000258000056060745000050 - 08083C00004808073700003E050438000040070635000048090B3900004C070A - 3F00004E00035400006400055800006F090E5E0000750C0F6D000278070A7604 - 047902037A02027C02027E030180020181020181020180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018200018200018000017F00 - 017D00027B00027901027601047100036E00026A000165000163000060000059 - 00004C00014200004905063900004507073700003F06053A01003B0102380000 - 4405073A00004A05084100004D01055000006701066A00007405096B00007908 - 0C7000007C070A7901057901027901027B01017D01017F00017F000180020181 - 0201800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008700038200048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018200018600 - 018700018600018400018000027D00027901027402026F02046802036402025F - 01025800005400005100004A00004100004002023B00003F03033B00003E0504 - 3A01003E02023E00014100024100004700034700004C00024B00005700007203 - 077D03097900057D04087800037D02067A00037B00027D00027C00017C00007C - 00007E00007F0001800201810302800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D0403320000390500490000750001860002820004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018400018B00028C00018A00018500018200047C010575020571 - 04066500025B00005802024D00004C02024200004300003D00003B0201380000 - 3D04033900004004043B00004103034101014703044701024800004A00004E00 - 0052000058010563020678000580000480000480000480000480000280000280 - 00027F00027F00017F00017F00017F00017F00017F00017F0001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008800048200048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018400018900008C00018A000386 - 00068000057800046E00026500025900005704034600004D07073A0000420705 - 3500003904013600003D05043400004108073800004707074000004901014900 - 004E00005200005500015A00025E01026001056A01047D000484000284000484 - 00028400028200028200028200028200018000018000017F00017F00017F0001 - 7F00017F00018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058500018200048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000182 - 00018500008700048600068100077A00066E00036300005A0000530001440000 - 4C0809370000440C0B2E00003B0A083302003A0403340000450A083700004B0A - 094000005004054E00004F00005600005D00006502046A03066C04056B020571 - 0003800002860001860002860001860001840001840001820001820001800001 - 8000018000018000018000017F00017F00018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058200 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000028000047E00057900057400056C0002630000 - 5A00005100004A00004C0606390000470E0D300000410E0C2E00003906043700 - 004308063900004F0C0B4200005909084D00005C00005C00006300006B000270 - 0403740404740404740202780001820001860001860001840001860001840001 - 8400018400018200018200018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017D00027603066F0105 - 6800026300005A00005500004F00004A00004B02043C00004C0B0D350000470D - 0E3300004007083800004104023B0000500B084200005C0C0B4E000063060560 - 00006E01037101017601027802017901017B01017D01017F0001820000840000 - 8400008200008400008200008200018200018200018200018200018200018200 - 0182000182000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058200048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017901026903045F02035700005000004E00004800004900004701014100 - 004808083900004B0A0C39000049080A3A00004301024100004B06034200005A - 0B084E0000670A096100006F03027904057B03037D01017E00007E0000810000 - 8200008301018200008001008001008001008200008200008200018200018200 - 0182000182000182000182000182000182000182000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000017601025A00004C00014900004600004300 - 004200004200014202024201033C00004704073D00004D050B4300004F020949 - 00014700004500005506034F00006609086100007408077602017C02027F0100 - 8100008500008500008701008801008603008002007F02007F01007F01008001 - 0080010080010080010080000180000182000182000182000182000182000282 - 0002800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D0300720000870003840004820002840001800100760300780300 - 8600027B00045300004300033F00024001033900004D03006E00008102018000 - 0180010080000182000182000182000182000182000182000182000182000182 - 0001820001820001800001800001820001820000820000820000820000820001 - 8000018000017F00017D01017B01017901017802017602017601026B03044F00 - 004600004200004100004101013D01013D01013A01003900003C00013D000046 - 01044600004F0206500003550105510000580000590000640300670000730505 - 7703027F05057C00008000008300008601008801008902008902008603008002 - 007F01007F01007F01007F01007F010080010080010080000180000182000182 - 0001820001820001820002820002800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D0403320000390500490000750001870002860002860002 - 8700028200017802017901028600027D00045400004000004303023B00003E04 - 0049000071000480000282000182010082000084000086000086000087000087 - 0000870001870001860001860001840002840002820002820001880202890200 - 8902008801008601008300008000007C00007F05057703027305056700006403 - 005900005800005100005000004800004A000442000042030539000138040434 - 02023302003603013B02014101014500004900004D00005500006D0204760201 - 7601027802017901017B01017D01017F00018000018000018200018200008200 - 0082000082000082000080010080000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008900048700028700028700028400027901027901028700047D00045200 - 004505003B00004508043700005306046C000182010680000180020082010084 - 0100860000860000870000870000870001870001870001860001860002840002 - 8200028200018803008802008700008500008500008100007F01007C02027602 - 017408076100006609064F00005506034500004900004800004D000740000049 - 060B3600003E08083200003504023704023802013B0000410000480000500000 - 5500016300007801028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058600018600028600028700028200027901 - 027901028700047D00045700003E00004A0A06370000480B0745000075030A7F - 00037F00017F0200800200800200820000840000860000860000860001860001 - 8600028400028200028000028000028000018301018201008100007E00007E00 - 007D01017B03037904056F0302610000670A094E00005A0A094200004B060341 - 00004301023B000047080A350000440A0B3200003E0605370000400202410000 - 4500004C00005400005C00006401036F02047B00028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058400 - 028400028600028200027801027901028600047D00045300004A08033A00004C - 0D093900005A0A096B00008301087D01017D02007D02007F0200800100820000 - 8200008400008400018400018400028200028000027F00027F00027D00027D01 - 017B01017B01017901017802017601027101016E01036000006306054E00005C - 0C0B420000500B083B0000410402390000400708320000440B0C330000450909 - 3900004501024900004D00005300005A00006300006A00027001057803067D00 - 0280000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200028000028400028000027801027901028600047D - 00045801003D00004C0C083900004B0C0847000078040B7E00037D01017B0200 - 7B02007D02007F01008001008200018200018200018200018200028000028000 - 027F00027F00047B00047700017402027604047404047004036B00026300005C - 00005C00004D00005909084200004F0C0B3900004308063700003906042D0000 - 3F0C0A320000490B0B3A00005005074D00005300005C00006400006C00027400 - 057900057C01057D000480000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058000027F00028200027F - 00027601027901028600047D00045300004B07023C00004B0B07390000580807 - 6C00008301087D01017B02007B02007D02007F01008001008200018200018200 - 018200018200028000027F00027F00027D00047900046F01036B03046C030669 - 04066502045D00005600004F00004E00005004054000004B0A09370000450A08 - 3400003A04033302003A09073000004509093C00005408094E00005F01056100 - 006A00007400037A00067F010782010682000480000080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020383 - 00017F00027D00028000027D00027601027801028700047F0004590000420000 - 4906033A00004607034A00007501087F00047D01017D02007F01008001008000 - 018200018200018400018400028200028200048000047F00047F00047D000476 - 01046801046002035E00045A00025700015200004E0000490000490002400000 - 4707073800004108073400003D05043600003A05023600004407053C00005406 - 075200006605096B00037100027700027F000481000584000685000383000180 - 0000800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008500037F00027D00027F00027D0002740202780102 - 8700047F00045700004703004200004203003B00004F02006E00038100067F00 - 017F010080010082000082000184000184000184000184000284000282000480 - 00047F00047D00047D00047400056302065801045200014C00004A0000480000 - 4701024703044101014103033B00003E05043900003D04033800003B02013F02 - 004302014500005000015600006702046D00037803067F010681000583000584 - 0002830001830001810001800002800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D04033200003905004900007500018400027D00027B0002 - 7F00027D00027601027901028700047F00045A00004501004404003F00004006 - 014C01006E00067E00047F000181000083000083000083000085000085000185 - 00018400048300038400067F00038103097B00057D03097203075700004B0000 - 4C00034700004900034100004100023E00013E02023A01003E05043900003F03 - 033B00004002024100004A00005000005600005D00006800027000027800037F - 00048200048400028400028200028200027F00017D01017D01017F0001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008601047D00027B00027F00027D00027601027901028700047F00045700 - 004A06013C0000450804350000510A076700017E000683000385000285000285 - 000285000285000285000383000383000586050A79000082070B7100007A0409 - 6E00006A00065000004D01054100004A05083A00004405073800003B01023A01 - 003F06053700004507073A00004905064200004C00015A00006100006500016C - 00017200027900047F00048300038400028400028400028200017F00017B0101 - 7901017901017F00018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058300017F00027D00028000027F00027801 - 027B00028900048000045A0000400000490A06350000450E094000006C060B77 - 000381000383010283000383000383000381000381000580000581060A770002 - 800A0F67000076080C5F00006900035900005000023F00004C070A3900004809 - 0B3500004007063800003E05043700004808073C000052080845000056060758 - 00006A01047100037300037800047B0004800103830003850003840002840001 - 8200018001007D02007902007803007803007D01018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008702057F00 - 027D00028200027F00027901027B00028900048000045500004A080337000046 - 0E092E00004F0F0B5B00007701067B00027F00017F00027F00027D00027B0002 - 790004780004740104780A0C620000710C0E5500006406075200005000004700 - 004A05083A00004A0B0D350000440B0A3200003C03023B00004808073E000055 - 0A084900006008085600006703037502057C01057C01057E0103800103800002 - 8200028200018200018200018001007F01007D02007902007803007902007F00 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008000027F00028400028000027B00027D00028B000480 - 00045B01003D0000480B0732000040100A37000064060A6B0000760104790102 - 7901027801027601027402027002046D02046902055C0000670A0B4C00005D0A - 0C4500005004054300004701023A00004A090B370000480C0C3300004108073A - 00004404033F0000550A084A0000670A0B5900006F07086E00007B00027F0002 - 7F00027F00027F00017F00007F00007F00008000018001007F01007F01007F02 - 007D02007D02007D02007F000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E000089010582000280000284000282 - 00027B00027F00028D00048200045A00004B0904350000410D072B0000450B06 - 5300006A00027103057303037303037303037103036E04036A04056505055900 - 005A0404470000540A083C00004A0A093900004104023F000047040739000048 - 0A0A350000430A083400004003003F00005007034A0000670B0A5B0000760A09 - 6E00007B03047E00017F00017F00017E00017E00007E00007D00007D00007F01 - 007F01007F01007F010080020080020082010082010080010080000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200028200028600028400027D00027F00028D00048200045F0302430100 - 4309042E0000340A033300005700036000006B00026B01006B01006902006701 - 026402025F03025B0402510000460000490603380000410A0731000039090535 - 02004101013D00004606063700004307073600004005033F00004601004A0000 - 5D08065C0000770B0A7200008005077E00007E00017E00017E00007C00007A00 - 007A00007B02007B02007B02007D02007F020080020084010086010087010086 - 0100820000800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008700038200028200018400028400027F0002800002 - 8900047F00046003024D06024001003B04002E00003902004900005900005A00 - 005A00005A00005900005500005100004E00004A00004700004502013D00003D - 04023601003805023303003704013E01004101003E00004202013F0000450200 - 4400004A00004E00005801006001007107067503037E06078001028101027F00 - 007E00007C01007F01008600018301027A02027703027901017B010180000182 - 0000860001870000870000860000820001800001820001820001820001820001 - 8400018400018400018400018200018200018200018200018000018000018200 - 0182000182000182000182000182000182000182000182000182000182000182 - 0001820001820001820001820001820001800001820001800001820001800001 - 8200018000018200018000018200018000018200018000018200017F00027901 - 027900048000048400028600028600028200018000017F00017F00017F000180 - 00018000018000017F00017F00018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D04033200003905004900007500018400028000017F0100 - 8200018200018200018000028000047800046603055100004800003E00004005 - 033900004100004700004A00014900004B00034500004700034100004100023E - 00013F01013B00003E02023A00004002023C00003F01013D00004006003E0500 - 3F01004000004700005100005A03006405026904026F04017203017602017901 - 017B01017D01017F0100810300780000860A047C00009F00049E040970000071 - 060878050874000085030A8100018500068B050B7F0001820004820002820002 - 8400028600028600028700028900028900028900028900028700028600028600 - 0284000282000282000284000284000284000284000286000286000287000287 - 0002870002870002860002860002840002840002840002840002840002820002 - 8400028200028400028200028400028200028904077700008F0A0D7B00008300 - 017E00008400027A000374080E62000074000090030E8D000296020A84000088 - 070A7901017901017D01018000018200018000017D00027B00027F0001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008601037F00017D02008001008200008400018000017D00047401046601 - 035B03034500004C06063A00004305053700004001034200024701083B000047 - 040B3700004205093600003A01043900003E0405360000450707390000460405 - 3E00004300004204004104004502004900005201005E02006804007104027602 - 017901017D01017D01017F00017F00017F00017F01007F03008007007B060080 - 0000A00105830000720E0E4D0000530000640307690308740D12620001620003 - 66050966070B6103046104036303036503036703036802036A02036A02036C01 - 036A020368020367030365030363030361040361040363030365030365030365 - 0303670303670303670303670303680203670303670303650303650303650303 - 6503036503036703036703036703036703036703036703036703036703036400 - 006300006D09095D00006A06066000006B07077113145300045F020B921C2777 - 00008A00019000048400017900007802017802017D0101800001840001820001 - 7D00027B00027F00018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058300007F00017D02008001008200008400 - 018000017D00047401046904065100005305063E00004B0B0B3700004004043F - 00004700054100004E060C3C00004B080D3900004206073800003F0304370000 - 4509093700004909093A00004504033F00004802004B02005101005802006103 - 006804007104027905047B01017F00018000018200018200018200018000017F - 01007C04008211076300006600008A04048C1615FFEDE7FFFDF5FFFCF7FFFBF8 - FFEBE8FFFBF8FFF4F0FFFDF8FFFDF8FFFDF7FFFFF8FFFFF8FFFFF8FFFEF8FFFE - F8FFFEF8FFFDF8FFFDF8FFFDF8FFFDF8FFFEF8FFFEF8FFFEF8FFFFF8FFFFF8FF - FFF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8 - FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFDF8FFFCF8FFFCF8FFFCF8FFFC - F8FFFCF8FFFCF8FFFCF8FFFCF8FFFCF8FFF8F4FFF8F4FFFCF8FFFCF8FFF6F2FF - E8E5FFF9F9FFECF2FFDDE5850E178B040E8600038504097D0204760201780201 - 7F00018400018700018400017F00027D00027F00018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008702047F00 - 017D02008001008200008400018000017D00047401046500025D050545000052 - 0C0C3900004709093500004303034300014E040A40000051090F3C00004B080B - 3900004001033C00004507073700004C0C0C3A00004A09083C00004A00005301 - 005A02005F03006603006D04017504027A02027F030380000184000184000186 - 00018600018400018400018001007100007D0902740D04740A037F0303610000 - FFF5EEFFFFF7FFFFF6FFFDF6FBF5EEFFFFF9FFFFF9FBFFF8F8FFF9E7F5EAF3FF - FAF2FFFAF3FFFBF5FFFAF7FFFBF7FFFAF9FFFBFAFFFAFAFFFBF9FFFAF7FFFBF7 - FFFAF5FFFBF3FFFAF3FFFBF3FFFAF5FFFBF5FFFAF5FFFBF5FFFAF7FFFBF7FFFA - F7FFFBF7FFFAF7FFFBF7FFFAF7FFFBF7FFFAF5FFFBF5FFFAF5FFFBF7FFFAFCFF - FBFEFFFAFEFFFBFEFFFAFEFFFBFEFFFAFEFFFBFEFFFAFCFDF9FFFFFBFFFFFCFF - FFFBF8F9F5F7F9F3FFFFFCFFFFFBFFFDFBFFF9FBFFF5F9600000770005810106 - 7F01067E06077602017901018200018700018900018700018000027F00028000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068200007F00017D02008001008200008400018000017D000474 - 01046A05075000005507083E00004D0D0D3700004105053E0000470005400000 - 51070B3E00004F0A0D3C00004805083F00004402033A00004D090A3C0000510B - 0B3E00004E06064E00006203006C03007003017504027A02027E020282000183 - 000087000187000187000187000187000186000186000186000097100E7E0000 - 7502006B00007D00006D0909FFFDF7FFFFF8FCFFF8FBFFFBFAFFFBF1FCF4F0FF - F7E5F9EDEDFFF9F1FFFBF3FFFEF7FFFEF9FEFFF9FFFEFAFEFFFAFFFEFCFEFFFC - FEFEFCFEFFFCFEFEFAFEFFFAFFFEF9FEFFF7FFFEF7FFFFF7FFFEF9FEFFFAFFFE - FAFEFFFAFFFEF9FEFFF9FFFEF9FEFFF9FFFEF9FEFFF9FFFEF9FEFFF9FFFEFAFE - FFFAFFFEFAFEFFF9FFFEF3FFFFF2FFFEF2FFFFF2FFFEF2FFFFF2FFFEF2FFFFF2 - FFFEF3FFFFEBF9F7EFFDFCF3FFFFECFAF9F3FFFFF3FFFFDFE7E6F5F4F0FFFCFA - FFF8F95500046F01077F070B6A00006F00007802017D01018600018900018B00 - 018900018200027F00028000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008702047F00017D020080010082 - 00008400018000017D00047401046500025C0404450000500A0A390000460808 - 3500004103033F00004904073E00004D080B3C00004C08093F00004701024500 - 004D050542000055090A4500005A0A094E00005F03026F03027903027A02027E - 02028101028400018600008800008B00018B0001890001870001870001860001 - 8600018700019102047C00008408087A0203850107730E10FFF6F2F8F9F0F6FA - F4FBFFFCF0F6F1F1F7F2FBFFFCFBFFFBF3FAF5F9FEFCFFFEFFFFFDFFFFFDFFFF - FDFFFFFDFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFDFFFFFDFFFFFDFF - FFFDFFFFFDFFFFFDFFFFFCFFFFFCFFFFFDFFFFFDFFFFFDFFFFFDFFFFFDFFFFFD - FFFFFDFFFFFDFFFFFDFFFFFDFFFFFCFFFFFCFFFFFDFFFDFEFFFAFFFFFBFEFFFA - FFFFFBFEFFFAFFFFFBFEFFFAFFFFFBFEFFEEF3F6F4F7FBFAFFFFFBFEFFFAFFFF - F8FBFFFAFFFFF8FFFCFFFFFBFFF7F54B00026300027D080B740000850D0E7B01 - 017F00018700018D00018D00018900018000027F000280000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020383 - 00007F00017D02008001008200008400018000017D0004740104690406530000 - 5002033F00004808083700003F03033C00003F01013A00004606063900004806 - 073D00004B02044800004C00004C00005804065100006407085A000067060869 - 01027901028000018200018400018600018700018A00028C00028B00018B0001 - 8900018700018400018200018200018600018B00008B00008405067F04067B00 - 00690005FFFAF8FFFFFBFFFFFCFCF0F03020211400011C04061B00001E000221 - 02051B01071901091B00091B00091B00091D00091D00091D00091D00091D0009 - 1D00091B00091B00091B00091B00091B00091D00091D00091D00091B00091B00 - 091901091901091901091901091901091901091B00091B00091D00091D00091D - 00091D00091B00091D00091B00091D00091B00091D00091B00091B0007220710 - 2A0D161B00091700031500033C1F28F8E9EDF4FBF6FDFDF7FFF9F74F090A6D07 - 0C7200007600017700007F00018200018900018D00018D00018700017F00027D - 00027F00018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008500027F00017D0200800100820000840001800001 - 7D00047401046702045800004900004802023F00003F01013900003B02013901 - 003A02013800004002023E00004502014800004E00005100005800005B000066 - 01036800007003057002047A03047E00008200008400008500008700018A0002 - 8B00038C01048900018700018600018400018000017F00017F00018200018A00 - 009106097000007E060A7F00066A030AFFFBFBFFFDFAFFF7F7FFFDFE13000020 - 01042400012700003000042900002200011E00011E00011E00011E00011E0001 - 1E00011E00011E00011E00011E00011E00011E00011E00011E00011E00012000 - 012000012000011E00011C00011C00011B00011B00011B00011B00011C00011C - 00011E0001200001200001220001230001230001250001230001250001230001 - 250001230001250001270005250001230001390C15230001250001FFFBFFFAFE - F9FEFEF8FFFBF94C030570060C6B0000890B107E00008000018600018B00018F - 00018D00018600017D00027901027F00018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D04033200003905004900007500018400017F00017D0200 - 8001008200008400018000017D00047401046803055500004D00004300004404 - 043B00003C00003A01003704013303003904013700004202014200004C000052 - 00006103046703036E01037401047900047E0103800103830003840001860001 - 8600018600018600018700018700018600018600018400018000017F00017D01 - 017B01017B01017D01018100007D01016F03026A02037501085D0308FFFDFBFB - FFFCFFFFFEFFFEFF1E0B0E1C01052F060D2900023D09102E00022E050A1E0000 - 39161A2200032A070B1F00002D0A0E2200033C191D1E00002D0A0E2704082C09 - 0D1E000027040823000231090E2A0207310C101E00002D0C101E00013112151B - 00002B0C0F1B00002B0A0E1F00022F0C102400032D050A25000132060C250000 - 43151B25000035070D2500003F111725000032040A2C000634060C2700013608 - 0E27000135070DFFFBFCFFFEFBFFFFFBFFFAF957060971000680000483000385 - 00038400018700018D00018D00018B00018400017801027601027D0101800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008601037F00017D02008001008200008400018000017D00047401046601 - 035B03034500004C06063A00004305053700003C030236030038080432000040 - 05033C00005005034F00005E02016802036F01037700037D0002820002870003 - 8A00038A00038600018600018600018400018400018400018400018400018200 - 018000017D01017B01017901017802017802017901017F00007B01016D030268 - 0203710108590408FFFEFBF8FFFCF6FBF9FCFAFA100305130000200004230000 - 2F01072700002300002501012000001F00002604042200002402021E00001E00 - 002A08083715151E00001E00002301012000002200002300002300002200002F - 0B0B1E00001C00001B00002C0E0D1C00002608071C00001E0000200000220000 - 2300002B0304280001230000230000391112240000320A0B2300002300002400 - 00230000270000230000290102230000270000FFF8F7FFFEFAFFFEFBFFF8F95E - 04097700068400048600038800038600018700018B00018D0001890001820001 - 7601027402027D01018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058300007F00017D02008001008200008400 - 018000017D00047401046904065100005305063E00004B0B0B37000040040439 - 00003E07043400004508043A00005107054900006509086703036F0103770001 - 7D00028400028700028B00019000028E00028700018400018400018200018200 - 018200018000018000017F00017D01017B01017901017901017802017802017B - 01018500008400017402026F01037900085D0308FFFDFBFAFFFCFAFFFEFDFFFE - 140E0F110305210B0D1B00012E0D112100002B070729060334110E200000300F - 0C2403001D00002809063314112203002706031E000045221F20000039131122 - 00003A13112400003812102805022E0D0A1C0000270A061900002005011B0000 - 341512270603401D1A22000038110F220000300F0C1B00002E110D1B00002A0D - 091C000030130F1B0000270A06230602290C081D00002B0E0A1D0000290C08FF - FDF9FFFDFAFFFCFBFFF7F96303097A0006870004860003880003860001860001 - 8900018B00018700018000017601027402027D01018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008702047F00 - 017D02008001008200008400018000017D00047401046500025D050545000052 - 0C0C3900004709093500004104023E00004A0704400000580B084A0000680C0B - 6200007408077601027D00028200028600018900018D00018F00018D00018600 - 018400018200018200018000018000017F00017F00017D01017D01017B01017B - 01017901017901017802017F00018A00008B00007B0101770001800006660207 - FFFCF9FFFFFBFAFBF7FCFAF90C04040C00001601031500001F04071900001B00 - 002A0D081B00001900001E05011A02001500001500001500009A847E8A716DD9 - C1BBD9BEBAFFFDF8FFFDF91C00001E00002D0D081C0000190000170000150000 - 1D09049E8C85FFFEF998857E1903001700001B000032140F2B0A071E00002003 - 001900002106021E04001C01001900001E03002B110B1A00001900001D020019 - 00001F04001900001D0200FFFAF5FFFDFAFFFCFBFFF6F9650309780006860004 - 8500038500038200018400018700018900018700018000017801027601027D01 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068200007F00017D02008001008200008400018000017D000474 - 01046A05075000005507083E00004D0D0D3700004105053F00004D00004C0000 - 610A08520000710F0F610000780A0A7500017B00028000018200018400018700 - 018700008900008700008400018200018200018200018000018000017F00017F - 00017F00017F00017D01017D01017D01017D01017D0101840001910000920000 - 8400017F00018800066F0107FFFAF9FFFFFBFFFFFCFFFEFC1F0D0C180302250B - 0B1B00002D0E0F1C00002613100E00000C0000110700180F0B090100A39D98CE - C8C1FFFFFBFFFBF4FFFFFBCBC3BCB8ADA9FFFFF9BFB0AD1F0F09271411120000 - 251613100400180D099A948DFFFDF8F3F1E9FFFEF9FFFFF9FFFAF58B837C1F13 - 0F0E00001502001E0803280C0B1B00002D0F0E1B0000381A191B00002A0C0B1B - 0000260807230602290B0A1D00002B0D0C1D0000290B0AFFFDFBFFFDFAFFFCFB - FFF7F96204097500067F00047E00038001037D01017F00018600018700018700 - 018200017901027801027F00018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008702047F00017D020080010082 - 00008400018000017D00047401046500025C0404450000500A0A390000460808 - 350000480202550000690304600000790C0E690000800B0C7300007E01038001 - 0281010282000182000182000082000081000081000082000182000182000182 - 00018200018000018000017F0001800001800001800001800001800001800001 - 8000018600008E00008D00007F01007C00008700056F0105FFFBF8FFFFF9FFF9 - F6FFF7F61803021700001E00001C00002604051B00001200000F0200160A0809 - 0000918A87FAF5F2FFFFFCAFACA87A7773787571787370FFFFFCD9D0CD8B7F7D - 1306040E00001000001001001B0E0C090000D6CFCCBAB7B3878682848581F7F8 - F40C0B0784817DC4BDBAFFFFFCC1B4B2A492911300001A00001C00001E00001E - 00001C00001C00002000012303041D00001C00002000011C00002202031C0000 - 200001FFF7F7FFFDFAFFFDFBFFF8F95C05096E00067900047700037902037802 - 017B01018200018700018700018600017D00027B00027F000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020383 - 00007F00017D02008001008200008400018000017D0004740104690406530000 - 5002033F00004808083700003F03034900006801047100007D06077300008508 - 0A7A00008404057E00008301028101028002017D02007D02007A01007801007A - 0100800001840001840001820001820001820001820001800001820001820001 - 8200018200018400018400018600018400008100007B03006F04006E03007C01 - 05660305FFFCF8FFFFF9FFFFFBFFFEFB240D0B1E02012A0B0A220000340E0E21 - 0000290C0F291216715C5FFFFCFFFFF7FAFFFDFF8C7F81180B0D180B0D241719 - 1507091302051C090C1200001600031B02062E1317170000967D81FFFBFE8F7E - 81140709090000867E7FFFFEFF090000180B0D120104180306957E82FFF9FDFF - F4F991717629090E1B00001B000046262B1B000023030823030826060B230308 - 29090E1D00022B0B101D000229090EFFFCFEFFFEFBFFFEFBFFF9F95506096701 - 067201047100037303037203017602018000018600018900018700018200027F - 00028000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02003F00004501023C00004001033D00004100014700014701023900003B - 04013900004F02006C00007E01037F00017F01008001008200008000017F0001 - 7901027201046802035D00005000005101004B00004B00004700005600007403 - 068203057D00008100037C00008300038000008301028301028101028002017D - 02007B0200780100770200780100800001820001840001820001820001820001 - 8200018200018200018200018200018400018400018400018600018200007C01 - 007404006B05006C03007A0105640305FFFDF8FFFFF9FFFBF6FFFAF61A03011B - 00002400012000002804041C0000190002FFEDF19D868A917A7EFFF6F9190407 - 120000120000190407120000160003170004150000150000250A0E1700009C80 - 86FFEEF4D6BCC2998287847075FFF1F59E8F93897B7DFFFCFF1406080E000012 - 000020090D1500001A00039C7E83DFBFC4FFF7FCE3C2C99A7C8119000125070C - 1900011900001B00031900001F00051B00002100071B0000210006FFF7FBFFFE - FBFFFEFBFFF9F95506096801067201047100037103037003017403017F000186 - 00018900018900018400018000017F00017F00017F00017F00014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003C00003B00004202013F00004302013E00004101013E - 00004002023F02004106043D00004802024E00006302046F01037D0002820001 - 8200017F00017D01017901017403017002026B01006500006100006300006A03 - 016D06046F03026E00007B000280000180000180000180000180000180000180 - 00018000018000018000017F00017F00017F00017D01017F0001800001800001 - 8200018000018000018000018000018000018000018000018000018200018200 - 018200018200018000017C0100790200760201770001850006690207FFFCF9FD - FFFBFEFFFAFFFFFC260E0E1C00002E060B300B0D1C0000170201FFFBFC938384 - 180607D6C4C598838513000021090B1F04072B101317000024090C22070A2409 - 0C150000331B1D887274FFF2F59C8B8E958487C0AFB2FFFCFF7D6F712413168D - 7D7EFFFCFF857576322021100000210F101402031F0B0A19040323080B1B0001 - 927479FFFAFDFFFBFF8D727523080C190001290E1217000034161B1B00002C0C - 111C00003E1A20FFF2F5FFFEFBFFFEFBFFF8F95C05096F000679000477000377 - 02037203017403007D02008200008700008700008600008000017A0000790101 - 7901017A02023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013B000040050338000047 - 07063C00004706053C00003D02003A0100400705390000490807430000580507 - 5600006A03067D00028400018200017F00017B01017602017203017003016E01 - 006B00006B00006F00007802017B03037D01017C000080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017F00017E00007B02007B00027E - 00038800066B0108FFFCF9FAFFFBF3F9F4FFFFFC1500001E0000340C111E0000 - 170000D7C5C49285830B00009A8B89FFFCFB1300001F07071900001900001F00 - 011900001A00001700002A10109D8585FFF2F1D1BFBE180B0D73686AFFF7F992 - 87890B0000887B7DFFFDFEFFFDFEFFF1F2FFFDFEF1E2E09182800C00000D0000 - 271B171000001800022005081500001D0507957D7FA48E90FFFCFEC5AFB1907A - 7C2810121700001900001F00032605091F0000FFFAFDFFFEFBFFFEFBFFF7FB5E - 04097300067F00047C00037A02027403017603007D0200820100870000870000 - 8400008001007B00007A00007D01017E02024201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003E0202360000470A083900004D0A093A00004606053A00003D0402360000 - 470C0A3A0000540A0A49000060070A6600027D00028600018400017F00017B01 - 017802017403017203017102006F00006F00007300007A02027E04047E02027D - 0000800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBFBFFFCFFFEFA - 1C0406300D112800052300043A2020FFEEED0F00001D0E0CC2B3B19D8B8A220D - 0C1500002A1010200606280C0C2004042206062B1111C2AAAAFFFBFA9B86850E - 0000877F80C3BEBF251F20827C7DD5CDCEFFFEFFFFF7F7FBF1F1FFFEFEFFFEFE - FFFEFCFFF6F4FFFEFCBFB3B1877C780C00001702041B05071500011200001B06 - 081200002D181A988385CCB7B9FFFCFED0B5B81C00023011141C0000351216FF - F5F8FFFEFBFFFEFBFFF8FB5E04097500068000047E00037E0202780201790200 - 7F01008400008700018700018400018200018800048900048800038700023E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023A00004308063700004C0C0B3C00004B0A09 - 3900003E03013800004209073500004E0D0C4200005C090B5300006A03067F00 - 028600018400018000017D010179010176020174030174030172010073000077 - 01007C0202800404800102800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017E00007B02007B00027E00038800066B0108 - FFFCF9FAFFFBF9FFFAF7F4F01C04062000012200002200038A70709B87861A08 - 07190706FFF5F4998584150000190101210707170000190000170000907676FF - F2F2A89392120000200C0B0C00000500000202027D7B7BF6F4F4FDF8F9F2EDEE - FFFFFEFFFFFEFFFCFBF2EDECFFF9F6FFFBF8FFFFFCFFF9F6FFFFFBFFFFFB9484 - 851000002210110E000019090A1404050E00000F0000160405150002D0B8BAD5 - BABD1B00001C00001C0000FFFCFEFFFEFBFFFEFBFFF9F95E0409750006840004 - 8300038100037D01017D02008001008400008700018600018000018000018A01 - 058D00048C00038B00024201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003E0202350000 - 480B093900004F0C0B3A00004707063A00003D0402340000470C0A3A0000550B - 0B49000060070A6500017F00028600018400018200017F00017B010179010178 - 02017802017802017800007B01017E0202810203810102800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017E00007B0200 - 7B00027E00038800066B0108FFFCF9FAFFFBF9FFFAFFFFFC20080A1E0000370F - 14240105FEE4E49D8988180403120000FFFDFC8A7272371F1F170000290F0F17 - 00002E1414D8BEBEFFFCFC8B76751803021200001F0D0C1C100E9A9898EFF1F1 - FDFFFFFDFFFFFFFFFFFFFFFFEFEDECFDFBFAFFFCFB888483DCD7D4FFFFFCFFFC - F9FFFFFCFFFFFBFDF4F0F9EDEDFFFEFEB9ADAD867C7C180E0E1107071C10100C - 0000100001100000978183C7AFB133161927080B27060AFFFCFEFFFFFBFFFFFB - FFF9F95C05097700068700048600038700038000018000018400018600018600 - 028200027B00027B00028200028500018600028700033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023A00004207053700004A0A093C00004A09083A00003E03013800 - 004007053500004B0A094200005906085300006902057F000286000186000182 - 00017F00017D01017B01017901017901017901017B01017D01017F0001800001 - 8200018200018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017F00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBF6FC - F7FFFFFB1500001E00002A02071E0000FFFCFC897574200B0A1C0404D7BFBF99 - 7F7F170000240A0A170000967C7CFFFCFC856D6D130000210D0C170302100000 - 948583BCB0AEF7F5F5FBFFFFFBFFFFFBFFFFF7F9F9F1F3F39C9D9B7F7D7CFFFF - FE110D0C040100050000CCC5C2FFFFFCFFF8F4FFFFFBFFFEFEFFF7F7FFFFFEFF - FFFEF5F0EF7F77779189890900001D0F100E0000120000FFFCFE170000190000 - 240508F7E2E1FEFFFBFFFFFBFFF9F95C05097800068900048A00038A00038400 - 018200018400018400018200027F00027601027402027A02067A020378000375 - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003D01013800004407053900004A07 - 063B00004404033B00003B02003600004207053A00004F05054A00005C030666 - 00027F00028600018600018200018000017F00017D01017B01017A00007D0101 - 7D01017F00017F00008100008300008400018200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000017F00017E00007B02007B00027E00038800 - 066B0108FFFCF9FAFFFBFBFFFCFFFFFC1F07092C090D220000280509FFF1F190 - 7B7A240C0C170000907676FFFCFC2F1515170000FFF6F6DFC7C7200808130000 - 220D0C120000210D0C9C8A89FFFEFCFFF6F4FEFCFCFDFFFFFDFFFFFBFDFDC5C7 - C70000000D0E0C807E7DFAF6F5070201140D0A1B120F160A08998C8AFFF3F0FF - FCF8FEF6F6FFFFFEFBF7F6FFFBFAFFFFFEFFFEFDFFFEFDFFFEFE7C70701D0F10 - 8A7879FFFCFE1700001F02053A1B1EFFFDFCFCFFFBFFFFFBFFFAF95C05097800 - 068900048C00038C00038400028200028200028200027F00047900047002046B - 03046C07096806066300025F00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003C00 - 003D02003C00004202014100004302013F00003C01003900003C03013A000043 - 02014600005200015700016700037D0002860001840001820001800001800001 - 7F00017D01017D00007E00007F00018000018000008200008400008300008200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000017F00017E00 - 007B02007B00027E00038800066B0108FFFCF9FAFFFBF0F6F1FFFFFC1500001E - 00002700041E00009A8080D0BBBA170000220606200404FFEDEDA187871E0404 - 977F7F1300001300001C0807120000968281FFFDFC837170796A68FFFEFCFFFE - FFF8F8F8FEFEFE8A8A8A0000008E8E8E020000040000FFFFFE0D03030C00000C - 00001200001200009D8684FFFEFBFFFAFAFFFFFEFEFCFBFCFAF9FFFFFEFFFFFE - F3EEEDFFFEFEFFFEFEFEF0F1FFFDFED0BABC1800021900001B0000FFFCFBFAFF - FBFFFFFBFFFAF95A05097800068900058A00038A00038400028000028000027D - 00027900047201046902056204055805045404035202015101004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003C00003B00004003013E00004502013F00004101003C - 01003B02003700003D02004000004C02024D00005800026801047B0002840001 - 8400018200018000018000018000017F00018000018000018000018200018200 - 0184000186000184000182000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000017F00017E00007B02007B00027E00038800066B0108FFFCF9FA - FFFBF9FFFAFFFFFC250D0F1E0000340C111E00002D1313FFFDFC2105051B0000 - 270B0B1F0303FFF6F69B8181240C0C130000230E0D120000FFF1F0FFF9F8A795 - 94100000251312FFF7F5FFFEFF8D8788040000140F10B6B1B2FFFEFF807B7A07 - 0000FFFCFC0F0102210F0E1300002F15151900002F100FFFFDFB918787777574 - C5C3C2FCFAF9FFFFFEFFFFFEFFFEFDFFFEFEFFFEFEFFF3F4FFFDFE8973753119 - 1B19000026070AFFFCFBFAFFFCFFFFFBFFFAF95A050977000686000487000286 - 00048001037C01038005097901057605096700015D00024F00004C0202450201 - 4300004000003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013B000040050338000047 - 07063C00004706053C00003D02003A01003D0402350000490807430000540103 - 5300006A03067901028200018200018200018000018000018000018000018000 - 0180000182000182000184000184000186000184000182000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017F00017E00007B02007B00027E - 00038800066B0108FFFCF9FAFFFBFBFFFCFDFAF61800021E00002E060B1E0000 - 1B0101907B7AE2C6C61C0000190000170000907676FFFCFC846F6E220E0D1200 - 009A86859E8C8B100000100000120000170302998A880B00000700008D8586FF - FEFFFFFEFFFFFAFB948C8C0B0101FFFDFE1000001803021700002E0E0F200000 - 240000997B7ABEB2B21915140400000E0A097F7B7AF0ECEBFFFFFEFEF6F6FFF5 - F5A89A9B816F701701031700001900002C0D10FFF9F8FBFFFBFFFFF9FFFBF859 - 060875000684000583000381000577000179070770000078090D630000660509 - 5100004B00003E00003D00003F00004303024201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003E0202360000470A083900004D0A093A00004606053A00003D0402330000 - 4409073A0000540A0A4900005C03066500027801028000018000018000018000 - 0180000180000180000182000182000182000182000184000184000184000184 - 0001820001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBFBFFFCFEFBF7 - 1800022100022800052502061B01011E0908D2B8B8DBBFBF270B0B170000331B - 1B897473FFFDFCD2BEBD210D0C1000001804038F7B7AFFFCFB8D7877200B0A12 - 00009B8E90CCC4C5FFFAFBFFFEFFF3EBECFFFAFB9187870B0000FFFDFE120000 - 1901011B00002D080A2800022800002C0808FFFDFE847C7C1914130500001813 - 12CDC5C5FFFEFE8B81811608090E000029141617010323080B1B0001250609FF - FDFCFDFFFBFFFFF9FFFBF85906087200078000067D00047A0206710406630000 - 70090C5B000068090D4F00005304074500004B02044701024500004200003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023A00004308063700004C0C0B3C00004B0A09 - 3900003E03013800003F06043500004E0D0C4200005906085000006A05077601 - 027F00017F00017F00017F000180000180000180000182000182000182000182 - 0001840001840001840001820001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017E00007B02007B00027E00038800066B0108 - FFFCF9FAFFFBFAFFFBFFFFFC1E0608250206230000230004280E0E1300001900 - 00DAC0C0FFFAFA937B7B1300002E1A19120000907C7BFFFDFCCEBCBBD5C1C0FF - FDFC927D7CFFF8F8230B0B8F7A79F3E6E8FFFEFFFFFEFFFBF5F6FFFEFFFFFEFF - 756D6D160C0CFFFCFD1604051F07071E000027020428000037080A2200009781 - 83C4B8B8140808090000110707FFFCFC7F73730C00001F0F101000001B050715 - 00001C00021B00001C0000FFFAF9FEFFFAFFFFF9FFFAF85707086F01077A0006 - 760104710406620000650908500000630A0D4C000057080B3F00004502054400 - 004700004700004A01034201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003E0202350000 - 480B093900004F0C0B3A00004707063A00003D0402330000450A083A0000560C - 0C4900005D04076500027601027D01017D01017D01017D01017F000180000180 - 0001800001800001820001820001820001820001820001820001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017E00007B0200 - 7B00027E00038800066B0108FFFCF9FAFFFBF0F6F1FFFFFC1A02041F00002200 - 001E0000260C0C1500001F07071B0101917979FFFDFCDEC9C88B777628141312 - 00001C0A098B79788B7776170201281010FFEDED2C1010917C7BFFFDFFFFFEFF - FFFEFFFFFEFFFAF8F8F2F0F07D79780B0605FDF3F31B0B0C1A05041900002702 - 04230000330708260000190103FFFDFE1000000E0000958586FFFDFE16060718 - 08091B090A1200001901031700002D0E112D0C102C0B0FFFFCFCFFFFFAFFFFF9 - FFF9F75406076A00067400056C01036705055A04044B000057090A4500005508 - 0B3E000046060B3D00004801044B00034900014600003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023A00004207053700004A0A093C00004A09083A00003E03013900 - 003E05033500004C0B0A4200005704065100006904067402027B01017B01017B - 01017D01017D01017F0001800001800001800001820001820001820001820001 - 8200018200018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017F00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBF5FB - F6FFFFFC1600001E00002A02071E00001C02021601001500001B030313000012 - 0000988483D2C0BFFFEEEDD1BFBE1000001200002C1716150000170000FFFCFC - 1E0000897171FFFEFFF8F8F8FFFFFFFDFFFFF3F5F5FDFFFF979896020000FFFA - F9160A0A1200001700002A0A0B2200002700002600001A00008F797B97818312 - 00008F7A7C8671732D181A1200001601031F090B250A0D1900001B00001C0000 - 200001FFFCFCFFFFFAFFFFF9FFF9F75305066500046D00036400005B04024B00 - 004D08053C00004C08093C00004807093400003D04073D000043000045000148 - 01044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003D01013800004407053900004A07 - 063B00004404033B00003C03013500004106043B00005006064900005B020564 - 01037202027901017901017B01017D01017D01017F00017F0001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000017F00017E00007B02007B00027E00038800 - 066B0108FFFCF9FAFFFBFBFFFCFFFFFC1B03052603072800052100021D030312 - 000025100F130000341F1E150100100000DCCDCBFFFEFCD7C8C6877574A69291 - 130000150000391D1DFFFBFC240405A89090FFFEFFFAFFFEF6FBFAFAFFFFFAFF - FFECF4F36C7370050A08FFFFFE0700001306041702012509091F000026000022 - 00002D0E111B0003FFFCFE150000DAC2C48973751600022C1618130000190103 - 1800002104072F101328070B260307FFFAFAFFFEFAFFFFF9FFF8F65204056100 - 026600005B00005301004502003B00004407053700004506083500003A040935 - 00033F05063F03043D01023900004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00013C00 - 003D02003C00004202013F00004302013F00003E01003C00003C01003B000045 - 04034500004D00005000006104056F02047602017801027901017B01017D0101 - 7D01017F00018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000017E00 - 007D02007B00027E00038800066B0108FFFDF9FAFFFBFBFFFCF5F2EE21090B2A - 070B220000210000230909130000170000260C0C1500001702011D0908837170 - FFFEFCFFF1EFFFFEFCFFEEEDFFFDFCFFFDFCFFF0F3FFFCFC230407846E70FAF6 - F5FAFFFFFAFFFFF2FAF9F7FFFEF8FFFF818885000100FFFFFE070000190C0A1A - 06051700001C00002904062000001B0000170000D2BABCA08A8CC8B2B4250F11 - 1300001500001700011F04071900001C00001E00011C00001C0000FFFCFCFFFE - FAFFFFF9FFF8F74604055300015900015000004B00004101003E04003B00003F - 03033B00003E03073700033702053600003800003A00013D03044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000013E00013D00004201033E00004201033E000041000240 - 00003E00013D00004201033E0000430003410000460002500000670003700000 - 7300037601027A02037C01037E01038001038000018000018000018000018001 - 008001007F01007F010080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000017F00008001007D00027F00038A00066B0108FFFDF9FA - FFFBFBFFFCFFFFFC230B0D23000430070C2400012C0D0E1C00002E0F0E1E0000 - 200001270B0B2208081300001F0D0E1202031D0D0E1303041303041F0D0E1B06 - 091300003922267D6D6EFFFFFEFBFFFEF8FDFBF9FEFCFBFFFEF9FCFA7A7B790B - 0706FFFEFE11050519090A18020426090C2000032C070B240203270B0B150000 - 857170FFFDFCFFFEFC0E00002C1A1913000022080822030429090A2000002B0B - 0C1D0000270B0BFFFDFCFFFDFBFFFEFCFFFBFC2F00023C000143000049010144 - 00004300003F00004003013C00004002023A00003D01023C0001410204400103 - 3E00013B00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004A00015F00006B00006E00027401047801027901027D00027E00018000 - 018200018200018200018001008001008001007F010080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018100008001007F00027F - 00038A00066B0108FFFDF9F8FFFBF6FCF7FEFBF71A02041E0000290003230000 - 2304051B00002000002F09092803051C00001E0202947F7E7967680F0102897B - 7C867A7A86787A8E8082938285857477867376978A8CFFFDFCF9FEFCF3F8F6F4 - F9F7FDFFFEFFFFFE888483050000FFF9F90C00001100001300001C00021C0000 - 2000011C0000190000200B0A210F0EFBECEAC7BAB81205030E00001804031A00 - 001C00002200011E00002202031900001B0101FFF9F8FFFBFBFFFEFEFFF4F42D - 0B0B2B00004108073D00004401004200004505013A0000450806370000440606 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605074500005700006300006800016F01037401 - 047800037B00007C000082000284000284000184000182000080010080010080 - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018100008001007F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC - 240C0E23000433070D2500012D0E0F1E00002500002B03042000001C00001C02 - 02DFCAC99A88890E0001FFFEFEFFFEFEFFFDFFFFFBFDFFFDFFFFFDFFFFF9FCFF - F4F6FFFDFCFDFFFEFDFFFEFDFFFEF4F5F3F5F6F48682810E0606FFFEFE120405 - 1D080A1B0305270A0D2000032A070B230206280C0C190101120000E3D4D2C3B6 - B41508061C0D0B1804032509092404052C0A0B2000002C0C0D1D0000250B0BFF - FDFCFFFEFEFFFAFAFFFCFC1E00003A090B3300004707074100004502003B0000 - 490908370000480A0A3700004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004701025000 - 005A00006200006A02037002047700037B00007D000084000286000286000186 - 0001840000820000800100800100800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018100008001007F00027F00038A00066B0108 - FFFDF9F8FFFBF6FCF7FEFBF71A02041E00002900032300002304051B0000350F - 0F230000200000270708170000D9C5C48676770B0000FFFAFAFFFEFEFFFEFFFA - F2F3FFF7F9FFFDFFFFFDFFFFFEFFFFFFFEF7FAF8FFFFFEFFFFFEFFFFFEFFFFFE - 85807F070000FFF9F90C00001300001500001C00021B00001E00011C00001900 - 001F0707120000948583FFF8F60C00001000001300001A00001C000024000120 - 00002402031B00001B0101FFF9F8FFFAFAFFFEFEFFF0F03210102B0000460D0C - 3A00004502014100004808043900004A0D0B370000480A0A3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706084100004A00005100005901016302046D02047401047C000381 - 0003860002870002870001870001860001840001820001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001810000800100 - 7F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E2300043307 - 0D2500012D0E0F1E00002B0505230000351012220203170000D8C4C38F7F8009 - 0000FDF5F5FFFFFEFFFEFFFFFDFEFFFEFFFFFAFBFEF6F7FFFDFEFFFFFEFEFFFD - FCFAF9F8F6F5FBF9F8FFFFFE928D8C110909FFFEFE1404051D080A1B03052409 - 0C1F000328070B2302062B0F0F1600001E0A09897A78FFFCFA0D00002D1B1A13 - 00002408082404052E090B2200002E0C0D1D0000250B0BFFFDFCFFFEFEFFF9F9 - FFFCFC1E00003C0B0D3300004808084100004502003A00004A0A093700004A0C - 0C3700004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004301024300004A00005101005C - 02026602027002047B0004820004860002890002890002870001860001840001 - 8200018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018100008001007F00027F00038A00066B0108FFFDF9F8FFFBF6FC - F7FDFAF61A02041E00002800022300002304051B00002D0707230000330E101D - 00001C0202D6C2C1928485070000FFFFFEFFFFFEFEFCFCFFFFFFFFFFFFFFFFFF - FDF8F9FFFDFEFFFBFAFFFFFEFFFFFEFFFEFDFFFFFEFEF9F87D7575090000FFF9 - F90E00001300001300001A00021900001E00011C00001900001B030312000027 - 1514FFFDFB0E00001000001601001C00001E00002400012000002402031B0000 - 1B0101FFF8F7FFFBFBFFFEFEFFF1F1310F0F2B0000440B0A3B00004502014100 - 00470703390000480B093700004709093A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00003E01004001004801005100005D00006A0002780004800005860004870002 - 8900028700028600018400018200018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018100008001007F00027F00038A00 - 066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E23000433070D2500012D0E0F1E - 0000300A0A230000220000220304220808CAB8B7877B7B070201FFFFFEFFFFFE - F8F8F8F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFFFEFDFFFDFCFFFFFEFFFF - FEBAB5B4312929090000FFFEFE1204051B090A19030524090C1D000327080B22 - 0306290D0D170000230E0D100000FFFEFC0E0000231110170201260708260405 - 2E090B2200002E0C0D1E0000270B0BFFFDFCFFFEFEFFFCFCFFFCFC2000003706 - 083600004505054200004401003D00004606053700004507073800004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00003E00003902003901003F0000480000550000630000 - 7100037C01058000048600048600028600028400028200018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018100 - 008001007F00027F00038A00066B0108FFFDF9F8FFFBF6FCF7FEFBF71A02041E - 00002900032300002304051B00002200002901022400011E0000150000D0BEBD - 8D8181050000F6F4F3FFFFFEFDFFFFFCFEFEFBFDFDFBFDFDF9FBFBFCFCFCFFFF - FEFFFFFEFFFFFEFAF5F48C87860803020700008A8282FFFAFA0C000010000112 - 00001901031700001C00021900001900001C0202190403100000FFFCFA1F100E - 1200001500001D00001E00002600012200002601031C00001E0202FFF9F8FFFC - FCFFFEFEFFF8F82907072E00003E05043F00004300004300004202003E000040 - 03013C00004002023F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100023C0000390401370200 - 3F04024300005301005900006600006D00007D02067F00048100037F00007D00 - 007D00007E00017F000280000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018100008001007F00027F00038A00066B0108FFFDF9F8 - FFFBFBFFFCFFFFFC230B0D23000432060C2500012C0D0E1E00002C0808240000 - 2E0C0D1D0000230B0BD5C3C28E82820B0605FFFFFEFFFFFEFDFFFFFBFFFFFBFF - FFF9FEFDFDFFFFFEFEFEFFFFFEFFFEFECDC5C50700001D1817080302C1BCBBFF - FEFEFFF9F9897D7D1F11121505061F0A0C1300002D1517160000270B0B250B0B - 261110867473FFFEFC0E00002E1A191500002607082503042F080A2400002F0A - 0C1E0000270B0BFFFDFCFFFDFDFFFEFEFFFCFC2402023201033A010042020242 - 00004300004000004202013C00004002023C0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00003D01023701003A07043500004807064300005903035900006600007201 - 047700037A00037B00027C00017C00017D00027D00027F000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018100008001007F00027F - 00038A00066B0108FFFDF9F8FFFBF6FCF7FEFBF71A02041E0000290003230000 - 2304051B0000230000220000240203190000180302C9BAB8857979050000FEFC - FBF4F5F3FDFFFFE5EAE9FBFFFFFDFFFFFCFEFEFAF8F8FDF8F7847C7C0700000D - 0807898483FCF7F6FFFEFDFFFFFEFFFCFCFFFEFEFFFBFB7B6D6E908081B09E9F - 8570728F797B8E7474947A7A968180FFFAF99B89881000001200001500001D00 - 002000002600012200002601031C00001D0101FFF9F8FFFBFBFFFEFEFFF4F42D - 0B0B2B00004108073D00004401004200004505013A0000450806370000440606 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073C00003D0504330000430A083900005109 - 094500005A04045A00006500026A00026E00027401047800047A01057A02037B - 00027F0001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018100008001007F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC - 240C0E23000433070D2500012D0E0F1E00002D09092300002C0C0D1C0000220D - 0CD3C4C28F83830B0605FFFFFEF3F4F2FAFCFCFDFFFFFBFDFDFFFFFFFFFFFF81 - 7F7F211C1B150D0D8F8A89FFFDFCFAF5F4FFFFFEFFFFFEFFFCFBFDF9F8FFFFFE - FFF9F9FFFBFBFFFEFEEDDFE0FFFDFEFFFCFEFFFCFCFFFCFCFFF2F2A28E8D200E - 0D1000003D292815000028080928030530090B240000300B0D200000290A0BFF - FDFCFFFEFEFFFAFAFFFCFC1E00003A090B3300004707074100004502003B0000 - 490908370000480A0A3700004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004001033900 - 004209083500004A0D0B3A0000520A0A4500005402015700005D00006602026D - 02047103057502057902037901027F0001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018100008001007F00027F00038A00066B0108 - FFFDF9F8FFFBF6FCF7FEFBF71A02041E00002900032300002304051900002100 - 00200000220203190000180302C9BAB8857979050000EBE9E8FFFFFEFBFBFBFE - FEFEFFFFFFBEBCBC04000004000005000075706FFFFFFEFAF6F5FFFDFCFDFBFA - FFFFFEFFFDFCFFFFFEFDF9F8FFFFFEFFFEFDFAF0F0FFFBFBFFFEFEFFF3F4FFF9 - F98C70702109091200001000001000001500002107071D000020000027000123 - 00002801031E00001F0001FFF9F8FFF9FAFFFEFEFFF0F03210102B0000460D0C - 3A00004502014100004808043900004A0D0B370000480A0A3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E0000420404390000490B0B3700004A0D0B39000049080744 - 00004A00005100005B01016201036B03047002047401047801027D0101800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001810000800100 - 7F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E2300043307 - 0D2500012D0E0F1C00002B09092100002C0C0D1B0000210C0BD3C4C28F83830D - 0505FFFFFEFFFFFEECEAEAFFFFFF817C7D0500001C1415847C7DFFFFFEFCF7F6 - F8F3F2FFFFFEFFFFFEF7F8F6FFFFFEF6F7F5EDEEECF8F9F7F7F5F4FFFFFEFFFC - FBFFFFFEF4ECECDACCCD170000240808260E0E1200002E1C1B1000001D080717 - 000027070828030531090B250000320B0D200000290A0BFFFDFCFFFDFEFFF9F9 - FFFCFC1E00003C0B0D3300004808084100004502003A00004A0A093700004A0C - 0C3700004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A000042010341000048060739000048 - 0A0A350000430A08360000400503400000470000500000590101630101690102 - 6E00027500017D00028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018100008001007F00027F00038A00066B0108FFFDF9F8FFFBF6FC - F7FDFAF61A02041E00002800022300002304051900002100001E000022020317 - 0000160201C9BAB8857979070000FDF8F7F8F4F39C97980500000B0506857D7E - D2C7C9FFFDFFE4DFDEFFFFFEFFFEFDF7F5F4FFFFFEFCFFFDF6F9F7FDFFFEFDFF - FEF8FBF9FDFFFEFFFFFEF9F7F6FFFFFE807C7B0C00001E06062307071500001D - 08071200001501001A05041700001F00002200002700012300002801031E0000 - 1F0001FFF7F7FFFAFBFFFEFEFFF1F1310F0F2B0000440B0A3B00004502014100 - 00470703390000480B093700004709093A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A000044030540 - 00004802034200004705063700004108073200003A07043702003A0200400100 - 4900005100005B00006400006B00007300007D00028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018100008001007F00027F00038A00 - 066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E23000433070D2500012D0E0F1C - 0000290A091F00002B0C0D190000200C0BD3C4C28F83830D0505C9C4C38E8988 - 0E08090E0607CDC2C4FFFDFFFFFDFFFFF4F6FFFFFEFEFAF9FFFFFEF7F5F4FFFF - FEEDF0EEFDFFFEFBFFFEE8EDEBF9FEFCFAFFFDF6F9F7898A8802000017151409 - 00001D05051900002F151519040324100F1200002914131700002907082A0305 - 31090B250000320B0D2200002A0A0BFFFCFCFFFDFEFFFCFCFFFCFC2000003706 - 083600004505054200004401003D00004606053700004507073800004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004100014600014802034000004103033800003C0403 - 3701003904013A03003E01004200004900005000005800005F00006500007202 - 027601027601027601027801027801027901027901027B00027B00027D00027D - 00027F00027F00027F00027F00027F00017F00017F00017F00017F00017F0001 - 7F00017F00017F00017F00017F00017F00017F00017F00017F00018000018100 - 008000017D00027C0003830008660208FFFCFBFDFFFBF8FCF7FFFAF71C010420 - 00002600032000002304051B00002300002000002503041900001A0202CCBAB9 - 8678790900000904030702017F797AFFFBFCFFFDFFFCF1F3FFF7F9FFFEFEFFFF - FEF3F4F2FFFFFEFFFFFEFDFFFEFDFFFEF4F7F5FFFFFEFFFFFEFFFFFEC4C2C104 - 00000904030700000900001002031800001C00001800001500001300001F0A09 - 1500001F03031E00002000002600012200002601031E0000210102FFF8F8FFFB - FCFFFEFEFFF8F82907072E00003E05043F00004300004300004202003E000040 - 03013C00004002023F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E0000410002400001410001400000 - 4201033E00004001033C00003D01023C00003E00003F00004301024100004701 - 024500004A00014E00005500005A00005E02015C00006505056602026B05066E - 03057305077302057A05087700037D04087A00037F01067D00047C00017A0000 - 7D00027900007E01037900007D00027B00007C00017A00007D00027900007E01 - 037900007D00027D00007E00007D00017A020771000474010B580008FFFBFBFF - FFFCFFFFFEFFFEFE290A0B27000229090A1D00002C0E0D2100003A0D10290000 - 2D04092B060A331619C2ACAED8C8C9090000837E7DBFBBBAFBF7F6FFFFFEFFFF - FEFFFDFCFFFCFCFFFBFAF5FAF8F8FFFCFAFFFCF6FCF7FDFFFCF3F4F0FFFFFCFE - F9F6FFFDFA8A7E7C2A1B191000001F0A091C04042309091A0000270809210203 - 2509091C0000270B0B1E020224080820010226070823030429090A1E00002B0B - 0C1E0000290A0BFFFCFCFFFCFDFFFEFEFFFCFC2402023201033A010042020242 - 00004300004000004202013C00004002023C0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004200014400004C010046000055 - 05044C00005B05055700005F01026500026D040768000076070B6D00007C060B - 7500027A02077700037A05067100007D08097000007C07087300007803047500 - 017A05067100007D08097000007C07087300007B02067B00018002086E000372 - 080F6300035A0A11FFF6F8FFFEFCFCFAF9FFF9F92101022200001F0100170000 - 2306022000002500002800002500021C0000170000E7D2D4C4B8B8837E7DFFFF - FEFFFFFEF9FCFAF5F8F6F9FAF8FFFFFEFFFFFEFFFFFEFAFFFCF4FEF8F6FDF8FB - FFFCF2F6F1FFFFFCFFF8F59185831809071000001300001700002405061C0000 - 2100001C00001E00001B00001E00001B00002001021B00001C00001B00001C00 - 001B00001F00011B00002102031B00001F0001FFF8F8FFFAFBFFFEFEFFF4F42D - 0B0B2B00004108073D00004401004200004505013A0000450806370000440606 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073F - 00004300003E00004C07044000005308064700005604035100005A0000560000 - 6906085A000070090C61000072070A6B00036E0305660000750A0C620000760B - 0D6400007207096A00016E0305660000750A0C620000760B0D6400007207096D - 00017500026E000075090F5900006D0A12460000FFFBFCFFFFFCFFFFFEFFFEFE - 2B0B0C270002290B0A1900002E0F0C21000024040528090C2005081400011709 - 0A817979FFFFFEF5FAF8F1FAF7F4FFFCF6FFFEF6FFFEF8FFFEEFF8F5F5FCF9FA - FFFEF0F6F1F4FAF5FDFFFCFDFEFAFFFFFCC0BBB88A817E0D0000100000120000 - 2810101C02022001021D00002F0D0E22020328080922030428090A1E00002A0B - 0C200102270809210203270809230405290A0B1D00002B0C0D1D0000290A0BFF - FCFCFFFDFEFFFAFAFFFCFC1E00003A090B3300004707074100004502003B0000 - 490908370000480A0A3700004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004809053900004E0E0A3C0000520B08 - 4200004F02004B00005704034C0000620A0A50000066090A5700006002035A00 - 00630605530000680B0A5300006609085500005F02015A000063060553000068 - 0B0A5300006609085500006300026400006D020555000064080D5000004F090F - FFF0F1FFFFFCF8FBF9FFFAF92101022200001F01001700002405021C00001F03 - 031500001200000E0000201616040000F3F6F4F9FFFDF6FFFEF0FEFAEEF9F6F3 - FEFBF6FFFEF8FFFEF6FDFAF2F7F5FFFFFCF0EFEBFFFEFAFFFFFC7B7471170E0B - 0E01001000001F0B0A1601001E04041900001B00001C00002301021E00001E00 - 001B00001E00001B00002001021B00001C00001B00001C00001B00001F00011B - 00002102031B00001F0001FFF8F8FFF9FAFFFEFEFFF0F03210102B0000460D0C - 3A00004502014100004808043900004A0D0B370000480A0A3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003F0604350000 - 460D0B3500004B0E0C390000490807410000470101400000530909430000580A - 0B4700005505064B000050000147000057070847000059090A4700005404054B - 000050000147000057070847000059090A4700005404054E00005B0000530000 - 5C080A4700005C080D370000FFFCFCFEFDF9FBFFFEFFFFFE2B0B0C270002290B - 0A1900002E0F0C1F00002E14141701031A05070E00002418180F0A09939190FD - FFFEF7FCFAFAFFFEFBFFFEF8FDFBFBFEFCFDFFFEFFFFFEFFFFFEFFFFFCFFFFFC - BFB3B11205031407050E0000210F0E1300001B03031700002105051E00002606 - 071F00002C0A0B22000128080923030429090A1F00002B0B0C21010227070822 - 02032707082404052A0A0B1E00002C0C0D1E00002A0A0BFFFCFCFFFDFEFFF9F9 - FFFCFC1E00003C0B0D3300004808084100004502003A00004A0A093700004A0C - 0C3700004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023700003D0805320000430C093200004209073600004003013D00 - 004606053A00004D0A093C00004B08073E00004600004300004B05053E00004F - 09093E00004E08083F00004701014300004B05053E00004F09093E00004E0808 - 3F00004B01014E00005705044200004F090A420000440B0EFFF5F4FDFFFCF5FC - F9FDF9F82001022200001E00001700002405021C00001B00001900002E131619 - 03051402030E00000B00000900008C8484B4ACACD2CACACCC4C4C0B6B6C4B8B8 - CBBDBECCBEBFCABBB982706F1A08071200001200001C07061C0404170000280E - 0E1900001B00001B00001E00001C00002100001E00001E00001C00001F00001C - 00002101021C00001D00001C00001D00001C00002000011C00002202031C0000 - 200001FFF7F7FFFAFBFFFEFEFFF1F1310F0F2B0000440B0A3B00004502014100 - 00470703390000480B093700004709093A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003A02013200003C07043000003E09 - 063300003D06033900003B02003800004207053700004508063900004306043E - 01004202023D00004706083A00004807093B00004504063F00004201033D0000 - 4706083A00004807093B00004504064000004800004400004707063700004906 - 09300000FFFEFCFBFFFCF8FFFEFFFFFE2A0B0C270002290B0A1900002D100C21 - 00003D161823000030080D2400031C00001B000045282B170000260B0E22070A - 1C01041B00012506092D0E1129080C1B0000250B0B230B0B220A0A1C02023F25 - 251700001900002408082307071B00002102032505063313142606072707081C - 000028080923030429090A1F00002B0B0C210102270708220203270708240405 - 2A0A0B1E00002C0C0D1E00002A0A0BFFFCFCFFFDFEFFFCFCFFFCFC2000003706 - 083600004505054200004401003D00004606053700004507073800004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00013A01 - 003B04013801003C05023801003D06033A03003C05023800003A01003700003D - 04023900003F06043C03013E05043B00003D01023A00003E02033900003E0203 - 3B00003C00013B00003D01023A00003E02033900003E02033B00003E00003F00 - 00410200360000390100390000330406FFF9F7FAFFFCF3FCF9FEFAF920010222 - 00001D01001700002306021E00002500002F0107270000280002260002220000 - 2100002000002200012000002200002200002300002500002500002500011C00 - 001900001B00001900001B00001B00003213141B00002001021B00002303041C - 00001C00001C00002404051E00001F00001C00001F00001C00002101021C0000 - 1E00001C00001E00001C00002000011C00002202031C0000210102FFF8F8FFFB - FCFFFEFEFFF8F82907072E00003E05043F00004300004300004202003E000040 - 03013C00004002023F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00013E00003B00003E02023A00003E02023A00003D01013A - 01003C00003B00003E02023A00003C03023800003B02013A01003C00013D0002 - 4000053C00014000053C00013F00043E00033E00033D00024000053C00014000 - 053C00013F00043C00013F040232000045120F2E000043090A290000FFFEFCF5 - FBF6F4FBF8FFFFFE1F00012B0406311514150000280D0922030230080A2A0004 - 31050B250000330A0F2600032D050A2500022F070C2700042F060B2500003509 - 0F2B000332040A2800022B090A2001022808091B00002C0C0D2000012707081F - 000028090A2001022708091B00002B0C0D1F00012607081E000028090A200102 - 2708091B00002B0C0D1F00012607081E0000240506270809290A0B1B00001C00 - 002A0B0C1B0000FFFCFCFFFDFEFFFDFDFFF8F82100004211133600004A0A0A3C - 00004300004000004202013C00004002023C0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004404043A000047 - 07073900004406063A00003F01013D0000420404380000430707350000420606 - 3800003D01013D00004202073A000045050A3900004404093C00003F00043F00 - 024202073A000045050A3900004404093C00003F00023900003F0B052B00003C - 0B09330000491A1CFFF0EEFDFFFCFAFFFEFCF7F6200001220000230A08130000 - 1C03001900002000011E00002100021E00002401051E00001E00011C00002200 - 031E00002300022000002601052200002400012200002200011C00001F00001C - 00002202031B00001E00001B00001F00011B00001E0000190000210203190000 - 1D00001900001F00011900001E00001900002102031900001D00001900001B00 - 001900002506072509092B0C0D1900001B0000FFF4F4FFFDFEFFFEFEFFE9E930 - 0E0E2B0000370000390000520F0E4200004505013A0000450806370000440606 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004301023B00004A08093A00004B090A3A00004705063E00004202023A0000 - 490909370000480A0A3700004406063E00004201033A00004A070A3900004B08 - 0B3900004704073E00004300033A00004A070A3900004B080B3900004704073C - 00003400003300004919152E00004E12132F0000FFEFEEFFFFFCFBFFFEEDE5E5 - 4222232200001C030112000028140F230E0C1B07061601031B06081400011D08 - 0A1601031A05071500021B06081601031C06081500011E080A1901031D05071A - 00022405061F00012405061D00002607081D01012304051C00002206061D0101 - 2206061900002408081B01012105051A00002206061B01012206061900002408 - 081B01012105051A00002C10101700001900001700001F0303190000472B2BFF - F5F4FFFBFBFFF8F8FFFCFC1E00004211133300004707073C00004502003B0000 - 490908370000480A0A3700004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033F00004A06073C00004F0B0C3C00004D090A - 3A00004301023F00004806073900004C0C0C3900004A0A0A3900004202023F00 - 004805083A00004D0A0D3A00004B080B3A00004300033F00004805083A00004D - 0A0D3A00004B080B3A00004202023D02003D06013906033200003F0000370205 - FFFDFCFFFFFCFAFBF9FFFEFEFFE9EAFFF6F8FFFDFBFFFCF9FFFCF7FFEFECFFFE - FCFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFDFEFFFEFEFFFDFEFFFDFEFFFDFEFF - FDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFC - FFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFC - FCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFF7F7FFFCFCFFFCFCFF - FCFCFFFCFCFFEDEDF7DFDFFFFDFCFFFEFEFFFEFEFFF5F52000002B00004A1110 - 3F00004704034100004808043900004A0D0B370000480A0A3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E00004300033A0000 - 4B080B3A00004D0A0D3A00004805083F00004300033A00004B080B3A00004D0A - 0D3A00004805083F00004301023A00004B090A3A00004D0B0C3A00004806073F - 00004301023A00004B090A3A00004D0B0C3A00004806073E0000430302350000 - 3B0401370000510C0F320000FFFCFCEDE6E3FDFBFAFFFEFEFFFAFCFFF9FBFFFD - FBFFF8F5FFFFF9FFFEFBFFF9F7FFFAFAFFF9F9FFFBFBFFF8F8FFFBFBFFF9F9FF - FBFBFFF9F9FFFAFAFFF9F9FFFBFBFFF8F8FFFBFBFFF9F9FFFAFBFFF8F7FFF8F8 - FFF7F7FFF9F9FFF6F6FFF9F9FFF7F7FFF9F9FFF7F7FFF8F8FFF7F7FFFAF9FFF6 - F6FFFAF9FFF7F7FFFAF9FFF8F7FFF9F8FFF8F7FFFAF9FFF7F6FFFAF9FFF8F7FF - FAF9FFF6F5FFFDFCFFFAF9FFF1F0FFFDFCFFFDFCFFFDFCFFF9F8FFFEFEFFFBFB - FFFCFC2B09093F0E103500003C00004906054502003A00004A0A093700004A0C - 0C3700004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3B00004201033F00 - 004605073A00004B080B3A00004A070A3B00004300033F00004705063A00004B - 090A3A00004A08093B00004301023F00004705063A00004B090A3A00004A0809 - 3B00004302013B00004203003A00004F1111410000420509FFFBFCFFFFFCFFFC - FBFFF9FAFFFAFCFFF8FAFFFBF9FFFBF8FFFBF5FFFEFAFFFEFCFFFDFEFFFDFEFF - FDFEFFFCFDFFFDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFCFDFFFDFE - FFFDFEFFFDFEFFFDFCFFFDFCFFFDFCFFFDFCFFFCFBFFFDFCFFFDFCFFFDFCFFFD - FCFFFDFCFFFDFCFFFDFCFFFCFBFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF - FDFCFFFCFBFFFDFCFFFDFCFFFDFCFFFAF9FFFDFCFFFBFAFFFDFCFFFBFAFFFDFC - FFFCFBFFF7F5F9EFEFFFFEFEFFFBFB2A08083100023500004808084401004100 - 00470703390000480B093700004709093A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00003F00023A00004405073700004506 - 083800004403053D00004100023A00004605073900004706083A00004403053F - 00004101013C00004606053900004707063A00004404033F00004101003C0000 - 4606053900004707063A00004404034000004D0A073F00005212113A00005407 - 0B400003FFE2E3FFFEFCFFFEFEFFFDFEFFFAFCFFFAFCFFFDFBFFFFFBFFF7F1FF - F9F6FFF5F4FFFBFDFFF4F7FFFBFEFFF1F4FFFBFEFFF5F8FFFBFEFFF3F6FFFAFD - FFF4F7FFFBFEFFF2F4FFFCFEFFF6F8FFFCFEFFF5F4FFFCFBFFF6F5FFFDFCFFF3 - F2FFFDFCFFF7F6FFFDFCFFF5F4FFFCFBFFF6F5FFFDFCFFF3F2FFFDFCFFF7F6FF - FDFCFFF5F4FFFDFBFFF6F5FFFEFCFFF3F2FFFEFCFFF7F6FFFEFCFFFDFCFFFEFC - FFF9F8FFFEFCFFF5F4FFFEFCFFF8F7FFFEFCFFFEFEFFFEFEFFFCFC1E00004918 - 1A3300005313133C00004401003D00004606053700004507073800004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000013E00 - 013D01023C00004001033C00004001033D00003E00013E00013F00023C000040 - 01033E00004201033F00004000014000004101003E00004202013E0000420201 - 3F00004000004000004101003E00004202013E00004202013F00004100003C00 - 004A07063A00004C0809480000470409300607290D0D1300002408082A000031 - 02041D00002108061C03002C100F2300002D0608270001330B0D2300002F0709 - 2A000232070A2600002E0608270001330B0D2200002C07092700022B090A1E00 - 002408071D0101290D0C190000250908200102280A091E00002608071F00012B - 0D0C1B0000270908210102280A091C00002408071D0101290D0C190000250908 - 1E0202260A091D01012105041900002A0E0D1900002D11101900002208081500 - 002B11111E00002500003703034D1112390000500F0E4300004201003E000040 - 02023C00004002023F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013D00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000004000013F00004201033E00004201 - 033E00004100024000004100004000004202023F00004500033E00003A010235 - 00033301033400023C0105380000390303330000360202350101370003380002 - 3B02053700013B02053700013A01043900033900033800023B02053700013B02 - 053500013A010437000335000334000037020533000037020533000036010435 - 0101350003340000370205330000370205330000380104350101350003340000 - 3702053300003702053300003601043501013500033400003702053300003702 - 053300003601043500033301033400023902053700003E02033C000041000240 - 00004100003F00004202023E00004201033E0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000013D00003E0000400001430204} - end - object lblWelcome: TLabel - Left = 172 - Top = 10 - Width = 318 - Height = 50 - Caption = 'Welcome to the Metamod:Source (version) Setup Wizard' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -21 - Font.Name = 'Tahoma' - Font.Style = [] - ParentFont = False - WordWrap = True - end - object lblInfo1: TLabel - Left = 172 - Top = 82 - Width = 331 - Height = 26 - Caption = - 'This wizard will guide you through the installation of Metamod:S' + - 'ource (version).' - WordWrap = True - end - object lblInfo2: TLabel - Left = 172 - Top = 120 - Width = 335 - Height = 39 - Caption = - 'It is recommended that you close all other applications before s' + - 'tarting a setup for e.g. Half-Life 2 or other games. Otherwise y' + - 'ou should restart your system after this installation.' - WordWrap = True - end - object lblInfo3: TLabel - Left = 172 - Top = 176 - Width = 108 - Height = 13 - Caption = 'Click Next to continue.' - end - end - object jspLicense: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - object pnlLicense: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon1: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Stretch = True - Transparent = True - end - object lblTitle1: TLabel - Left = 12 - Top = 8 - Width = 116 - Height = 14 - Caption = 'License Agreement' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSubTitle1: TLabel - Left = 22 - Top = 28 - Width = 408 - Height = 13 - Caption = - 'Please review the following license terms before installing Meta' + - 'mod:Source (version).' - end - object bvlSpacer1: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object freLicense: TmxFlatRichEdit - Left = 10 - Top = 62 - Width = 507 - Height = 207 - Lines.Strings = ( - 'The zlib/libpng License' - '' - 'Copyright (c) 2006, AlliedModders' - '' - - 'This software is provided '#39'as-is'#39', without any express or implie' + - 'd warranty. In no event will the ' - - 'authors be held liable for any damages arising from the use of t' + - 'his software.' - '' - - 'Permission is granted to anyone to use this software for any pur' + - 'pose, including commercial ' - - 'applications, and to alter it and redistribute it freely, subjec' + - 't to the following restrictions:' - '' - - ' 1. The origin of this software must not be misrepresented; y' + - 'ou must not claim that you wrote the ' - - 'original software. If you use this software in a product, an ack' + - 'nowledgment in the product ' - 'documentation would be appreciated but is not required.' - '' - - ' 2. Altered source versions must be plainly marked as such, a' + - 'nd must not be misrepresented as ' - 'being the original software.' - '' - - ' 3. This notice may not be removed or altered from any source' + - ' distribution.' - '') - ReadOnly = True - ScrollBars = ssVertical - TabOrder = 1 - Activate = True - BorderColor = clBtnShadow - Flat = True - ShowBorder = True - Version = '1.26' - end - object frbAgree: TFlatRadioButton - Left = 10 - Top = 274 - Width = 231 - Height = 17 - Caption = 'I accept the terms in the License Agreement' - TabOrder = 2 - OnClick = CheckNext - end - object ftbDontAgree: TFlatRadioButton - Left = 10 - Top = 290 - Width = 265 - Height = 17 - Caption = 'I do not accept the terms in the License Agreement' - Checked = True - TabOrder = 3 - TabStop = True - OnClick = CheckNext - end - end - object jspInstallMethod: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - object lblInstallMethod: TLabel - Left = 124 - Top = 124 - Width = 144 - Height = 13 - Caption = 'Please select a install method:' - end - object pnlHeader2: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon2: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Transparent = True - end - object lblTitle2: TLabel - Left = 12 - Top = 8 - Width = 137 - Height = 14 - Caption = 'Choose install method' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSubTitle2: TLabel - Left = 22 - Top = 28 - Width = 263 - Height = 13 - Caption = 'Choose a install method for installing Metamod:Source.' - end - object bvlSpacer2: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object pnlInstallMethod: TPanel - Left = 122 - Top = 142 - Width = 267 - Height = 97 - BevelOuter = bvLowered - TabOrder = 1 - object frbDedicatedServer: TFlatRadioButton - Left = 4 - Top = 4 - Width = 135 - Height = 17 - Caption = 'Steam Dedicated Server' - Checked = True - TabOrder = 0 - TabStop = True - end - object frbListenServer: TFlatRadioButton - Left = 4 - Top = 22 - Width = 115 - Height = 17 - Caption = 'Steam Listen Server' - TabOrder = 1 - end - object frbSelectMod: TFlatRadioButton - Left = 4 - Top = 58 - Width = 117 - Height = 17 - Caption = 'Select mod directory' - TabOrder = 3 - end - object frbFTP: TFlatRadioButton - Left = 4 - Top = 76 - Width = 35 - Height = 17 - Caption = 'FTP' - TabOrder = 4 - end - object frbStandaloneServer: TFlatRadioButton - Left = 4 - Top = 40 - Width = 107 - Height = 17 - Caption = 'Standalone Server' - TabOrder = 2 - end - end - end - object jspSelectMod: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - object lblInfo: TLabel - Left = 138 - Top = 114 - Width = 255 - Height = 26 - Caption = - 'The following mods were detected. Please select the mod you want' + - ' to install Metamod:Source to:' - WordWrap = True - end - object shpMods: TShape - Left = 136 - Top = 142 - Width = 255 - Height = 104 - Pen.Color = clBtnShadow - end - object pnlSelectMod: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon5: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Stretch = True - Transparent = True - end - object lblSelectMod: TLabel - Left = 12 - Top = 8 - Width = 68 - Height = 14 - Caption = 'Select Mod' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSelectModInfo: TLabel - Left = 22 - Top = 28 - Width = 332 - Height = 13 - Caption = - 'Please select the mod Metamod:Source (version) shall be installe' + - 'd to.' - end - object bvlSelectMod: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object trvMods: TTreeView - Left = 137 - Top = 143 - Width = 253 - Height = 102 - BorderStyle = bsNone - Indent = 19 - MultiSelectStyle = [] - ReadOnly = True - RightClickSelect = True - RowSelect = True - TabOrder = 1 - OnClick = trvModsClick - end - end - object jspFTP: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - object lblStep1: TLabel - Left = 44 - Top = 56 - Width = 100 - Height = 13 - Caption = '1. Set your FTP data' - end - object lblStep2: TLabel - Left = 44 - Top = 146 - Width = 244 - Height = 13 - Caption = '2. Connect to server and select the mod directory:' - end - object lblStep4: TLabel - Left = 44 - Top = 296 - Width = 64 - Height = 13 - Caption = '4. Click Next.' - end - object lblStep3: TLabel - Left = 44 - Top = 252 - Width = 223 - Height = 13 - Caption = '3. Select the operating system of your server:' - end - object pnlHeader3: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon3: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Transparent = True - end - object lblTitle3: TLabel - Left = 12 - Top = 8 - Width = 269 - Height = 14 - Caption = 'Installing Metamod:Source (version) via FTP' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSubTitle3: TLabel - Left = 22 - Top = 28 - Width = 189 - Height = 13 - Caption = 'Do the following steps and press Next. ' - end - object bvlSpacer3: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object pnlFTPData: TPanel - Left = 44 - Top = 72 - Width = 441 - Height = 64 - BevelOuter = bvLowered - TabOrder = 1 - object lblHost: TLabel - Left = 4 - Top = 4 - Width = 26 - Height = 13 - Caption = 'Host:' - end - object lblUserName: TLabel - Left = 180 - Top = 6 - Width = 52 - Height = 13 - Caption = 'Username:' - end - object lblPassword: TLabel - Left = 308 - Top = 4 - Width = 50 - Height = 13 - Caption = 'Password:' - end - object lblPort: TLabel - Left = 132 - Top = 4 - Width = 24 - Height = 13 - Caption = 'Port:' - end - object txtHost: TFlatEdit - Left = 4 - Top = 20 - Width = 121 - Height = 19 - ColorFlat = clBtnFace - ParentColor = True - TabOrder = 0 - end - object txtUserName: TFlatEdit - Left = 180 - Top = 20 - Width = 121 - Height = 19 - ColorFlat = clBtnFace - ParentColor = True - TabOrder = 2 - end - object txtPassword: TFlatEdit - Left = 308 - Top = 20 - Width = 127 - Height = 19 - ColorFlat = clBtnFace - ParentColor = True - PasswordChar = '*' - TabOrder = 3 - end - object txtPort: TFlatEdit - Left = 132 - Top = 20 - Width = 43 - Height = 19 - ColorFlat = clBtnFace - ParentColor = True - MaxLength = 5 - TabOrder = 1 - Text = '21' - OnChange = txtPortChange - end - object chkPassive: TFlatCheckBox - Left = 4 - Top = 44 - Width = 139 - Height = 16 - Caption = 'Use PASV (Passive) Mode' - Checked = True - TabOrder = 4 - TabStop = True - end - object cmdProxySettings: TFlatButton - Left = 350 - Top = 42 - Width = 83 - Height = 18 - ColorFocused = 16245198 - ColorDown = 16245198 - ColorHighLight = 8623776 - ColorShadow = 8623776 - Caption = 'Proxy-Settings' - TabOrder = 5 - OnClick = cmdProxySettingsClick - end - end - object cmdConnect: TFlatButton - Left = 416 - Top = 161 - Width = 71 - Height = 20 - ColorFocused = 16245198 - ColorDown = 16245198 - ColorBorder = clBtnShadow - ColorHighLight = clBtnShadow - ColorShadow = clBtnShadow - Caption = 'Connect' - TabOrder = 3 - OnClick = cmdConnectClick - end - object pnlDirectory: TPanel - Left = 44 - Top = 162 - Width = 367 - Height = 83 - BevelOuter = bvLowered - TabOrder = 2 - object trvDirectories: TTreeView - Left = 1 - Top = 1 - Width = 365 - Height = 81 - Align = alClient - BorderStyle = bsNone - Images = ilImages - Indent = 19 - TabOrder = 0 - OnChange = trvDirectoriesChange - OnCollapsing = trvDirectoriesCollapsing - OnExpanding = trvDirectoriesExpanding - OnExpanded = trvDirectoriesExpanded - OnMouseDown = trvDirectoriesMouseDown - end - end - object pnlOS: TPanel - Left = 44 - Top = 268 - Width = 441 - Height = 21 - BevelOuter = bvLowered - TabOrder = 4 - object optWindows: TFlatRadioButton - Left = 1 - Top = 3 - Width = 62 - Height = 14 - Caption = 'Windows' - Checked = True - TabOrder = 0 - TabStop = True - end - object optLinux: TFlatRadioButton - Left = 173 - Top = 3 - Width = 82 - Height = 14 - Caption = 'Linux (32-bit)' - TabOrder = 1 - end - object FlatRadioButton1: TFlatRadioButton - Left = 353 - Top = 3 - Width = 82 - Height = 14 - Caption = 'Linux (64-bit)' - Enabled = False - TabOrder = 2 - end - end - end - object jspInstallProgress: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - Caption = 'jspInstallProgress' - object ggeAll: TFlatGauge - Left = 8 - Top = 84 - Width = 509 - Height = 24 - AdvColorBorder = 0 - Color = clBtnFace - ColorBorder = 8623776 - MaxValue = 8 - Progress = 0 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -9 - Font.Name = 'Tahoma' - Font.Style = [] - ParentColor = False - ParentFont = False - end - object lblProgress: TLabel - Left = 8 - Top = 66 - Width = 46 - Height = 13 - Caption = 'Progress:' - end - object ggeItem: TFlatGauge - Left = 8 - Top = 112 - Width = 509 - Height = 24 - AdvColorBorder = 0 - Color = clBtnFace - ColorBorder = 8623776 - Progress = 0 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -9 - Font.Name = 'Tahoma' - Font.Style = [] - ParentColor = False - ParentFont = False - end - object lblDetails: TLabel - Left = 10 - Top = 152 - Width = 36 - Height = 13 - Caption = 'Details:' - end - object bvlSpace2: TBevel - Left = 4 - Top = 142 - Width = 519 - Height = 3 - Shape = bsTopLine - end - object pnlHeader5: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon4: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Transparent = True - end - object lblTitle5: TLabel - Left = 12 - Top = 8 - Width = 223 - Height = 14 - Caption = 'Installing Metamod:Source (version)' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSubTitle5: TLabel - Left = 22 - Top = 28 - Width = 296 - Height = 13 - Caption = 'Please wait while Metamod:Source (version) is being installed.' - end - object bvlSpacer5: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object rtfDetails: TmxFlatRichEdit - Left = 8 - Top = 166 - Width = 509 - Height = 139 - ReadOnly = True - ScrollBars = ssVertical - TabOrder = 1 - Activate = True - BorderColor = clBtnShadow - Flat = True - ShowBorder = True - Version = '1.26' - end - end - end - object pnlButtons: TPanel - Left = 0 - Top = 317 - Width = 527 - Height = 38 - Align = alBottom - BevelOuter = bvNone - TabOrder = 1 - object cmdNext: TFlatButton - Left = 438 - Top = 7 - Width = 85 - Height = 25 - ColorFocused = 16245198 - ColorDown = 16245198 - ColorBorder = clBtnShadow - ColorHighLight = clBtnShadow - ColorShadow = clBtnShadow - Caption = '&Next >' - TabOrder = 0 - OnClick = cmdNextClick - end - object cmdCancel: TFlatButton - Left = 4 - Top = 7 - Width = 85 - Height = 25 - Color = clBtnFace - ColorFocused = 16245198 - ColorDown = 16245198 - ColorBorder = clBtnShadow - ColorHighLight = clBtnShadow - ColorShadow = clBtnShadow - Caption = '&Cancel' - ParentColor = False - TabOrder = 1 - OnClick = cmdCancelClick - end - object cmdBack: TFlatButton - Left = 348 - Top = 7 - Width = 85 - Height = 25 - ColorFocused = 16245198 - ColorDown = 16245198 - ColorBorder = clBtnShadow - ColorHighLight = clBtnShadow - ColorShadow = clBtnShadow - Caption = '< &Back' - TabOrder = 2 - Visible = False - OnClick = cmdBackClick - end - end - object ilImages: TImageList - Left = 154 - Top = 324 - Bitmap = { - 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 - 0000000000003600000028000000400000001000000001002000000000000010 - 00000000000000000000000000000000000000000000008CBD00008CBD00008C - BD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00008CBD00008CBD00000000000000000000000000008CBD00008CBD00008C - BD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00008CBD000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD0063CEF700008CBD00A5F7 - FF0063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CE - F70039ADDE00ADF7FF00008CBD0000000000008CBD0021A5CE005ACEEF0084E7 - FF0063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CE - F70039ADDE001094C60000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD006BD6F700008CBD00ADF7 - FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6 - FF0039ADDE00BDEFF700008CBD0000000000008CBD004ABDE70031ADD60094EF - FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6 - FF0039B5DE00CEF7FF00008CBD00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD0073D6FF00008CBD00ADF7 - FF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDE - FF0042B5DE00BDEFF700008CBD0000000000008CBD0073D6FF00008CBD00ADFF - FF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDE - FF0042B5DE00CEF7FF00008CBD00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD007BDEFF00008CBD00B5F7 - FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7 - FF0042B5DE00C6F7F700008CBD0000000000008CBD007BDEFF001094C60094EF - FF0094EFFF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7 - FF004ABDE700CEF7FF001094C600000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD0084E7FF00008CBD00BDF7 - FF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEF - FF004ABDE700BDF7FF00008CBD0000000000008CBD0084E7FF0042B5DE005AC6 - EF00ADFFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEF - FF004ABDE700CEF7FF00CEF7FF00008CBD000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD008CEFFF00008CBD00D6F7 - FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7 - FF00BDDEDE00D6F7FF00008CBD0000000000008CBD008CE7FF007BDEFF0021A5 - CE00E7FFFF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7 - FF0094EFFF00E7FFFF00CEF7FF00008CBD000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD0094F7FF00008CBD00008C - BD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00008CBD00008CBD00008CBD0000000000008CBD0094F7FF0094F7FF001094 - C600008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00008CBD00008CBD00008CBD00008CBD000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD009CF7FF009CF7FF009CF7 - FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7 - FF00008CBD00000000000000000000000000008CBD009CF7FF009CF7FF009CF7 - FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7 - FF00088CBD000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD00D6F7FF00A5F7FF00A5F7 - FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7 - FF00008CBD00000000000000000000000000008CBD00E7FFFF00A5FFFF00A5FF - FF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FF - FF00088CBD000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000008CBD00D6F7FF00A5F7 - FF00A5F7FF00A5F7FF00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD000000000000000000000000000000000000000000008CBD00E7FFFF00A5FF - FF00A5FFFF00A5FFFF00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000008CBD00008C - BD00008CBD00008CBD0000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000008CBD00008C - BD00008CBD00008CBD0000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000424D3E000000000000003E000000 - 2800000040000000100000000100010000000000800000000000000000000000 - 000000000000000000000000FFFFFF0080038007000000000001000300000000 - 0001000100000000000100010000000000010001000000000001000000000000 - 0001000000000000000100000000000000070007000000000007000700000000 - 800F800F00000000C3FFC3FF00000000FFFFFFFF00000000FFFFFFFF00000000 - FFFFFFFF00000000FFFFFFFF0000000000000000000000000000000000000000 - 000000000000} - end - object IdFTP: TIdFTP - Intercept = IdLogFile - MaxLineAction = maException - ReadTimeout = 0 - RecvBufferSize = 1024 - SendBufferSize = 1024 - OnWork = IdFTPWork - ProxySettings.ProxyType = fpcmNone - ProxySettings.Port = 0 - Left = 274 - Top = 324 - end - object IdAntiFreeze: TIdAntiFreeze - IdleTimeOut = 150 - Left = 244 - Top = 324 - end - object tmrSpeed: TTimer - Enabled = False - OnTimer = tmrSpeedTimer - Left = 214 - Top = 324 - end - object IdLogFile: TIdLogFile - LogTime = False - Left = 184 - Top = 324 - end -end diff --git a/installer/UnitfrmMain.pas b/installer/UnitfrmMain.pas deleted file mode 100644 index aee1c93..0000000 --- a/installer/UnitfrmMain.pas +++ /dev/null @@ -1,730 +0,0 @@ -unit UnitfrmMain; - -interface - -uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, TFlatRadioButtonUnit, StdCtrls, ComCtrls, mxFlatControls, JvPageList, - ExtCtrls, JvExControls, JvComponent, TFlatButtonUnit, jpeg, TFlatEditUnit, - TFlatGaugeUnit, ImgList, FileCtrl, Registry, CheckLst, TFlatComboBoxUnit, - TFlatCheckBoxUnit, IdBaseComponent, IdComponent, IdTCPConnection, - IdTCPClient, IdFTP, IdException, IdAntiFreezeBase, IdAntiFreeze, - IdIntercept, IdLogBase, IdLogFile, pngimage; - -type - TfrmMain = class(TForm) - jplWizard: TJvPageList; - jspWelcome: TJvStandardPage; - pnlButtons: TPanel; - bvlSpace: TBevel; - cmdNext: TFlatButton; - cmdCancel: TFlatButton; - imgInstall: TImage; - lblWelcome: TLabel; - lblInfo1: TLabel; - lblInfo2: TLabel; - lblInfo3: TLabel; - jspLicense: TJvStandardPage; - pnlLicense: TPanel; - imgIcon1: TImage; - lblTitle1: TLabel; - lblSubTitle1: TLabel; - freLicense: TmxFlatRichEdit; - frbAgree: TFlatRadioButton; - ftbDontAgree: TFlatRadioButton; - jspInstallMethod: TJvStandardPage; - pnlHeader2: TPanel; - imgIcon2: TImage; - lblTitle2: TLabel; - lblSubTitle2: TLabel; - lblInstallMethod: TLabel; - pnlInstallMethod: TPanel; - frbDedicatedServer: TFlatRadioButton; - frbListenServer: TFlatRadioButton; - frbSelectMod: TFlatRadioButton; - frbFTP: TFlatRadioButton; - cmdBack: TFlatButton; - jspFTP: TJvStandardPage; - pnlHeader3: TPanel; - imgIcon3: TImage; - lblTitle3: TLabel; - lblSubTitle3: TLabel; - lblStep1: TLabel; - pnlFTPData: TPanel; - lblHost: TLabel; - txtHost: TFlatEdit; - lblUserName: TLabel; - txtUserName: TFlatEdit; - txtPassword: TFlatEdit; - lblPassword: TLabel; - txtPort: TFlatEdit; - lblPort: TLabel; - lblStep2: TLabel; - cmdConnect: TFlatButton; - pnlDirectory: TPanel; - trvDirectories: TTreeView; - lblStep4: TLabel; - jspInstallProgress: TJvStandardPage; - pnlHeader5: TPanel; - imgIcon4: TImage; - lblTitle5: TLabel; - lblSubTitle5: TLabel; - ggeAll: TFlatGauge; - lblProgress: TLabel; - ggeItem: TFlatGauge; - rtfDetails: TmxFlatRichEdit; - lblDetails: TLabel; - bvlSpace2: TBevel; - ilImages: TImageList; - bvlSpacer1: TBevel; - bvlSpacer2: TBevel; - bvlSpacer3: TBevel; - bvlSpacer5: TBevel; - jspSelectMod: TJvStandardPage; - pnlSelectMod: TPanel; - imgIcon5: TImage; - lblSelectMod: TLabel; - lblSelectModInfo: TLabel; - bvlSelectMod: TBevel; - lblInfo: TLabel; - chkPassive: TFlatCheckBox; - lblStep3: TLabel; - pnlOS: TPanel; - optWindows: TFlatRadioButton; - optLinux: TFlatRadioButton; - IdFTP: TIdFTP; - cmdProxySettings: TFlatButton; - IdAntiFreeze: TIdAntiFreeze; - frbStandaloneServer: TFlatRadioButton; - tmrSpeed: TTimer; - IdLogFile: TIdLogFile; - shpMods: TShape; - trvMods: TTreeView; - FlatRadioButton1: TFlatRadioButton; - procedure jvwStepsCancelButtonClick(Sender: TObject); - procedure cmdCancelClick(Sender: TObject); - procedure cmdNextClick(Sender: TObject); - procedure CheckNext(Sender: TObject); - procedure cmdBackClick(Sender: TObject); - procedure cmdConnectClick(Sender: TObject); - procedure jplWizardChange(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure cmdProxySettingsClick(Sender: TObject); - procedure txtPortChange(Sender: TObject); - procedure trvDirectoriesExpanded(Sender: TObject; Node: TTreeNode); - procedure trvDirectoriesChange(Sender: TObject; Node: TTreeNode); - procedure IdFTPWork(Sender: TObject; AWorkMode: TWorkMode; - const AWorkCount: Integer); - procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure tmrSpeedTimer(Sender: TObject); - procedure trvDirectoriesExpanding(Sender: TObject; Node: TTreeNode; - var AllowExpansion: Boolean); - procedure trvDirectoriesCollapsing(Sender: TObject; Node: TTreeNode; - var AllowCollapse: Boolean); - procedure trvModsClick(Sender: TObject); - procedure trvDirectoriesMouseDown(Sender: TObject; - Button: TMouseButton; Shift: TShiftState; X, Y: Integer); - private - OldProgress: Integer; - CurrProgress: Integer; - public - procedure ExceptionHandler(Sender: TObject; E: Exception); - end; - -var - frmMain: TfrmMain; - -var VERSION: String = ''; - -implementation - -uses UnitFunctions, UnitfrmProxy, UnitInstall, UnitSelectModPath; - -{$R *.dfm} - -procedure TfrmMain.jvwStepsCancelButtonClick(Sender: TObject); -begin - Close; -end; - -procedure TfrmMain.cmdCancelClick(Sender: TObject); -begin - Close; -end; - -procedure TfrmMain.cmdNextClick(Sender: TObject); -var ePath: String; - eRegistry: TRegistry; - eStr: TStringList; - CurNode: TTreeNode; - eOS: TOS; - i: integer; -begin - { FTP } - if jplWizard.ActivePage = jspFTP then begin - if not IdFTP.Connected then - IdFTP.Connect; - eStr := TStringList.Create; - ePath := '/'; - CurNode := trvDirectories.Selected; - if (Assigned(CurNode)) then begin - repeat - ePath := '/' + CurNode.Text + ePath; - CurNode := CurNode.Parent; - until (not Assigned(CurNode)); - end; - IdFTP.ChangeDir(ePath); - IdFTP.List(eStr, '', False); - if eStr.IndexOf('gameinfo.txt') = -1 then begin - MessageBox(Handle, 'Invalid directory. Please select your mod directory and try again.', PChar(Application.Title), MB_ICONWARNING); - eStr.Free; - exit; - end - else - eStr.Free; - - // design stuff - trvDirectories.Enabled := False; - cmdConnect.Enabled := False; - optWindows.Enabled := False; - optLinux.Enabled := False; - Screen.Cursor := crHourGlass; - - if optWindows.Checked then - eOS := osWindows - else - eOS := osLinux; - - jspInstallProgress.Show; - // installation - Screen.Cursor := crAppStart; - InstallFTP(eOS); - end - else if jplWizard.ActivePage = jspInstallProgress then - Close - else if jplWizard.ActivePage = jspSelectMod then begin - { Dedicated Server } - if (frbDedicatedServer.Checked) or (frbStandaloneServer.Checked) then begin - ePath := trvMods.Selected.Text; - if ePath = 'Counter-Strike:Source' then - ePath := 'cstrike' - else if ePath = 'Day of Defeat:Source' then - ePath := 'dod' - else - ePath := 'hl2mp'; - ePath := 'SteamApps\' + trvMods.Selected.Parent.Text + '\source dedicated server\' + ePath; - // install it - if frbDedicatedServer.Checked then begin - if DirectoryExists(SteamPath + ePath) then begin - jspInstallProgress.Show; - InstallDedicated(IncludeTrailingPathDelimiter(SteamPath + ePath), True); - end - else begin - MessageBox(Handle, 'Error: The directory of the mod you selected doesn''t exist any more. Run Dedicated Server with the chosen mod and try again.', PChar(Application.Title), MB_ICONERROR); - jspSelectMod.Show; - exit; - end; - end - else begin - if DirectoryExists(StandaloneServer + ePath) then begin - jspInstallProgress.Show; - InstallDedicated(IncludeTrailingPathDelimiter(StandaloneServer + ePath), False) - end - else begin - MessageBox(Handle, 'Error: The directory of the mod you selected doesn''t exist (any more). Run Half-Life Dedicated Server with the chosen mod again and restart.', PChar(Application.Title), MB_ICONERROR); - jspSelectMod.Show; - exit; - end; - end; - end; - { Listen Server } - if frbListenServer.Checked then begin - ePath := trvMods.Selected.Text; - if ePath = 'Counter-Strike:Source' then - ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\counter-strike source\cstrike' - else if ePath = 'Half-Life 2 Deathmatch' then - ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\half-life 2 deathmatch\hl2mp' - else - ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\day of defeat source\dod'; - - if Pos(SteamPath, ePath) = 0 then - MessageBox(Handle, 'An error occured. Please report this bug to the Metamod:Source team and post a new thread on the forums of www.amxmodx.org.', PChar(Application.Title), MB_ICONSTOP) - else begin - if not FileExists(ePath + '\gameinfo.txt') then begin - MessageBox(Handle, 'You have to play this game once before installing Metamod:Source. Do that and try again.', PChar(Application.Title), MB_ICONWARNING); - exit; - end; - - jspInstallProgress.Show; - InstallListen(IncludeTrailingPathDelimiter(ePath)); - end; - end; - { Custom mod below } - end - else if jplWizard.ActivePage <> jspInstallMethod then - jplWizard.NextPage - else begin - if frbDedicatedServer.Checked then begin // Dedicated Server - eRegistry := TRegistry.Create(KEY_READ); - try - eRegistry.RootKey := HKEY_CURRENT_USER; - if eRegistry.OpenKey('Software\Valve\Steam', False) then begin - ePath := eRegistry.ReadString('SteamPath'); - ePath := IncludeTrailingPathDelimiter(StringReplace(ePath, '/', '\', [rfReplaceAll])); - SteamPath := ePath; - - ePath := ePath + 'SteamApps\'; - if DirectoryExists(ePath) then begin - trvMods.Items.Clear; - // Check Mods - eStr := GetAllFiles(ePath + '*.*', faDirectory, False, True, False); - for i := 0 to eStr.Count -1 do begin - CurNode := trvMods.Items.Add(nil, eStr[i]); - - if DirectoryExists(ePath + eStr[i] + '\source dedicated server\cstrike') then - trvMods.Items.AddChild(CurNode, 'Counter-Strike:Source'); - if DirectoryExists(ePath + eStr[i] + '\source dedicated server\dod') then - trvMods.Items.AddChild(CurNode, 'Day of Defeat:Source'); - if DirectoryExists(ePath + eStr[i] + '\source dedicated server\hl2mp') then - trvMods.Items.AddChild(CurNode, 'Half-Life 2 Deatmatch'); - - if CurNode.Count = 0 then - CurNode.Free - else - CurNode.Expand(False); - end; - // Misc - jspSelectMod.Show; - trvMods.Selected := nil; - cmdNext.Enabled := False; - end - else - MessageBox(Handle, 'You have to run Dedicated Server once before installing Metamod:Source!', 'Error', MB_ICONWARNING); - end - else - MessageBox(Handle, 'You haven''t installed Steam yet! Download it at www.steampowered.com, install Dedicated Server and try again.', 'Error', MB_ICONWARNING); - finally - eRegistry.Free; - end; - end - else if frbListenServer.Checked then begin // Listen Server - eRegistry := TRegistry.Create(KEY_READ); - try - eRegistry.RootKey := HKEY_CURRENT_USER; - if eRegistry.OpenKey('Software\Valve\Steam', False) then begin - ePath := eRegistry.ReadString('SteamPath'); - ePath := IncludeTrailingPathDelimiter(StringReplace(ePath, '/', '\', [rfReplaceAll])); - SteamPath := ePath; - - ePath := ePath + 'SteamApps\'; - if DirectoryExists(ePath) then begin - trvMods.Items.Clear; - // Check Mods - eStr := GetAllFiles(ePath + '*.*', faDirectory, False, True, False); - for i := 0 to eStr.Count -1 do begin - CurNode := trvMods.Items.Add(nil, eStr[i]); - - if DirectoryExists(ePath + eStr[i] + '\counter-strike source') then - trvMods.Items.AddChild(CurNode, 'Counter-Strike:Source'); - if DirectoryExists(ePath + eStr[i] + '\day of defeat source') then - trvMods.Items.AddChild(CurNode, 'Day of Defeat:Source'); - if DirectoryExists(ePath + eStr[i] + '\half-life 2 deathmatch') then - trvMods.Items.AddChild(CurNode, 'Half-Life 2 Deatmatch'); - - if CurNode.Count = 0 then - CurNode.Free - else - CurNode.Expand(False); - end; - // Misc - jspSelectMod.Show; - trvMods.Selected := nil; - cmdNext.Enabled := False; - end - else - MessageBox(Handle, 'You haven''t installed Steam yet! Download it at www.steampowered.com, install Dedicated Server and try again.', 'Error', MB_ICONWARNING); - end - else - MessageBox(Handle, 'You haven''t installed Steam yet! Download it at www.steampowered.com, install Dedicated Server and try again.', 'Error', MB_ICONWARNING); - finally - eRegistry.Free; - end; - end - else if frbStandaloneServer.Checked then begin // Standalone Server - eRegistry := TRegistry.Create; - try - eRegistry.RootKey := HKEY_CURRENT_USER; - if eRegistry.OpenKey('Software\Valve\HLServer', False) then begin - StandaloneServer := IncludeTrailingPathDelimiter(eRegistry.ReadString('InstallPath')); - if DirectoryExists(StandaloneServer + 'cstrike') then - trvMods.Items.Add(nil, 'Counter-Strike:Source'); - if DirectoryExists(StandaloneServer + 'dod') then - trvMods.Items.Add(nil, 'Day of Defeat:Source'); - if DirectoryExists(StandaloneServer + 'hl2mp') then - trvMods.Items.Add(nil, 'Half-Life 2 Deatmatch'); - jspSelectMod.Show; - cmdNext.Enabled := False; - end - else - MessageBox(Handle, 'You haven''t installed Half-Life Dedicated Server yet!', 'Error', MB_ICONWARNING); - finally - eRegistry.Free; - end; - end - else if frbSelectMod.Checked then begin - { Custom mod } - if frmSelectModPath.ShowModal = mrOk then begin - jspInstallProgress.Show; - InstallCustom(IncludeTrailingPathDelimiter(frmSelectModPath.trvDirectory.SelectedFolder.PathName), osWindows); - end; - end - else if frbFTP.Checked then // FTP - jspFTP.Show; - end; -end; - -procedure TfrmMain.CheckNext(Sender: TObject); -begin - cmdNext.Enabled := frbAgree.Checked; -end; - -procedure TfrmMain.cmdBackClick(Sender: TObject); -begin - if jplWizard.ActivePage = jspFTP then - jspInstallMethod.Show - else begin - jplWizard.PrevPage; - cmdBack.Visible := jplWizard.ActivePageIndex <> 0; - end; -end; - -procedure TfrmMain.cmdConnectClick(Sender: TObject); -var i: integer; - eStr: TStringList; - CurNode: TTreeNode; - Path: String; -begin - if (Trim(txtHost.Text) = '') or (Trim(txtUsername.Text) = '') then - MessageBox(Handle, 'Please fill in each field!', PChar(Application.Title), MB_ICONWARNING) - else if cmdConnect.Caption = 'Connect' then begin - // ... design stuff ... - Screen.Cursor := crHourGlass; - cmdConnect.Enabled := False; - cmdProxySettings.Enabled := False; - txtHost.Enabled := False; - txtPort.Enabled := False; - txtUsername.Enabled := False; - txtPassword.Enabled := False; - chkPassive.Enabled := False; - cmdConnect.Caption := 'Connecting...'; - // ... set values ... - IdFTP.Host := txtHost.Text; - IdFTP.Port := StrToInt(txtPort.Text); - IdFTP.Username := txtUsername.Text; - IdFTP.Passive := chkPassive.Checked; - IdFTP.Password := txtPassword.Text; - // ... connect and check values etc ... - try - IdFTP.Connect(True, 15000); - // ... get initial directory ... - Path := IdFTP.RetrieveCurrentDir; - // ... "fix" path ... - eStr := TStringList.Create; - eStr.Text := StringReplace(Path, '/', #13, [rfReplaceAll]); - for i := eStr.Count -1 downto 0 do begin - if eStr[i] = '' then - eStr.Delete(i); - end; - if (Copy(Path, Length(Path) -1, 1) <> '/') then - Path := Path + '/'; - // ... connect successful, change captions ... - trvDirectories.Enabled := True; - cmdConnect.Enabled := True; - cmdConnect.Caption := 'Disconnect'; - // ... change to / and create all the directories ... - CurNode := nil; - if (Path <> '/') then begin - try - IdFTP.ChangeDir('/'); - with GetAllDirs do begin - for i := 0 to Count -1 do begin - if (Assigned(CurNode)) then - trvDirectories.Items.AddChild(trvDirectories.Items.Add(nil, Strings[i]), 'Scanning...') - else begin - CurNode := trvDirectories.Items.Add(nil, Strings[i]); - trvDirectories.Items.AddChild(CurNode, 'Scanning...'); - if (Pos('/' + CurNode.Text + '/', Path) = 0) then - CurNode := nil; - end - end; - Free; - end; - IdFTP.ChangeDir(Path); - except - if (IdFTP.Connected) then - IdFTP.ChangeDir(Path) - else - IdFTP.Connect; - end; - end; - // ... find directories in start path ... - if eStr.Count <> 0 then begin - for i := 0 to eStr.Count -1 do begin - if (not ((i = 0) and (Assigned(CurNode)))) then - CurNode := trvDirectories.Items.AddChild(CurNode, eStr[i]); - end; - end; - trvDirectories.Selected := CurNode; - eStr.Free; - // ... scan for directories ... - with GetAllDirs do begin - for i := 0 to Count -1 do - trvDirectories.Items.AddChild(trvDirectories.Items.AddChild(CurNode, Strings[i]), 'Scanning...'); - Free; - end; - - if Assigned(CurNode) then - CurNode.Expand(False); - except - on E: Exception do begin - // reset button properties - cmdConnect.Enabled := True; - txtHost.Enabled := True; - txtPort.Enabled := True; - txtUsername.Enabled := True; - txtPassword.Enabled := True; - chkPassive.Enabled := True; - cmdProxySettings.Enabled := True; - cmdNext.Enabled := False; - cmdConnect.Caption := 'Connect'; - // analyze messages - if Pos('Login incorrect.', E.Message) <> 0 then begin // login failed - MessageBox(Handle, 'Login incorrect. Check your FTP settings and try again.', PChar(Application.Title), MB_ICONWARNING); - txtUsername.SetFocus; - txtUsername.SelectAll; - end - else if Pos('Host not found.', E.Message) <> 0 then begin // host not found - MessageBox(Handle, 'The entered host couldn''t be found. Check your settings and try again.', PChar(Application.Title), MB_ICONWARNING); - txtHost.SetFocus; - txtHost.SelectAll; - end - else if Pos('Connection refused.', E.Message) <> 0 then begin // wrong port (?) - MessageBox(Handle, 'The host refused the connection. Check your port and try again.', PChar(Application.Title), MB_ICONWARNING); - txtPort.SetFocus; - txtPort.SelectAll; - end - else if E is EIdProtocolReplyError then begin // wrong port - MessageBox(Handle, 'The port you entered is definitely wrong. Check it and try again.', PChar(Application.Title), MB_ICONWARNING); - txtPort.SetFocus; - txtPort.SelectAll; - end - else - MessageBox(Handle, PChar(E.Message), PChar(Application.Title), MB_ICONWARNING); // unknown error - // ... connect failed, leave procedure ... - Screen.Cursor := crDefault; - exit; - end; - end; - - Screen.Cursor := crDefault; - end - else begin - Screen.Cursor := crHourGlass; - IdFTP.Quit; - trvDirectories.Items.Clear; - trvDirectories.Enabled := False; - cmdConnect.Enabled := True; - cmdProxySettings.Enabled := True; - txtHost.Enabled := True; - txtPort.Enabled := True; - txtUsername.Enabled := True; - txtPassword.Enabled := True; - chkPassive.Enabled := True; - cmdConnect.Caption := 'Connect'; - cmdNext.Enabled := False; - Screen.Cursor := crDefault; - end; -end; - -procedure TfrmMain.jplWizardChange(Sender: TObject); -begin - if (jplWizard.ActivePage = jspInstallProgress) then begin - cmdNext.Caption := '&Finish'; - cmdNext.Enabled := False; - cmdBack.Visible := False; - end - else begin - cmdNext.Caption := '&Next >'; - cmdNext.Enabled := True; - cmdBack.Visible := jplWizard.ActivePageIndex <> 0; - end; - - if (jplWizard.ActivePage = jspLicense) then - cmdNext.Enabled := frbAgree.Checked; - - if (jplWizard.ActivePage = jspFTP) then - cmdNext.Enabled := False; -end; - -procedure TfrmMain.FormCreate(Sender: TObject); -begin - if LowerCase(ParamStr(1)) = '-logftp' then begin - MessageBox(Handle, 'FTP installation will be logged to FTP.log!', PChar(Application.Title), MB_ICONINFORMATION); - IdLogFile.Filename := ExtractFilePath(ParamStr(0)) + 'FTP.log'; - IdLogFile.Active := True; - end; - - rtfDetails.Clear; -end; - -procedure TfrmMain.cmdProxySettingsClick(Sender: TObject); -begin - frmProxy.ShowModal; - // Apply Proxy Settings - case frmProxy.cboProxy.ItemIndex of - 0: IdFTP.ProxySettings.ProxyType := fpcmNone; // none - 1: IdFTP.ProxySettings.ProxyType := fpcmHttpProxyWithFtp; // HTTP Proxy with FTP - 2: IdFTP.ProxySettings.ProxyType := fpcmOpen; // Open - 3: IdFTP.ProxySettings.ProxyType := fpcmSite; // Site - 4: IdFTP.ProxySettings.ProxyType := fpcmTransparent; // Transparent - 5: IdFTP.ProxySettings.ProxyType := fpcmUserPass; // User (Password) - 6: IdFTP.ProxySettings.ProxyType := fpcmUserSite; // User (Site) - end; - - IdFTP.ProxySettings.Host := frmProxy.txtHost.Text; - IdFTP.ProxySettings.UserName := frmProxy.txtPort.Text; - IdFTP.ProxySettings.Password := frmProxy.txtPassword.Text; - IdFTP.ProxySettings.Port := StrToInt(frmProxy.txtPort.Text); -end; - -procedure TfrmMain.txtPortChange(Sender: TObject); -var i: integer; -begin - if txtPort.Text = '' then - txtPort.Text := '21' - else begin - // check if value is numeric... - for i := Length(txtPort.Text) downto 1 do begin - if Pos(txtPort.Text[i], '0123456789') = 0 then begin - txtPort.Text := '21'; - txtPort.SelStart := 4; - exit; - end; - end; - end; -end; - -procedure TfrmMain.trvDirectoriesExpanded(Sender: TObject; - Node: TTreeNode); -var ePath: String; - CurNode: TTreeNode; - i: integer; -begin - if Node.Item[0].Text = 'Scanning...' then begin // no directories added yet - Screen.Cursor := crHourGlass; - // get complete path - ePath := '/'; - CurNode := Node; - repeat - ePath := '/' + CurNode.Text + ePath; - CurNode := CurNode.Parent; - until (not Assigned(CurNode)); - // change dir and add directories in it - try - Repaint; - IdFTP.ChangeDir(ePath); - with GetAllDirs do begin - Node.Item[0].Free; - for i := 0 to Count -1 do begin - trvDirectories.Items.AddChild(trvDirectories.Items.AddChild(Node, Strings[i]), 'Scanning...'); - end; - Free; - end; - finally - Application.ProcessMessages; - end; - Screen.Cursor := crDefault; - end; -end; - -procedure TfrmMain.trvDirectoriesChange(Sender: TObject; Node: TTreeNode); -begin - cmdNext.Enabled := Assigned(trvDirectories.Selected); -end; - -procedure TfrmMain.IdFTPWork(Sender: TObject; AWorkMode: TWorkMode; - const AWorkCount: Integer); -begin - if AWorkCount > 15 then begin - ggeItem.Progress := AWorkCount; - CurrProgress := AWorkCount; - end; - - if Cancel then - IdFTP.Abort; - - Application.ProcessMessages; -end; - -procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction); -begin - if (jplWizard.ActivePage = jspFTP) and (IdFTP.Connected) then - IdFTP.Quit; - if (jplWizard.ActivePage = jspInstallProgress) and (ggeAll.Progress <> ggeAll.MaxValue) and (not Cancel) then begin - if MessageBox(Handle, 'Do you really want to cancel the installation?', PChar(Application.Title), MB_ICONQUESTION + MB_YESNO) = mrYes then begin - Screen.Cursor := crDefault; - Application.OnException := ExceptionHandler; - Cancel := True; - if IdFTP.Connected then - IdFTP.Quit; - end - else - Action := caNone; - end; -end; - -procedure TfrmMain.ExceptionHandler(Sender: TObject; E: Exception); -begin - // IF any exceptions were raised after close, nobody would want them so leave this empty -end; - -procedure TfrmMain.tmrSpeedTimer(Sender: TObject); -begin - Caption := CalcSpeed(OldProgress, CurrProgress); - OldProgress := CurrProgress; -end; - -procedure TfrmMain.trvDirectoriesExpanding(Sender: TObject; - Node: TTreeNode; var AllowExpansion: Boolean); -begin - Node.ImageIndex := 1; - Node.SelectedIndex := 1; -end; - -procedure TfrmMain.trvDirectoriesCollapsing(Sender: TObject; - Node: TTreeNode; var AllowCollapse: Boolean); -begin - Node.ImageIndex := 0; - Node.SelectedIndex := 0; -end; - -procedure TfrmMain.trvModsClick(Sender: TObject); -begin - if Assigned(trvMods.Selected) then - cmdNext.Enabled := Assigned(trvMods.Selected.Parent) - else - cmdNext.Enabled := False; -end; - -procedure TfrmMain.trvDirectoriesMouseDown(Sender: TObject; - Button: TMouseButton; Shift: TShiftState; X, Y: Integer); -var Node: TTreeNode; -begin - Node := trvDirectories.GetNodeAt(X, Y); - if (Assigned(Node)) then begin - if (Node.DisplayRect(True).Right < X) then - trvDirectories.Selected := nil; - end; -end; - -end. diff --git a/installer/UnitfrmProxy.dfm b/installer/UnitfrmProxy.dfm deleted file mode 100644 index 7ba9c06c5cae79c3827a3d1d98e81d212d147e8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1584 zcmb7EO>fgc5Z&00KjI`*DjSGp8wQ9=#K`$X!!aK*xPz!0uToNo)ez2 zS-|M>!Y+RpeRRh4&lNqSbN#F4wkeAd8}kc{EPIl5Qi$o)^5C4Ol$cG~{B(>sPsuc^ zdpJde_fR@bxc&vWDn3nPp6EY7)uWg)%ZYHC6CXyX?o+~dy#%rhaqCW}>mQ!8@$ zSt`g|TXQ;qDe)!JzfDT73QEtfLpf#rKi~qGWs6)k3T`f$m2l5)fGg`a;oQ*2khjk{ zr^JqCv4?3^@Ovqx`5qJmPfEo5btx~OM&}udjc-4H14sVTp$j5ISB6T_mMc{_PGByo zrcCs5)%JyQFXdE|s=Jg}y>L~Ma|bkrc!aWZ%(aRg!im(IRt3P3%XH(ETRa!kmB)Xf z7STU|a+7VvTU@}ha^WW_M=J%akt+Z+B(g_m6WXRrJDSi9X=?KFcMJIMEBJd=W#?v; zbr_wC^Yqh<7w)u6r`3))nw4^Hh#=b?b0&OVF^ywNkh$Fp!=NQcwiYQ*T7DRq#&C{^ zX^eByrW-OyvN>eAzf4!?ruA4n_f8pzsvWT22^hk23f>Vjk4TJ`8nA~X|4fi6vYO?R zD!zK%wI@C*PZa0X4sUf`X8@OdM5a8^s%utS!D@eRe{apCkw2ywcb$lvXG)W7n(D03 lY;-Fw>-qZTmIA!Ai~=X}q5luOUP6ekuUUDr9%cXl{sJ)8?-l?6 diff --git a/installer/UnitfrmProxy.pas b/installer/UnitfrmProxy.pas deleted file mode 100644 index 1556226..0000000 --- a/installer/UnitfrmProxy.pas +++ /dev/null @@ -1,72 +0,0 @@ -unit UnitfrmProxy; - -interface - -uses - SysUtils, Windows, Messages, Classes, Graphics, Controls, - StdCtrls, ExtCtrls, Forms, TFlatButtonUnit, TFlatComboBoxUnit, - TFlatEditUnit; - -type - TfrmProxy = class(TForm) - cmdClose: TFlatButton; - lblProxy: TLabel; - txtHost: TFlatEdit; - cboProxy: TFlatComboBox; - lblHost: TLabel; - txtPort: TFlatEdit; - lblPort: TLabel; - lblUsername: TLabel; - txtUsername: TFlatEdit; - txtPassword: TFlatEdit; - lblPassword: TLabel; - procedure cboProxyChange(Sender: TObject); - procedure txtPortChange(Sender: TObject); - public - procedure EnableControls(Enable: Boolean); - end; - -var - frmProxy: TfrmProxy; - -implementation - -{$R *.DFM} - -{ TfrmProxy } - -procedure TfrmProxy.EnableControls(Enable: Boolean); -begin - lblHost.Enabled := Enable; - lblPassword.Enabled := Enable; - lblPort.Enabled := Enable; - lblUsername.Enabled := Enable; - txtHost.Enabled := Enable; - txtPassword.Enabled := Enable; - txtPort.Enabled := Enable; - txtUsername.Enabled := Enable; -end; - -procedure TfrmProxy.cboProxyChange(Sender: TObject); -begin - EnableControls(cboProxy.ItemIndex <> 0); // 0 = None -end; - -procedure TfrmProxy.txtPortChange(Sender: TObject); -var i: integer; -begin - if txtPort.Text = '' then - txtPort.Text := '8080' - else begin - // check if value is numeric... - for i := Length(txtPort.Text) downto 1 do begin - if Pos(txtPort.Text[i], '0123456789') = 0 then begin - txtPort.Text := '8080'; - txtPort.SelStart := 4; - exit; - end; - end; - end; -end; - -end. diff --git a/installer/del.bat b/installer/del.bat deleted file mode 100644 index 74a143b..0000000 --- a/installer/del.bat +++ /dev/null @@ -1,15 +0,0 @@ -del .\*.~pas -del .\*.dcu -del .\*.~ddp -del .\*.ddp -del .\*.~dpr -del .\*.~dfm -del .\*.~dpr -del .\*.map -del .\*.drc -del .\*.~xfm -del .\*.log -del .\*.dof -upx MMS_Installer.exe -upx Attach.exe -upx hl2launch.exe \ No newline at end of file diff --git a/installer/files/Readme.txt b/installer/files/Readme.txt deleted file mode 100644 index 9c39d58..0000000 --- a/installer/files/Readme.txt +++ /dev/null @@ -1,7 +0,0 @@ -In this folder should be server.dll and server_i486.so. - -How you prepare a release: -1) Copy the latest MM:S dlls and hl2launch.exe into this folder -2) Run Attach.exe -3) Test MMS_Installer.exe once (should work but nobody wants bug releases, especially not in the installer) -4) If everything worked fine, release it, otherwise pm me (Basic-Master) \ No newline at end of file diff --git a/installer/install.bmp b/installer/install.bmp deleted file mode 100644 index 39b905be4507286639395912964881258552398f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154542 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 diff --git a/installer/upx.exe b/installer/upx.exe deleted file mode 100644 index d47856823e48792f97d19f20ed08d40bc7cb0d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126464 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 z 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,<=,>= comparison operators to allow storage in ordered containers. -// * Substantial reduction of code size, especially the 'Closure' class. -// * Standardised all the compiler-specific workarounds. -// * MFP conversion now works for CodePlay (but not yet supported in the full code). -// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 -// * New syntax: FastDelegate< int (char *, double) >. -// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). -// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. -// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" -// * Fully supported by CodePlay VectorC -// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! -// * More optimal assignment,== and != operators for static function pointers. - -#ifndef FASTDELEGATE_H -#define FASTDELEGATE_H - -#ifdef _MSC_VER -# if _MSC_VER > 1000 -# pragma once -# endif // _MSC_VER > 1000 -#endif // #ifdef _MSC_VER - -#include // to allow <,> comparisons - -//////////////////////////////////////////////////////////////////////////////// -// Configuration options -// -//////////////////////////////////////////////////////////////////////////////// - -// Uncomment the following #define for optimally-sized delegates. -// In this case, the generated asm code is almost identical to the code you'd get -// if the compiler had native support for delegates. -// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). -// Thus, it will not work for DOS compilers using the medium model. -// It will also probably fail on some DSP systems. -#define FASTDELEGATE_USESTATICFUNCTIONHACK - -// Uncomment the next line to allow function declarator syntax. -// It is automatically enabled for those compilers where it is known to work. -//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Compiler identification for workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Compiler identification. It's not easy to identify Visual C++ because -// many vendors fraudulently define Microsoft's identifiers. -#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) -#define FASTDLGT_ISMSVC - -#if (_MSC_VER <1300) // Many workarounds are required for VC6. -#define FASTDLGT_VC6 -#pragma warning(disable:4786) // disable this ridiculous warning -#endif - -#endif - -// Does the compiler uses Microsoft's member function pointer structure? -// If so, it needs special treatment. -// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's -// identifier, _MSC_VER. We need to filter Metrowerks out. -#if defined(_MSC_VER) && !defined(__MWERKS__) -#define FASTDLGT_MICROSOFT_MFP - -#if !defined(__VECTOR_C) -// CodePlay doesn't have the __single/multi/virtual_inheritance keywords -#define FASTDLGT_HASINHERITANCE_KEYWORDS -#endif -#endif - -// Does it allow function declarator syntax? The following compilers are known to work: -#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. -#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. -#if defined (__MWERKS__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -#ifdef __GNUC__ // Workaround GCC bug #8271 - // At present, GCC doesn't recognize constness of MFPs in templates -#define FASTDELEGATE_GCC_BUG_8271 -#endif - - - -//////////////////////////////////////////////////////////////////////////////// -// General tricks used in this code -// -// (a) Error messages are generated by typdefing an array of negative size to -// generate compile-time errors. -// (b) Warning messages on MSVC are generated by declaring unused variables, and -// enabling the "variable XXX is never used" warning. -// (c) Unions are used in a few compiler-specific cases to perform illegal casts. -// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to -// (char *) first to ensure that the correct number of *bytes* are added. -// -//////////////////////////////////////////////////////////////////////////////// -// Helper templates -// -//////////////////////////////////////////////////////////////////////////////// - - -namespace fastdelegate { -namespace detail { // we'll hide the implementation details in a nested namespace. - -// implicit_cast< > -// I believe this was originally going to be in the C++ standard but -// was left out by accident. It's even milder than static_cast. -// I use it instead of static_cast<> to emphasize that I'm not doing -// anything nasty. -// Usage is identical to static_cast<> -template -inline OutputClass implicit_cast(InputClass input){ - return input; -} - -// horrible_cast< > -// This is truly evil. It completely subverts C++'s type system, allowing you -// to cast from any class to any other class. Technically, using a union -// to perform the cast is undefined behaviour (even in C). But we can see if -// it is OK by checking that the union is the same size as each of its members. -// horrible_cast<> should only be used for compiler-specific workarounds. -// Usage is identical to reinterpret_cast<>. - -// This union is declared outside the horrible_cast because BCC 5.5.1 -// can't inline a function with a nested class, and gives a warning. -template -union horrible_union{ - OutputClass out; - InputClass in; -}; - -template -inline OutputClass horrible_cast(const InputClass input){ - horrible_union u; - // Cause a compile-time error if in, out and u are not the same size. - // If the compile fails here, it means the compiler has peculiar - // unions which would prevent the cast from working. - typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) - && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; - u.in = input; - return u.out; -} - -//////////////////////////////////////////////////////////////////////////////// -// Workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Backwards compatibility: This macro used to be necessary in the virtual inheritance -// case for Intel and Microsoft. Now it just forward-declares the class. -#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; - -// Prevent use of the static function hack with the DOS medium model. -#ifdef __MEDIUM__ -#undef FASTDELEGATE_USESTATICFUNCTIONHACK -#endif - -// DefaultVoid - a workaround for 'void' templates in VC6. -// -// (1) VC6 and earlier do not allow 'void' as a default template argument. -// (2) They also doesn't allow you to return 'void' from a function. -// -// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use -// when we'd like to use 'void'. We convert it into 'void' and back -// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. -// Workaround for (2): On VC6, the code for calling a void function is -// identical to the code for calling a non-void function in which the -// return value is never used, provided the return value is returned -// in the EAX register, rather than on the stack. -// This is true for most fundamental types such as int, enum, void *. -// Const void * is the safest option since it doesn't participate -// in any automatic conversions. But on a 16-bit compiler it might -// cause extra code to be generated, so we disable it for all compilers -// except for VC6 (and VC5). -#ifdef FASTDLGT_VC6 -// VC6 workaround -typedef const void * DefaultVoid; -#else -// On any other compiler, just use a normal void. -typedef void DefaultVoid; -#endif - -// Translate from 'DefaultVoid' to 'void'. -// Everything else is unchanged -template -struct DefaultVoidToVoid { typedef T type; }; - -template <> -struct DefaultVoidToVoid { typedef void type; }; - -// Translate from 'void' into 'DefaultVoid' -// Everything else is unchanged -template -struct VoidToDefaultVoid { typedef T type; }; - -template <> -struct VoidToDefaultVoid { typedef DefaultVoid type; }; - - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1: -// -// Conversion of member function pointer to a standard form -// -//////////////////////////////////////////////////////////////////////////////// - -// GenericClass is a fake class, ONLY used to provide a type. -// It is vitally important that it is never defined, so that the compiler doesn't -// think it can optimize the invocation. For example, Borland generates simpler -// code if it knows the class only uses single inheritance. - -// Compilers using Microsoft's structure need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS - // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP - // (4 bytes), even when the /vmg option is used. Declaring an empty class - // would give 16 byte pointers in this case.... - class __single_inheritance GenericClass; -#endif - // ...but for Codeplay, an empty class *always* gives 4 byte pointers. - // If compiled with the /clr option ("managed C++"), the JIT compiler thinks - // it needs to load GenericClass before it can call any of its functions, - // (compiles OK but crashes at runtime!), so we need to declare an - // empty class to make it happy. - // Codeplay and VC4 can't cope with the unknown_inheritance case either. - class GenericClass {}; -#else - class GenericClass; -#endif - -// The size of a single inheritance member function pointer. -const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); - -// SimplifyMemFunc< >::Convert() -// -// A template function that converts an arbitrary member function pointer into the -// simplest possible form of member function pointer, using a supplied 'this' pointer. -// According to the standard, this can be done legally with reinterpret_cast<>. -// For (non-standard) compilers which use member function pointers which vary in size -// depending on the class, we need to use knowledge of the internal structure of a -// member function pointer, as used by the compiler. Template specialization is used -// to distinguish between the sizes. Because some compilers don't support partial -// template specialisation, I use full specialisation of a wrapper struct. - -// general case -- don't know how to convert it. Force a compile failure -template -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // Unsupported member function type -- force a compile failure. - // (it's illegal to have a array with negative size). - typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; - return 0; - } -}; - -// For compilers where all member func ptrs are the same size, everything goes here. -// For non-standard compilers, only single_inheritance classes go here. -template <> -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { -#if defined __DMC__ - // Digital Mars doesn't allow you to cast between abitrary PMF's, - // even though the standard says you can. The 32-bit compiler lets you - // static_cast through an int, but the DOS compiler doesn't. - bound_func = horrible_cast(function_to_bind); -#else - bound_func = reinterpret_cast(function_to_bind); -#endif - return reinterpret_cast(pthis); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1b: -// -// Workarounds for Microsoft and Intel -// -//////////////////////////////////////////////////////////////////////////////// - - -// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), -// need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) -// at the start of each function for extra safety, but VC6 seems to ICE -// intermittently if you do this inside a template. - -// __multiple_inheritance classes go here -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -template<> -struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // We need to use a horrible_cast to do this conversion. - // In MSVC, a multiple inheritance member pointer is internally defined as: - union { - XFuncType func; - struct { - GenericMemFuncType funcaddress; // points to the actual member function - int delta; // #BYTES to be added to the 'this' pointer - }s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); - } -}; - -// virtual inheritance is a real nuisance. It's inefficient and complicated. -// On MSVC and Intel, there isn't enough information in the pointer itself to -// enable conversion to a closure pointer. Earlier versions of this code didn't -// work for all cases, and generated a compile-time error instead. -// But a very clever hack invented by John M. Dlugosz solves this problem. -// My code is somewhat different to his: I have no asm code, and I make no -// assumptions about the calling convention that is used. - -// In VC++ and ICL, a virtual_inheritance member pointer -// is internally defined as: -struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance -}; -// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the -// m_codeptr member is *always* called, regardless of the values of the other -// members. (This is *not* true for other compilers, eg GCC, which obtain the -// function address from the vtable if a virtual function is being called). -// Dlugosz's trick is to make the codeptr point to a probe function which -// returns the 'this' pointer that was used. - -// Define a generic class that uses virtual inheritance. -// It has a trival member function that returns the value of the 'this' pointer. -struct GenericVirtualClass : virtual public GenericClass -{ - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } -}; - -// __virtual_inheritance classes go here -template <> -struct SimplifyMemFunc -{ - - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - union { - XFuncType func; - GenericClass* (X::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = function_to_bind; - bound_func = reinterpret_cast(u.s.codeptr); - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) - && sizeof(function_to_bind)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - return (pthis->*u.ProbeFunc)(); - } -}; - -#if (_MSC_VER <1300) - -// Nasty hack for Microsoft Visual C++ 6.0 -// unknown_inheritance classes go here -// There is a compiler bug in MSVC6 which generates incorrect code in this case!! -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // There is an apalling but obscure compiler bug in MSVC6 and earlier: - // vtable_index and 'vtordisp' are always set to 0 in the - // unknown_inheritance case! - // This means that an incorrect function could be called!!! - // Compiling with the /vmg option leads to potentially incorrect code. - // This is probably the reason that the IDE has a user interface for specifying - // the /vmg option, but it is disabled - you can only specify /vmg on - // the command line. In VC1.5 and earlier, the compiler would ICE if it ever - // encountered this situation. - // It is OK to use the /vmg option if /vmm or /vms is specified. - - // Fortunately, the wrong function is only called in very obscure cases. - // It only occurs when a derived class overrides a virtual function declared - // in a virtual base class, and the member function - // points to the *Derived* version of that function. The problem can be - // completely averted in 100% of cases by using the *Base class* for the - // member fpointer. Ie, if you use the base class as an interface, you'll - // stay out of trouble. - // Occasionally, you might want to point directly to a derived class function - // that isn't an override of a base class. In this case, both vtable_index - // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. - // We can generate correct code in this case. To prevent an incorrect call from - // ever being made, on MSVC6 we generate a warning, and call a function to - // make the program crash instantly. - typedef char ERROR_VC6CompilerBug[-100]; - return 0; - } -}; - - -#else - -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -// unknown_inheritance classes go here -// This is probably the ugliest bit of code I've ever written. Look at the casts! -// There is a compiler bug in MSVC6 which prevents it from using this code. -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - XFuncType func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - GenericMemFuncType m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - const int * vtable = *reinterpret_cast( - reinterpret_cast(pthis) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - } - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - return reinterpret_cast( - reinterpret_cast(pthis) + u.s.delta + virtual_delta); - }; -}; -#endif // MSVC 7 and greater - -#endif // MS/Intel hacks - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 2: -// -// Define the delegate storage, and cope with static functions -// -//////////////////////////////////////////////////////////////////////////////// - -// DelegateMemento -- an opaque structure which can hold an arbitary delegate. -// It knows nothing about the calling convention or number of arguments used by -// the function pointed to. -// It supplies comparison operators so that it can be stored in STL collections. -// It cannot be set to anything other than null, nor invoked directly: -// it must be converted to a specific delegate. - -// Implementation: -// There are two possible implementations: the Safe method and the Evil method. -// DelegateMemento - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// A static function pointer is stored inside the class. -// Here are the valid values: -// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ -// | 0 | 0 | 0 | Empty | -// | !=0 |(dontcare)| Invoker | Static function| -// | 0 | !=0 | !=0* | Method call | -// +--------------------+----------+------------+----------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// When stored stored inside a specific delegate, the 'dontcare' entries are replaced -// with a reference to the delegate itself. This complicates the = and == operators -// for the delegate class. - -// DelegateMemento - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. In this case the DelegateMemento implementation is simple: -// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ -// | 0 | 0 | Empty | -// | !=0 | !=0* | Static function or method call| -// +----------+------------+-------------------------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - -class DelegateMemento { -protected: - // the data is protected, not private, because many - // compilers have problems with template friends. - typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. - detail::GenericClass *m_pthis; - GenericMemFuncType m_pFunction; - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - typedef void (*GenericFuncPtr)(); // arbitrary code pointer - GenericFuncPtr m_pStaticFunction; -#endif - -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; - void clear() { - m_pthis=0; m_pFunction=0; m_pStaticFunction=0; - } -#else - DelegateMemento() : m_pthis(0), m_pFunction(0) {}; - void clear() { m_pthis=0; m_pFunction=0; } -#endif -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - inline bool IsEqual (const DelegateMemento &x) const{ - // We have to cope with the static function pointers as a special case - if (m_pFunction!=x.m_pFunction) return false; - // the static function ptrs must either both be equal, or both be 0. - if (m_pStaticFunction!=x.m_pStaticFunction) return false; - if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; - else return true; - } -#else // Evil Method - inline bool IsEqual (const DelegateMemento &x) const{ - return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; - } -#endif - // Provide a strict weak ordering for DelegateMementos. - inline bool IsLess(const DelegateMemento &right) const { - // deal with static function pointers first -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) - return m_pStaticFunction < right.m_pStaticFunction; -#endif - if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; - // There are no ordering operators for member function pointers, - // but we can fake one by comparing each byte. The resulting ordering is - // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. - return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; - - } - // BUGFIX (Mar 2005): - // We can't just compare m_pFunction because on Metrowerks, - // m_pFunction can be zero even if the delegate is not empty! - inline bool operator ! () const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } - inline bool empty() const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } -public: - DelegateMemento & operator = (const DelegateMemento &right) { - SetMementoFrom(right); - return *this; - } - inline bool operator <(const DelegateMemento &right) { - return IsLess(right); - } - inline bool operator >(const DelegateMemento &right) { - return right.IsLess(*this); - } - DelegateMemento (const DelegateMemento &right) : - m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - , m_pStaticFunction (right.m_pStaticFunction) -#endif - {} -protected: - void SetMementoFrom(const DelegateMemento &right) { - m_pFunction = right.m_pFunction; - m_pthis = right.m_pthis; -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = right.m_pStaticFunction; -#endif - } -}; - - -// ClosurePtr<> -// -// A private wrapper class that adds function signatures to DelegateMemento. -// It's the class that does most of the actual work. -// The signatures are specified by: -// GenericMemFunc: must be a type of GenericClass member function pointer. -// StaticFuncPtr: must be a type of function pointer with the same signature -// as GenericMemFunc. -// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 -// where it never returns void (returns DefaultVoid instead). - -// An outer class, FastDelegateN<>, handles the invoking and creates the -// necessary typedefs. -// This class does everything else. - -namespace detail { - -template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> -class ClosurePtr : public DelegateMemento { -public: - // These functions are for setting the delegate to a member function. - - // Here's the clever bit: we convert an arbitrary member function into a - // standard form. XMemFunc should be a member function of class X, but I can't - // enforce that here. It needs to be enforced by the wrapper class. - template < class X, class XMemFunc > - inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { - m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(pthis, function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } - // For const member functions, we only need a const class pointer. - // Since we know that the member function is const, it's safe to - // remove the const qualifier from the 'this' pointer with a const_cast. - // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. - template < class X, class XMemFunc> - inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { - m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(const_cast(pthis), function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates - template < class X, class XMemFunc> - inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { - bindconstmemfunc(pthis, function_to_bind); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#endif - // These functions are required for invoking the stored function - inline GenericClass *GetClosureThis() const { return m_pthis; } - inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } - -// There are a few ways of dealing with static function pointers. -// There's a standard-compliant, but tricky method. -// There's also a straightforward hack, that won't work on DOS compilers using the -// medium memory model. It's so evil that I can't recommend it, but I've -// implemented it anyway because it produces very nice asm code. - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - -// ClosurePtr<> - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// I store the function pointer inside the class, and the delegate then -// points to itself. Whenever the delegate is copied, these self-references -// must be transformed, and this complicates the = and == operators. -public: - // The next two functions are for operator ==, =, and the copy constructor. - // We may need to convert the m_pthis pointers, so that - // they remain as self-references. - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { - SetMementoFrom(x); - if (m_pStaticFunction!=0) { - // transform self references... - m_pthis=reinterpret_cast(pParent); - } - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - template < class DerivedClass, class ParentInvokerSig > - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind ) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - bindmemfunc(pParent, static_function_invoker); - } - m_pStaticFunction=reinterpret_cast(function_to_bind); - } - inline UnvoidStaticFuncPtr GetStaticFunction() const { - return reinterpret_cast(m_pStaticFunction); - } -#else - -// ClosurePtr<> - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and -// speeds up comparison and assignment. If C++ provided direct language support -// for delegates, they would produce asm code that was almost identical to this. -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { - SetMementoFrom(right); - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - // ******** EVIL, EVIL CODE! ******* - template < class DerivedClass, class ParentInvokerSig> - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - // We'll be ignoring the 'this' pointer, but we need to make sure we pass - // a valid value to bindmemfunc(). - bindmemfunc(pParent, static_function_invoker); - } - - // WARNING! Evil hack. We store the function in the 'this' pointer! - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; - m_pthis = horrible_cast(function_to_bind); - // MSVC, SunC++ and DMC accept the following (non-standard) code: -// m_pthis = static_cast(static_cast(function_to_bind)); - // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long -// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); - } - // ******** EVIL, EVIL CODE! ******* - // This function will be called with an invalid 'this' pointer!! - // We're just returning the 'this' pointer, converted into - // a function pointer! - inline UnvoidStaticFuncPtr GetStaticFunction() const { - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; - return horrible_cast(this); - } -#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - - // Does the closure contain this static function? - inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ - if (funcptr==0) return empty(); - // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary - // value that is not equal to any valid function pointer. - else return funcptr==reinterpret_cast(GetStaticFunction()); - } -}; - - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 3: -// -// Wrapper classes to ensure type safety -// -//////////////////////////////////////////////////////////////////////////////// - - -// Once we have the member function conversion templates, it's easy to make the -// wrapper classes. So that they will work with as many compilers as possible, -// the classes are of the form -// FastDelegate3 -// They can cope with any combination of parameters. The max number of parameters -// allowed is 8, but it is trivial to increase this limit. -// Note that we need to treat const member functions seperately. -// All this class does is to enforce type safety, and invoke the delegate with -// the correct list of parameters. - -// Because of the weird rule about the class of derived member function pointers, -// you sometimes need to apply a downcast to the 'this' pointer. -// This is the reason for the use of "implicit_cast(pthis)" in the code below. -// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, -// without this trick you'd need to write: -// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); -// but with the trick you can write -// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); - -// RetType is the type the compiler uses in compiling the template. For VC6, -// it cannot be void. DesiredRetType is the real type which is returned from -// all of the functions. It can be void. - -// Implicit conversion to "bool" is achieved using the safe_bool idiom, -// using member data pointers (MDP). This allows "if (dg)..." syntax -// Because some compilers (eg codeplay) don't have a unique value for a zero -// MDP, an extra padding member is added to the SafeBool struct. -// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so -// in that case the static function constructor is not made explicit; this -// allows "if (dg==0) ..." to compile. - -//N=0 -template -class FastDelegate0 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(); - typedef RetType (*UnvoidStaticFunctionPtr)(); - typedef RetType (detail::GenericClass::*GenericMemFn)(); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate0 type; - - // Construction and comparison functions - FastDelegate0() { clear(); } - FastDelegate0(const FastDelegate0 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate0 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate0 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate0 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate0 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate0 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate0(DesiredRetType (*function_to_bind)() ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)() ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)()) { - m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() () const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction() const { - return (*(m_Closure.GetStaticFunction()))(); } -}; - -//N=1 -template -class FastDelegate1 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate1 type; - - // Construction and comparison functions - FastDelegate1() { clear(); } - FastDelegate1(const FastDelegate1 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate1 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate1 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate1 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate1 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate1 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) { - m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1) const { - return (*(m_Closure.GetStaticFunction()))(p1); } -}; - -//N=2 -template -class FastDelegate2 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate2 type; - - // Construction and comparison functions - FastDelegate2() { clear(); } - FastDelegate2(const FastDelegate2 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate2 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate2 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate2 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate2 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate2 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) { - m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2); } -}; - -//N=3 -template -class FastDelegate3 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate3 type; - - // Construction and comparison functions - FastDelegate3() { clear(); } - FastDelegate3(const FastDelegate3 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate3 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate3 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate3 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate3 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate3 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate3(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate3(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate3(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { - m_Closure.bindstaticfunc(this, &FastDelegate3::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3); } -}; - -//N=4 -template -class FastDelegate4 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate4 type; - - // Construction and comparison functions - FastDelegate4() { clear(); } - FastDelegate4(const FastDelegate4 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate4 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate4 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate4 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate4 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate4 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate4(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate4(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate4(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - m_Closure.bindstaticfunc(this, &FastDelegate4::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4); } -}; - -//N=5 -template -class FastDelegate5 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate5 type; - - // Construction and comparison functions - FastDelegate5() { clear(); } - FastDelegate5(const FastDelegate5 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate5 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate5 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate5 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate5 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate5 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate5(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate5(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate5(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - m_Closure.bindstaticfunc(this, &FastDelegate5::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5); } -}; - -//N=6 -template -class FastDelegate6 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate6 type; - - // Construction and comparison functions - FastDelegate6() { clear(); } - FastDelegate6(const FastDelegate6 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate6 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate6 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate6 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate6 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate6 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate6(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate6(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate6(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - m_Closure.bindstaticfunc(this, &FastDelegate6::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6); } -}; - -//N=7 -template -class FastDelegate7 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate7 type; - - // Construction and comparison functions - FastDelegate7() { clear(); } - FastDelegate7(const FastDelegate7 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate7 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate7 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate7 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate7 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate7 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate7(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate7(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate7(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - m_Closure.bindstaticfunc(this, &FastDelegate7::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7); } -}; - -//N=8 -template -class FastDelegate8 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate8 type; - - // Construction and comparison functions - FastDelegate8() { clear(); } - FastDelegate8(const FastDelegate8 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate8 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate8 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate8 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate8 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate8 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate8(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate8(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate8(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - m_Closure.bindstaticfunc(this, &FastDelegate8::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8); } -}; - -//N=9 -template -class FastDelegate9 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate9 type; - - // Construction and comparison functions - FastDelegate9() { clear(); } - FastDelegate9(const FastDelegate9 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate9 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate9 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate9 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate9 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate9 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate9(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate9(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate9(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - m_Closure.bindstaticfunc(this, &FastDelegate9::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } -}; - -//N=10 -template -class FastDelegate10 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate10 type; - - // Construction and comparison functions - FastDelegate10() { clear(); } - FastDelegate10(const FastDelegate10 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate10 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate10 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate10 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate10 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate10 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate10(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate10(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate10(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - m_Closure.bindstaticfunc(this, &FastDelegate10::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } -}; - -//N=11 -template -class FastDelegate11 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate11 type; - - // Construction and comparison functions - FastDelegate11() { clear(); } - FastDelegate11(const FastDelegate11 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate11 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate11 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate11 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate11 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate11 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate11(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate11(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate11(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - m_Closure.bindstaticfunc(this, &FastDelegate11::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } -}; - -//N=12 -template -class FastDelegate12 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate12 type; - - // Construction and comparison functions - FastDelegate12() { clear(); } - FastDelegate12(const FastDelegate12 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate12 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate12 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate12 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate12 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate12 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate12(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate12(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate12(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - m_Closure.bindstaticfunc(this, &FastDelegate12::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } -}; - -//N=13 -template -class FastDelegate13 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate13 type; - - // Construction and comparison functions - FastDelegate13() { clear(); } - FastDelegate13(const FastDelegate13 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate13 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate13 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate13 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate13 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate13 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate13(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate13(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate13(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - m_Closure.bindstaticfunc(this, &FastDelegate13::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } -}; - -//N=14 -template -class FastDelegate14 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate14 type; - - // Construction and comparison functions - FastDelegate14() { clear(); } - FastDelegate14(const FastDelegate14 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate14 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate14 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate14 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate14 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate14 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate14(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate14(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate14(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - m_Closure.bindstaticfunc(this, &FastDelegate14::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } -}; - -//N=15 -template -class FastDelegate15 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate15 type; - - // Construction and comparison functions - FastDelegate15() { clear(); } - FastDelegate15(const FastDelegate15 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate15 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate15 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate15 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate15 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate15 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate15(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate15(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate15(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - m_Closure.bindstaticfunc(this, &FastDelegate15::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } -}; - -//N=16 -template -class FastDelegate16 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate16 type; - - // Construction and comparison functions - FastDelegate16() { clear(); } - FastDelegate16(const FastDelegate16 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate16 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate16 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate16 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate16 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate16 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate16(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate16(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate16(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - m_Closure.bindstaticfunc(this, &FastDelegate16::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } -}; - -//N=17 -template -class FastDelegate17 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate17 type; - - // Construction and comparison functions - FastDelegate17() { clear(); } - FastDelegate17(const FastDelegate17 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate17 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate17 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate17 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate17 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate17 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate17(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate17(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate17(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - m_Closure.bindstaticfunc(this, &FastDelegate17::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } -}; - -//N=18 -template -class FastDelegate18 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate18 type; - - // Construction and comparison functions - FastDelegate18() { clear(); } - FastDelegate18(const FastDelegate18 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate18 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate18 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate18 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate18 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate18 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate18(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate18(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate18(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - m_Closure.bindstaticfunc(this, &FastDelegate18::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } -}; - -//N=19 -template -class FastDelegate19 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate19 type; - - // Construction and comparison functions - FastDelegate19() { clear(); } - FastDelegate19(const FastDelegate19 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate19 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate19 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate19 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate19 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate19 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate19(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate19(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate19(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - m_Closure.bindstaticfunc(this, &FastDelegate19::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } -}; - -//N=20 -template -class FastDelegate20 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate20 type; - - // Construction and comparison functions - FastDelegate20() { clear(); } - FastDelegate20(const FastDelegate20 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate20 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate20 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate20 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate20 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate20 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate20(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate20(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate20(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - m_Closure.bindstaticfunc(this, &FastDelegate20::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } -}; - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 4: -// -// FastDelegate<> class (Original author: Jody Hagins) -// Allows boost::function style syntax like: -// FastDelegate< double (int, long) > -// instead of: -// FastDelegate2< int, long, double > -// -//////////////////////////////////////////////////////////////////////////////// - -#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -// Declare FastDelegate as a class template. It will be specialized -// later for all number of arguments. -template -class FastDelegate; - -//N=0 -// Specialization to allow use of -// FastDelegate< R ( ) > -// instead of -// FastDelegate0 < R > -template -class FastDelegate< R ( ) > - // Inherit from FastDelegate0 so that it can be treated just like a FastDelegate0 - : public FastDelegate0 < R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate0 < R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=1 -// Specialization to allow use of -// FastDelegate< R ( Param1 ) > -// instead of -// FastDelegate1 < Param1, R > -template -class FastDelegate< R ( Param1 ) > - // Inherit from FastDelegate1 so that it can be treated just like a FastDelegate1 - : public FastDelegate1 < Param1, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate1 < Param1, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=2 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2 ) > -// instead of -// FastDelegate2 < Param1, Param2, R > -template -class FastDelegate< R ( Param1, Param2 ) > - // Inherit from FastDelegate2 so that it can be treated just like a FastDelegate2 - : public FastDelegate2 < Param1, Param2, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate2 < Param1, Param2, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=3 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3 ) > -// instead of -// FastDelegate3 < Param1, Param2, Param3, R > -template -class FastDelegate< R ( Param1, Param2, Param3 ) > - // Inherit from FastDelegate3 so that it can be treated just like a FastDelegate3 - : public FastDelegate3 < Param1, Param2, Param3, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate3 < Param1, Param2, Param3, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=4 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4 ) > -// instead of -// FastDelegate4 < Param1, Param2, Param3, Param4, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4 ) > - // Inherit from FastDelegate4 so that it can be treated just like a FastDelegate4 - : public FastDelegate4 < Param1, Param2, Param3, Param4, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate4 < Param1, Param2, Param3, Param4, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=5 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > -// instead of -// FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > - // Inherit from FastDelegate5 so that it can be treated just like a FastDelegate5 - : public FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=6 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > -// instead of -// FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > - // Inherit from FastDelegate6 so that it can be treated just like a FastDelegate6 - : public FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=7 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > -// instead of -// FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > - // Inherit from FastDelegate7 so that it can be treated just like a FastDelegate7 - : public FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=8 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > -// instead of -// FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > - // Inherit from FastDelegate8 so that it can be treated just like a FastDelegate8 - : public FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=9 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > -// instead of -// FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > - // Inherit from FastDelegate9 so that it can be treated just like a FastDelegate9 - : public FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=10 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > -// instead of -// FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > - // Inherit from FastDelegate10 so that it can be treated just like a FastDelegate10 - : public FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=11 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > -// instead of -// FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > - // Inherit from FastDelegate11 so that it can be treated just like a FastDelegate11 - : public FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=12 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > -// instead of -// FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > - // Inherit from FastDelegate12 so that it can be treated just like a FastDelegate12 - : public FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=13 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > -// instead of -// FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > - // Inherit from FastDelegate13 so that it can be treated just like a FastDelegate13 - : public FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=14 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > -// instead of -// FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > - // Inherit from FastDelegate14 so that it can be treated just like a FastDelegate14 - : public FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=15 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > -// instead of -// FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > - // Inherit from FastDelegate15 so that it can be treated just like a FastDelegate15 - : public FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=16 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > -// instead of -// FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > - // Inherit from FastDelegate16 so that it can be treated just like a FastDelegate16 - : public FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=17 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > -// instead of -// FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > - // Inherit from FastDelegate17 so that it can be treated just like a FastDelegate17 - : public FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=18 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > -// instead of -// FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > - // Inherit from FastDelegate18 so that it can be treated just like a FastDelegate18 - : public FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=19 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > -// instead of -// FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > - // Inherit from FastDelegate19 so that it can be treated just like a FastDelegate19 - : public FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=20 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > -// instead of -// FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > - // Inherit from FastDelegate20 so that it can be treated just like a FastDelegate20 - : public FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - - -#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 5: -// -// MakeDelegate() helper function -// -// MakeDelegate(&x, &X::func) returns a fastdelegate of the type -// necessary for calling x.func() with the correct number of arguments. -// This makes it possible to eliminate many typedefs from user code. -// -//////////////////////////////////////////////////////////////////////////////// - -// Also declare overloads of a MakeDelegate() global function to -// reduce the need for typedefs. -// We need seperate overloads for const and non-const member functions. -// Also, because of the weird rule about the class of derived member function pointers, -// implicit downcasts may need to be applied later to the 'this' pointer. -// That's why two classes (X and Y) appear in the definitions. Y must be implicitly -// castable to X. - -// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. -// GCC 3.2 and later won't compile this unless it's preceded by 'typename', -// but VC6 doesn't allow 'typename' in this context. -// So, I have to use a macro. - -#ifdef FASTDLGT_VC6 -#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type -#else -#define FASTDLGT_RETTYPE RetType -#endif - -//N=0 -template -FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)()) { - return FastDelegate0(x, func); -} - -template -FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)() const) { - return FastDelegate0(x, func); -} - -template -FastDelegate0 MakeDelegate(RetType (*func)()) { - return FastDelegate0(func); -} - -//N=1 -template -FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1)) { - return FastDelegate1(x, func); -} - -template -FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1) const) { - return FastDelegate1(x, func); -} - -template -FastDelegate1 MakeDelegate(RetType (*func)(Param1 p1)) { - return FastDelegate1(func); -} - -//N=2 -template -FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2)) { - return FastDelegate2(x, func); -} - -template -FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2) const) { - return FastDelegate2(x, func); -} - -template -FastDelegate2 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2)) { - return FastDelegate2(func); -} - -//N=3 -template -FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3)) { - return FastDelegate3(x, func); -} - -template -FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3) const) { - return FastDelegate3(x, func); -} - -template -FastDelegate3 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3)) { - return FastDelegate3(func); -} - -//N=4 -template -FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - return FastDelegate4(x, func); -} - -template -FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - return FastDelegate4(x, func); -} - -template -FastDelegate4 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - return FastDelegate4(func); -} - -//N=5 -template -FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - return FastDelegate5(x, func); -} - -template -FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - return FastDelegate5(x, func); -} - -template -FastDelegate5 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - return FastDelegate5(func); -} - -//N=6 -template -FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - return FastDelegate6(x, func); -} - -template -FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - return FastDelegate6(x, func); -} - -template -FastDelegate6 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - return FastDelegate6(func); -} - -//N=7 -template -FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - return FastDelegate7(x, func); -} - -template -FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - return FastDelegate7(x, func); -} - -template -FastDelegate7 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - return FastDelegate7(func); -} - -//N=8 -template -FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - return FastDelegate8(x, func); -} - -template -FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - return FastDelegate8(x, func); -} - -template -FastDelegate8 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - return FastDelegate8(func); -} - -//N=9 -template -FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - return FastDelegate9(x, func); -} - -template -FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - return FastDelegate9(x, func); -} - -template -FastDelegate9 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - return FastDelegate9(func); -} - -//N=10 -template -FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - return FastDelegate10(x, func); -} - -template -FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - return FastDelegate10(x, func); -} - -template -FastDelegate10 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - return FastDelegate10(func); -} - -//N=11 -template -FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - return FastDelegate11(x, func); -} - -template -FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - return FastDelegate11(x, func); -} - -template -FastDelegate11 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - return FastDelegate11(func); -} - -//N=12 -template -FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - return FastDelegate12(x, func); -} - -template -FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - return FastDelegate12(x, func); -} - -template -FastDelegate12 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - return FastDelegate12(func); -} - -//N=13 -template -FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - return FastDelegate13(x, func); -} - -template -FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - return FastDelegate13(x, func); -} - -template -FastDelegate13 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - return FastDelegate13(func); -} - -//N=14 -template -FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - return FastDelegate14(x, func); -} - -template -FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - return FastDelegate14(x, func); -} - -template -FastDelegate14 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - return FastDelegate14(func); -} - -//N=15 -template -FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - return FastDelegate15(x, func); -} - -template -FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - return FastDelegate15(x, func); -} - -template -FastDelegate15 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - return FastDelegate15(func); -} - -//N=16 -template -FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - return FastDelegate16(x, func); -} - -template -FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - return FastDelegate16(x, func); -} - -template -FastDelegate16 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - return FastDelegate16(func); -} - -//N=17 -template -FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - return FastDelegate17(x, func); -} - -template -FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - return FastDelegate17(x, func); -} - -template -FastDelegate17 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - return FastDelegate17(func); -} - -//N=18 -template -FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - return FastDelegate18(x, func); -} - -template -FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - return FastDelegate18(x, func); -} - -template -FastDelegate18 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - return FastDelegate18(func); -} - -//N=19 -template -FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - return FastDelegate19(x, func); -} - -template -FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - return FastDelegate19(x, func); -} - -template -FastDelegate19 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - return FastDelegate19(func); -} - -//N=20 -template -FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - return FastDelegate20(x, func); -} - -template -FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - return FastDelegate20(x, func); -} - -template -FastDelegate20 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - return FastDelegate20(func); -} - - - // clean up after ourselves... -#undef FASTDLGT_RETTYPE - -} // namespace fastdelegate - -#endif // !defined(FASTDELEGATE_H) diff --git a/sourcehook/generate/FastDelegate.h b/sourcehook/generate/FastDelegate.h deleted file mode 100644 index a17bb1a..0000000 --- a/sourcehook/generate/FastDelegate.h +++ /dev/null @@ -1,3811 +0,0 @@ -// FastDelegate.h -// Efficient delegates in C++ that generate only two lines of asm code! -// Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp -// -// - Don Clugston, Mar 2004. -// Major contributions were made by Jody Hagins. -// History: -// 24-Apr-04 1.0 * Submitted to CodeProject. -// 28-Apr-04 1.1 * Prevent most unsafe uses of evil static function hack. -// * Improved syntax for horrible_cast (thanks Paul Bludov). -// * Tested on Metrowerks MWCC and Intel ICL (IA32) -// * Compiled, but not run, on Comeau C++ and Intel Itanium ICL. -// 27-Jun-04 1.2 * Now works on Borland C++ Builder 5.5 -// * Now works on /clr "managed C++" code on VC7, VC7.1 -// * Comeau C++ now compiles without warnings. -// * Prevent the virtual inheritance case from being used on -// VC6 and earlier, which generate incorrect code. -// * Improved warning and error messages. Non-standard hacks -// now have compile-time checks to make them safer. -// * implicit_cast used instead of static_cast in many cases. -// * If calling a const member function, a const class pointer can be used. -// * MakeDelegate() global helper function added to simplify pass-by-value. -// * Added fastdelegate.clear() -// 16-Jul-04 1.2.1* Workaround for gcc bug (const member function pointers in templates) -// 30-Oct-04 1.3 * Support for (non-void) return values. -// * No more workarounds in client code! -// MSVC and Intel now use a clever hack invented by John Dlugosz: -// - The FASTDELEGATEDECLARE workaround is no longer necessary. -// - No more warning messages for VC6 -// * Less use of macros. Error messages should be more comprehensible. -// * Added include guards -// * Added FastDelegate::empty() to test if invocation is safe (Thanks Neville Franks). -// * Now tested on VS 2005 Express Beta, PGI C++ -// 24-Dec-04 1.4 * Added DelegateMemento, to allow collections of disparate delegates. -// * <,>,<=,>= comparison operators to allow storage in ordered containers. -// * Substantial reduction of code size, especially the 'Closure' class. -// * Standardised all the compiler-specific workarounds. -// * MFP conversion now works for CodePlay (but not yet supported in the full code). -// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 -// * New syntax: FastDelegate< int (char *, double) >. -// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). -// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. -// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" -// * Fully supported by CodePlay VectorC -// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! -// * More optimal assignment,== and != operators for static function pointers. - -#ifndef FASTDELEGATE_H -#define FASTDELEGATE_H - -#ifdef _MSC_VER -# if _MSC_VER > 1000 -# pragma once -# endif // _MSC_VER > 1000 -#endif // #ifdef _MSC_VER - -#include // to allow <,> comparisons - -//////////////////////////////////////////////////////////////////////////////// -// Configuration options -// -//////////////////////////////////////////////////////////////////////////////// - -// Uncomment the following #define for optimally-sized delegates. -// In this case, the generated asm code is almost identical to the code you'd get -// if the compiler had native support for delegates. -// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). -// Thus, it will not work for DOS compilers using the medium model. -// It will also probably fail on some DSP systems. -#define FASTDELEGATE_USESTATICFUNCTIONHACK - -// Uncomment the next line to allow function declarator syntax. -// It is automatically enabled for those compilers where it is known to work. -//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Compiler identification for workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Compiler identification. It's not easy to identify Visual C++ because -// many vendors fraudulently define Microsoft's identifiers. -#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) -#define FASTDLGT_ISMSVC - -#if (_MSC_VER <1300) // Many workarounds are required for VC6. -#define FASTDLGT_VC6 -#pragma warning(disable:4786) // disable this ridiculous warning -#endif - -#endif - -// Does the compiler uses Microsoft's member function pointer structure? -// If so, it needs special treatment. -// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's -// identifier, _MSC_VER. We need to filter Metrowerks out. -#if defined(_MSC_VER) && !defined(__MWERKS__) -#define FASTDLGT_MICROSOFT_MFP - -#if !defined(__VECTOR_C) -// CodePlay doesn't have the __single/multi/virtual_inheritance keywords -#define FASTDLGT_HASINHERITANCE_KEYWORDS -#endif -#endif - -// Does it allow function declarator syntax? The following compilers are known to work: -#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. -#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. -#if defined (__MWERKS__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -#ifdef __GNUC__ // Workaround GCC bug #8271 - // At present, GCC doesn't recognize constness of MFPs in templates -#define FASTDELEGATE_GCC_BUG_8271 -#endif - - - -//////////////////////////////////////////////////////////////////////////////// -// General tricks used in this code -// -// (a) Error messages are generated by typdefing an array of negative size to -// generate compile-time errors. -// (b) Warning messages on MSVC are generated by declaring unused variables, and -// enabling the "variable XXX is never used" warning. -// (c) Unions are used in a few compiler-specific cases to perform illegal casts. -// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to -// (char *) first to ensure that the correct number of *bytes* are added. -// -//////////////////////////////////////////////////////////////////////////////// -// Helper templates -// -//////////////////////////////////////////////////////////////////////////////// - - -namespace fastdelegate { -namespace detail { // we'll hide the implementation details in a nested namespace. - -// implicit_cast< > -// I believe this was originally going to be in the C++ standard but -// was left out by accident. It's even milder than static_cast. -// I use it instead of static_cast<> to emphasize that I'm not doing -// anything nasty. -// Usage is identical to static_cast<> -template -inline OutputClass implicit_cast(InputClass input){ - return input; -} - -// horrible_cast< > -// This is truly evil. It completely subverts C++'s type system, allowing you -// to cast from any class to any other class. Technically, using a union -// to perform the cast is undefined behaviour (even in C). But we can see if -// it is OK by checking that the union is the same size as each of its members. -// horrible_cast<> should only be used for compiler-specific workarounds. -// Usage is identical to reinterpret_cast<>. - -// This union is declared outside the horrible_cast because BCC 5.5.1 -// can't inline a function with a nested class, and gives a warning. -template -union horrible_union{ - OutputClass out; - InputClass in; -}; - -template -inline OutputClass horrible_cast(const InputClass input){ - horrible_union u; - // Cause a compile-time error if in, out and u are not the same size. - // If the compile fails here, it means the compiler has peculiar - // unions which would prevent the cast from working. - typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) - && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; - u.in = input; - return u.out; -} - -//////////////////////////////////////////////////////////////////////////////// -// Workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Backwards compatibility: This macro used to be necessary in the virtual inheritance -// case for Intel and Microsoft. Now it just forward-declares the class. -#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; - -// Prevent use of the static function hack with the DOS medium model. -#ifdef __MEDIUM__ -#undef FASTDELEGATE_USESTATICFUNCTIONHACK -#endif - -// DefaultVoid - a workaround for 'void' templates in VC6. -// -// (1) VC6 and earlier do not allow 'void' as a default template argument. -// (2) They also doesn't allow you to return 'void' from a function. -// -// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use -// when we'd like to use 'void'. We convert it into 'void' and back -// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. -// Workaround for (2): On VC6, the code for calling a void function is -// identical to the code for calling a non-void function in which the -// return value is never used, provided the return value is returned -// in the EAX register, rather than on the stack. -// This is true for most fundamental types such as int, enum, void *. -// Const void * is the safest option since it doesn't participate -// in any automatic conversions. But on a 16-bit compiler it might -// cause extra code to be generated, so we disable it for all compilers -// except for VC6 (and VC5). -#ifdef FASTDLGT_VC6 -// VC6 workaround -typedef const void * DefaultVoid; -#else -// On any other compiler, just use a normal void. -typedef void DefaultVoid; -#endif - -// Translate from 'DefaultVoid' to 'void'. -// Everything else is unchanged -template -struct DefaultVoidToVoid { typedef T type; }; - -template <> -struct DefaultVoidToVoid { typedef void type; }; - -// Translate from 'void' into 'DefaultVoid' -// Everything else is unchanged -template -struct VoidToDefaultVoid { typedef T type; }; - -template <> -struct VoidToDefaultVoid { typedef DefaultVoid type; }; - - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1: -// -// Conversion of member function pointer to a standard form -// -//////////////////////////////////////////////////////////////////////////////// - -// GenericClass is a fake class, ONLY used to provide a type. -// It is vitally important that it is never defined, so that the compiler doesn't -// think it can optimize the invocation. For example, Borland generates simpler -// code if it knows the class only uses single inheritance. - -// Compilers using Microsoft's structure need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS - // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP - // (4 bytes), even when the /vmg option is used. Declaring an empty class - // would give 16 byte pointers in this case.... - class __single_inheritance GenericClass; -#endif - // ...but for Codeplay, an empty class *always* gives 4 byte pointers. - // If compiled with the /clr option ("managed C++"), the JIT compiler thinks - // it needs to load GenericClass before it can call any of its functions, - // (compiles OK but crashes at runtime!), so we need to declare an - // empty class to make it happy. - // Codeplay and VC4 can't cope with the unknown_inheritance case either. - class GenericClass {}; -#else - class GenericClass; -#endif - -// The size of a single inheritance member function pointer. -const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); - -// SimplifyMemFunc< >::Convert() -// -// A template function that converts an arbitrary member function pointer into the -// simplest possible form of member function pointer, using a supplied 'this' pointer. -// According to the standard, this can be done legally with reinterpret_cast<>. -// For (non-standard) compilers which use member function pointers which vary in size -// depending on the class, we need to use knowledge of the internal structure of a -// member function pointer, as used by the compiler. Template specialization is used -// to distinguish between the sizes. Because some compilers don't support partial -// template specialisation, I use full specialisation of a wrapper struct. - -// general case -- don't know how to convert it. Force a compile failure -template -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // Unsupported member function type -- force a compile failure. - // (it's illegal to have a array with negative size). - typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; - return 0; - } -}; - -// For compilers where all member func ptrs are the same size, everything goes here. -// For non-standard compilers, only single_inheritance classes go here. -template <> -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { -#if defined __DMC__ - // Digital Mars doesn't allow you to cast between abitrary PMF's, - // even though the standard says you can. The 32-bit compiler lets you - // static_cast through an int, but the DOS compiler doesn't. - bound_func = horrible_cast(function_to_bind); -#else - bound_func = reinterpret_cast(function_to_bind); -#endif - return reinterpret_cast(pthis); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1b: -// -// Workarounds for Microsoft and Intel -// -//////////////////////////////////////////////////////////////////////////////// - - -// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), -// need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) -// at the start of each function for extra safety, but VC6 seems to ICE -// intermittently if you do this inside a template. - -// __multiple_inheritance classes go here -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -template<> -struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // We need to use a horrible_cast to do this conversion. - // In MSVC, a multiple inheritance member pointer is internally defined as: - union { - XFuncType func; - struct { - GenericMemFuncType funcaddress; // points to the actual member function - int delta; // #BYTES to be added to the 'this' pointer - }s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); - } -}; - -// virtual inheritance is a real nuisance. It's inefficient and complicated. -// On MSVC and Intel, there isn't enough information in the pointer itself to -// enable conversion to a closure pointer. Earlier versions of this code didn't -// work for all cases, and generated a compile-time error instead. -// But a very clever hack invented by John M. Dlugosz solves this problem. -// My code is somewhat different to his: I have no asm code, and I make no -// assumptions about the calling convention that is used. - -// In VC++ and ICL, a virtual_inheritance member pointer -// is internally defined as: -struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance -}; -// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the -// m_codeptr member is *always* called, regardless of the values of the other -// members. (This is *not* true for other compilers, eg GCC, which obtain the -// function address from the vtable if a virtual function is being called). -// Dlugosz's trick is to make the codeptr point to a probe function which -// returns the 'this' pointer that was used. - -// Define a generic class that uses virtual inheritance. -// It has a trival member function that returns the value of the 'this' pointer. -struct GenericVirtualClass : virtual public GenericClass -{ - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } -}; - -// __virtual_inheritance classes go here -template <> -struct SimplifyMemFunc -{ - - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - union { - XFuncType func; - GenericClass* (X::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = function_to_bind; - bound_func = reinterpret_cast(u.s.codeptr); - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) - && sizeof(function_to_bind)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - return (pthis->*u.ProbeFunc)(); - } -}; - -#if (_MSC_VER <1300) - -// Nasty hack for Microsoft Visual C++ 6.0 -// unknown_inheritance classes go here -// There is a compiler bug in MSVC6 which generates incorrect code in this case!! -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // There is an apalling but obscure compiler bug in MSVC6 and earlier: - // vtable_index and 'vtordisp' are always set to 0 in the - // unknown_inheritance case! - // This means that an incorrect function could be called!!! - // Compiling with the /vmg option leads to potentially incorrect code. - // This is probably the reason that the IDE has a user interface for specifying - // the /vmg option, but it is disabled - you can only specify /vmg on - // the command line. In VC1.5 and earlier, the compiler would ICE if it ever - // encountered this situation. - // It is OK to use the /vmg option if /vmm or /vms is specified. - - // Fortunately, the wrong function is only called in very obscure cases. - // It only occurs when a derived class overrides a virtual function declared - // in a virtual base class, and the member function - // points to the *Derived* version of that function. The problem can be - // completely averted in 100% of cases by using the *Base class* for the - // member fpointer. Ie, if you use the base class as an interface, you'll - // stay out of trouble. - // Occasionally, you might want to point directly to a derived class function - // that isn't an override of a base class. In this case, both vtable_index - // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. - // We can generate correct code in this case. To prevent an incorrect call from - // ever being made, on MSVC6 we generate a warning, and call a function to - // make the program crash instantly. - typedef char ERROR_VC6CompilerBug[-100]; - return 0; - } -}; - - -#else - -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -// unknown_inheritance classes go here -// This is probably the ugliest bit of code I've ever written. Look at the casts! -// There is a compiler bug in MSVC6 which prevents it from using this code. -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - XFuncType func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - GenericMemFuncType m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - const int * vtable = *reinterpret_cast( - reinterpret_cast(pthis) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - } - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - return reinterpret_cast( - reinterpret_cast(pthis) + u.s.delta + virtual_delta); - }; -}; -#endif // MSVC 7 and greater - -#endif // MS/Intel hacks - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 2: -// -// Define the delegate storage, and cope with static functions -// -//////////////////////////////////////////////////////////////////////////////// - -// DelegateMemento -- an opaque structure which can hold an arbitary delegate. -// It knows nothing about the calling convention or number of arguments used by -// the function pointed to. -// It supplies comparison operators so that it can be stored in STL collections. -// It cannot be set to anything other than null, nor invoked directly: -// it must be converted to a specific delegate. - -// Implementation: -// There are two possible implementations: the Safe method and the Evil method. -// DelegateMemento - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// A static function pointer is stored inside the class. -// Here are the valid values: -// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ -// | 0 | 0 | 0 | Empty | -// | !=0 |(dontcare)| Invoker | Static function| -// | 0 | !=0 | !=0* | Method call | -// +--------------------+----------+------------+----------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// When stored stored inside a specific delegate, the 'dontcare' entries are replaced -// with a reference to the delegate itself. This complicates the = and == operators -// for the delegate class. - -// DelegateMemento - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. In this case the DelegateMemento implementation is simple: -// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ -// | 0 | 0 | Empty | -// | !=0 | !=0* | Static function or method call| -// +----------+------------+-------------------------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - -class DelegateMemento { -protected: - // the data is protected, not private, because many - // compilers have problems with template friends. - typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. - detail::GenericClass *m_pthis; - GenericMemFuncType m_pFunction; - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - typedef void (*GenericFuncPtr)(); // arbitrary code pointer - GenericFuncPtr m_pStaticFunction; -#endif - -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; - void clear() { - m_pthis=0; m_pFunction=0; m_pStaticFunction=0; - } -#else - DelegateMemento() : m_pthis(0), m_pFunction(0) {}; - void clear() { m_pthis=0; m_pFunction=0; } -#endif -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - inline bool IsEqual (const DelegateMemento &x) const{ - // We have to cope with the static function pointers as a special case - if (m_pFunction!=x.m_pFunction) return false; - // the static function ptrs must either both be equal, or both be 0. - if (m_pStaticFunction!=x.m_pStaticFunction) return false; - if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; - else return true; - } -#else // Evil Method - inline bool IsEqual (const DelegateMemento &x) const{ - return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; - } -#endif - // Provide a strict weak ordering for DelegateMementos. - inline bool IsLess(const DelegateMemento &right) const { - // deal with static function pointers first -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) - return m_pStaticFunction < right.m_pStaticFunction; -#endif - if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; - // There are no ordering operators for member function pointers, - // but we can fake one by comparing each byte. The resulting ordering is - // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. - return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; - - } - // BUGFIX (Mar 2005): - // We can't just compare m_pFunction because on Metrowerks, - // m_pFunction can be zero even if the delegate is not empty! - inline bool operator ! () const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } - inline bool empty() const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } -public: - DelegateMemento & operator = (const DelegateMemento &right) { - SetMementoFrom(right); - return *this; - } - inline bool operator <(const DelegateMemento &right) { - return IsLess(right); - } - inline bool operator >(const DelegateMemento &right) { - return right.IsLess(*this); - } - DelegateMemento (const DelegateMemento &right) : - m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - , m_pStaticFunction (right.m_pStaticFunction) -#endif - {} -protected: - void SetMementoFrom(const DelegateMemento &right) { - m_pFunction = right.m_pFunction; - m_pthis = right.m_pthis; -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = right.m_pStaticFunction; -#endif - } -}; - - -// ClosurePtr<> -// -// A private wrapper class that adds function signatures to DelegateMemento. -// It's the class that does most of the actual work. -// The signatures are specified by: -// GenericMemFunc: must be a type of GenericClass member function pointer. -// StaticFuncPtr: must be a type of function pointer with the same signature -// as GenericMemFunc. -// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 -// where it never returns void (returns DefaultVoid instead). - -// An outer class, FastDelegateN<>, handles the invoking and creates the -// necessary typedefs. -// This class does everything else. - -namespace detail { - -template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> -class ClosurePtr : public DelegateMemento { -public: - // These functions are for setting the delegate to a member function. - - // Here's the clever bit: we convert an arbitrary member function into a - // standard form. XMemFunc should be a member function of class X, but I can't - // enforce that here. It needs to be enforced by the wrapper class. - template < class X, class XMemFunc > - inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { - m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(pthis, function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } - // For const member functions, we only need a const class pointer. - // Since we know that the member function is const, it's safe to - // remove the const qualifier from the 'this' pointer with a const_cast. - // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. - template < class X, class XMemFunc> - inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { - m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(const_cast(pthis), function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates - template < class X, class XMemFunc> - inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { - bindconstmemfunc(pthis, function_to_bind); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#endif - // These functions are required for invoking the stored function - inline GenericClass *GetClosureThis() const { return m_pthis; } - inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } - -// There are a few ways of dealing with static function pointers. -// There's a standard-compliant, but tricky method. -// There's also a straightforward hack, that won't work on DOS compilers using the -// medium memory model. It's so evil that I can't recommend it, but I've -// implemented it anyway because it produces very nice asm code. - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - -// ClosurePtr<> - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// I store the function pointer inside the class, and the delegate then -// points to itself. Whenever the delegate is copied, these self-references -// must be transformed, and this complicates the = and == operators. -public: - // The next two functions are for operator ==, =, and the copy constructor. - // We may need to convert the m_pthis pointers, so that - // they remain as self-references. - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { - SetMementoFrom(x); - if (m_pStaticFunction!=0) { - // transform self references... - m_pthis=reinterpret_cast(pParent); - } - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - template < class DerivedClass, class ParentInvokerSig > - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind ) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - bindmemfunc(pParent, static_function_invoker); - } - m_pStaticFunction=reinterpret_cast(function_to_bind); - } - inline UnvoidStaticFuncPtr GetStaticFunction() const { - return reinterpret_cast(m_pStaticFunction); - } -#else - -// ClosurePtr<> - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and -// speeds up comparison and assignment. If C++ provided direct language support -// for delegates, they would produce asm code that was almost identical to this. -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { - SetMementoFrom(right); - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - // ******** EVIL, EVIL CODE! ******* - template < class DerivedClass, class ParentInvokerSig> - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - // We'll be ignoring the 'this' pointer, but we need to make sure we pass - // a valid value to bindmemfunc(). - bindmemfunc(pParent, static_function_invoker); - } - - // WARNING! Evil hack. We store the function in the 'this' pointer! - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; - m_pthis = horrible_cast(function_to_bind); - // MSVC, SunC++ and DMC accept the following (non-standard) code: -// m_pthis = static_cast(static_cast(function_to_bind)); - // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long -// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); - } - // ******** EVIL, EVIL CODE! ******* - // This function will be called with an invalid 'this' pointer!! - // We're just returning the 'this' pointer, converted into - // a function pointer! - inline UnvoidStaticFuncPtr GetStaticFunction() const { - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; - return horrible_cast(this); - } -#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - - // Does the closure contain this static function? - inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ - if (funcptr==0) return empty(); - // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary - // value that is not equal to any valid function pointer. - else return funcptr==reinterpret_cast(GetStaticFunction()); - } -}; - - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 3: -// -// Wrapper classes to ensure type safety -// -//////////////////////////////////////////////////////////////////////////////// - - -// Once we have the member function conversion templates, it's easy to make the -// wrapper classes. So that they will work with as many compilers as possible, -// the classes are of the form -// FastDelegate3 -// They can cope with any combination of parameters. The max number of parameters -// allowed is 8, but it is trivial to increase this limit. -// Note that we need to treat const member functions seperately. -// All this class does is to enforce type safety, and invoke the delegate with -// the correct list of parameters. - -// Because of the weird rule about the class of derived member function pointers, -// you sometimes need to apply a downcast to the 'this' pointer. -// This is the reason for the use of "implicit_cast(pthis)" in the code below. -// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, -// without this trick you'd need to write: -// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); -// but with the trick you can write -// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); - -// RetType is the type the compiler uses in compiling the template. For VC6, -// it cannot be void. DesiredRetType is the real type which is returned from -// all of the functions. It can be void. - -// Implicit conversion to "bool" is achieved using the safe_bool idiom, -// using member data pointers (MDP). This allows "if (dg)..." syntax -// Because some compilers (eg codeplay) don't have a unique value for a zero -// MDP, an extra padding member is added to the SafeBool struct. -// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so -// in that case the static function constructor is not made explicit; this -// allows "if (dg==0) ..." to compile. - -//N=0 -template -class FastDelegate0 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(); - typedef RetType (*UnvoidStaticFunctionPtr)(); - typedef RetType (detail::GenericClass::*GenericMemFn)(); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate0 type; - - // Construction and comparison functions - FastDelegate0() { clear(); } - FastDelegate0(const FastDelegate0 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate0 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate0 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate0 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate0 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate0 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate0(DesiredRetType (*function_to_bind)() ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)() ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)()) { - m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() () const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction() const { - return (*(m_Closure.GetStaticFunction()))(); } -}; - -//N=1 -template -class FastDelegate1 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate1 type; - - // Construction and comparison functions - FastDelegate1() { clear(); } - FastDelegate1(const FastDelegate1 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate1 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate1 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate1 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate1 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate1 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) { - m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1) const { - return (*(m_Closure.GetStaticFunction()))(p1); } -}; - -//N=2 -template -class FastDelegate2 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate2 type; - - // Construction and comparison functions - FastDelegate2() { clear(); } - FastDelegate2(const FastDelegate2 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate2 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate2 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate2 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate2 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate2 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) { - m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2); } -}; - -//N=3 -template -class FastDelegate3 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate3 type; - - // Construction and comparison functions - FastDelegate3() { clear(); } - FastDelegate3(const FastDelegate3 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate3 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate3 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate3 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate3 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate3 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate3(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate3(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate3(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { - m_Closure.bindstaticfunc(this, &FastDelegate3::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3); } -}; - -//N=4 -template -class FastDelegate4 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate4 type; - - // Construction and comparison functions - FastDelegate4() { clear(); } - FastDelegate4(const FastDelegate4 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate4 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate4 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate4 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate4 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate4 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate4(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate4(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate4(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - m_Closure.bindstaticfunc(this, &FastDelegate4::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4); } -}; - -//N=5 -template -class FastDelegate5 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate5 type; - - // Construction and comparison functions - FastDelegate5() { clear(); } - FastDelegate5(const FastDelegate5 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate5 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate5 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate5 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate5 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate5 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate5(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate5(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate5(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - m_Closure.bindstaticfunc(this, &FastDelegate5::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5); } -}; - -//N=6 -template -class FastDelegate6 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate6 type; - - // Construction and comparison functions - FastDelegate6() { clear(); } - FastDelegate6(const FastDelegate6 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate6 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate6 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate6 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate6 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate6 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate6(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate6(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate6(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - m_Closure.bindstaticfunc(this, &FastDelegate6::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6); } -}; - -//N=7 -template -class FastDelegate7 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate7 type; - - // Construction and comparison functions - FastDelegate7() { clear(); } - FastDelegate7(const FastDelegate7 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate7 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate7 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate7 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate7 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate7 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate7(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate7(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate7(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - m_Closure.bindstaticfunc(this, &FastDelegate7::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7); } -}; - -//N=8 -template -class FastDelegate8 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate8 type; - - // Construction and comparison functions - FastDelegate8() { clear(); } - FastDelegate8(const FastDelegate8 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate8 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate8 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate8 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate8 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate8 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate8(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate8(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate8(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - m_Closure.bindstaticfunc(this, &FastDelegate8::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8); } -}; - -//N=9 -template -class FastDelegate9 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate9 type; - - // Construction and comparison functions - FastDelegate9() { clear(); } - FastDelegate9(const FastDelegate9 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate9 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate9 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate9 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate9 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate9 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate9(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate9(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate9(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - m_Closure.bindstaticfunc(this, &FastDelegate9::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } -}; - -//N=10 -template -class FastDelegate10 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate10 type; - - // Construction and comparison functions - FastDelegate10() { clear(); } - FastDelegate10(const FastDelegate10 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate10 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate10 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate10 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate10 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate10 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate10(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate10(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate10(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - m_Closure.bindstaticfunc(this, &FastDelegate10::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } -}; - -//N=11 -template -class FastDelegate11 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate11 type; - - // Construction and comparison functions - FastDelegate11() { clear(); } - FastDelegate11(const FastDelegate11 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate11 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate11 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate11 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate11 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate11 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate11(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate11(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate11(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - m_Closure.bindstaticfunc(this, &FastDelegate11::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } -}; - -//N=12 -template -class FastDelegate12 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate12 type; - - // Construction and comparison functions - FastDelegate12() { clear(); } - FastDelegate12(const FastDelegate12 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate12 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate12 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate12 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate12 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate12 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate12(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate12(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate12(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - m_Closure.bindstaticfunc(this, &FastDelegate12::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } -}; - -//N=13 -template -class FastDelegate13 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate13 type; - - // Construction and comparison functions - FastDelegate13() { clear(); } - FastDelegate13(const FastDelegate13 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate13 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate13 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate13 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate13 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate13 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate13(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate13(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate13(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - m_Closure.bindstaticfunc(this, &FastDelegate13::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } -}; - -//N=14 -template -class FastDelegate14 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate14 type; - - // Construction and comparison functions - FastDelegate14() { clear(); } - FastDelegate14(const FastDelegate14 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate14 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate14 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate14 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate14 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate14 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate14(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate14(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate14(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - m_Closure.bindstaticfunc(this, &FastDelegate14::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } -}; - -//N=15 -template -class FastDelegate15 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate15 type; - - // Construction and comparison functions - FastDelegate15() { clear(); } - FastDelegate15(const FastDelegate15 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate15 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate15 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate15 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate15 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate15 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate15(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate15(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate15(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - m_Closure.bindstaticfunc(this, &FastDelegate15::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } -}; - -//N=16 -template -class FastDelegate16 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate16 type; - - // Construction and comparison functions - FastDelegate16() { clear(); } - FastDelegate16(const FastDelegate16 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate16 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate16 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate16 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate16 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate16 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate16(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate16(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate16(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - m_Closure.bindstaticfunc(this, &FastDelegate16::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } -}; - -//N=17 -template -class FastDelegate17 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate17 type; - - // Construction and comparison functions - FastDelegate17() { clear(); } - FastDelegate17(const FastDelegate17 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate17 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate17 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate17 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate17 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate17 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate17(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate17(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate17(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - m_Closure.bindstaticfunc(this, &FastDelegate17::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } -}; - -//N=18 -template -class FastDelegate18 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate18 type; - - // Construction and comparison functions - FastDelegate18() { clear(); } - FastDelegate18(const FastDelegate18 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate18 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate18 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate18 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate18 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate18 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate18(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate18(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate18(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - m_Closure.bindstaticfunc(this, &FastDelegate18::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } -}; - -//N=19 -template -class FastDelegate19 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate19 type; - - // Construction and comparison functions - FastDelegate19() { clear(); } - FastDelegate19(const FastDelegate19 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate19 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate19 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate19 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate19 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate19 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate19(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate19(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate19(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - m_Closure.bindstaticfunc(this, &FastDelegate19::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } -}; - -//N=20 -template -class FastDelegate20 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate20 type; - - // Construction and comparison functions - FastDelegate20() { clear(); } - FastDelegate20(const FastDelegate20 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate20 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate20 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate20 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate20 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate20 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate20(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate20(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate20(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - m_Closure.bindstaticfunc(this, &FastDelegate20::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } -}; - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 4: -// -// FastDelegate<> class (Original author: Jody Hagins) -// Allows boost::function style syntax like: -// FastDelegate< double (int, long) > -// instead of: -// FastDelegate2< int, long, double > -// -//////////////////////////////////////////////////////////////////////////////// - -#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -// Declare FastDelegate as a class template. It will be specialized -// later for all number of arguments. -template -class FastDelegate; - -//N=0 -// Specialization to allow use of -// FastDelegate< R ( ) > -// instead of -// FastDelegate0 < R > -template -class FastDelegate< R ( ) > - // Inherit from FastDelegate0 so that it can be treated just like a FastDelegate0 - : public FastDelegate0 < R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate0 < R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=1 -// Specialization to allow use of -// FastDelegate< R ( Param1 ) > -// instead of -// FastDelegate1 < Param1, R > -template -class FastDelegate< R ( Param1 ) > - // Inherit from FastDelegate1 so that it can be treated just like a FastDelegate1 - : public FastDelegate1 < Param1, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate1 < Param1, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=2 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2 ) > -// instead of -// FastDelegate2 < Param1, Param2, R > -template -class FastDelegate< R ( Param1, Param2 ) > - // Inherit from FastDelegate2 so that it can be treated just like a FastDelegate2 - : public FastDelegate2 < Param1, Param2, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate2 < Param1, Param2, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=3 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3 ) > -// instead of -// FastDelegate3 < Param1, Param2, Param3, R > -template -class FastDelegate< R ( Param1, Param2, Param3 ) > - // Inherit from FastDelegate3 so that it can be treated just like a FastDelegate3 - : public FastDelegate3 < Param1, Param2, Param3, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate3 < Param1, Param2, Param3, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=4 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4 ) > -// instead of -// FastDelegate4 < Param1, Param2, Param3, Param4, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4 ) > - // Inherit from FastDelegate4 so that it can be treated just like a FastDelegate4 - : public FastDelegate4 < Param1, Param2, Param3, Param4, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate4 < Param1, Param2, Param3, Param4, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=5 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > -// instead of -// FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > - // Inherit from FastDelegate5 so that it can be treated just like a FastDelegate5 - : public FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=6 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > -// instead of -// FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > - // Inherit from FastDelegate6 so that it can be treated just like a FastDelegate6 - : public FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=7 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > -// instead of -// FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > - // Inherit from FastDelegate7 so that it can be treated just like a FastDelegate7 - : public FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=8 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > -// instead of -// FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > - // Inherit from FastDelegate8 so that it can be treated just like a FastDelegate8 - : public FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=9 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > -// instead of -// FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > - // Inherit from FastDelegate9 so that it can be treated just like a FastDelegate9 - : public FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=10 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > -// instead of -// FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > - // Inherit from FastDelegate10 so that it can be treated just like a FastDelegate10 - : public FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=11 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > -// instead of -// FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > - // Inherit from FastDelegate11 so that it can be treated just like a FastDelegate11 - : public FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=12 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > -// instead of -// FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > - // Inherit from FastDelegate12 so that it can be treated just like a FastDelegate12 - : public FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=13 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > -// instead of -// FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > - // Inherit from FastDelegate13 so that it can be treated just like a FastDelegate13 - : public FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=14 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > -// instead of -// FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > - // Inherit from FastDelegate14 so that it can be treated just like a FastDelegate14 - : public FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=15 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > -// instead of -// FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > - // Inherit from FastDelegate15 so that it can be treated just like a FastDelegate15 - : public FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=16 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > -// instead of -// FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > - // Inherit from FastDelegate16 so that it can be treated just like a FastDelegate16 - : public FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=17 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > -// instead of -// FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > - // Inherit from FastDelegate17 so that it can be treated just like a FastDelegate17 - : public FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=18 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > -// instead of -// FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > - // Inherit from FastDelegate18 so that it can be treated just like a FastDelegate18 - : public FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=19 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > -// instead of -// FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > - // Inherit from FastDelegate19 so that it can be treated just like a FastDelegate19 - : public FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=20 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > -// instead of -// FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > - // Inherit from FastDelegate20 so that it can be treated just like a FastDelegate20 - : public FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - - -#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 5: -// -// MakeDelegate() helper function -// -// MakeDelegate(&x, &X::func) returns a fastdelegate of the type -// necessary for calling x.func() with the correct number of arguments. -// This makes it possible to eliminate many typedefs from user code. -// -//////////////////////////////////////////////////////////////////////////////// - -// Also declare overloads of a MakeDelegate() global function to -// reduce the need for typedefs. -// We need seperate overloads for const and non-const member functions. -// Also, because of the weird rule about the class of derived member function pointers, -// implicit downcasts may need to be applied later to the 'this' pointer. -// That's why two classes (X and Y) appear in the definitions. Y must be implicitly -// castable to X. - -// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. -// GCC 3.2 and later won't compile this unless it's preceded by 'typename', -// but VC6 doesn't allow 'typename' in this context. -// So, I have to use a macro. - -#ifdef FASTDLGT_VC6 -#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type -#else -#define FASTDLGT_RETTYPE RetType -#endif - -//N=0 -template -FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)()) { - return FastDelegate0(x, func); -} - -template -FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)() const) { - return FastDelegate0(x, func); -} - -template -FastDelegate0 MakeDelegate(RetType (*func)()) { - return FastDelegate0(func); -} - -//N=1 -template -FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1)) { - return FastDelegate1(x, func); -} - -template -FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1) const) { - return FastDelegate1(x, func); -} - -template -FastDelegate1 MakeDelegate(RetType (*func)(Param1 p1)) { - return FastDelegate1(func); -} - -//N=2 -template -FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2)) { - return FastDelegate2(x, func); -} - -template -FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2) const) { - return FastDelegate2(x, func); -} - -template -FastDelegate2 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2)) { - return FastDelegate2(func); -} - -//N=3 -template -FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3)) { - return FastDelegate3(x, func); -} - -template -FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3) const) { - return FastDelegate3(x, func); -} - -template -FastDelegate3 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3)) { - return FastDelegate3(func); -} - -//N=4 -template -FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - return FastDelegate4(x, func); -} - -template -FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - return FastDelegate4(x, func); -} - -template -FastDelegate4 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - return FastDelegate4(func); -} - -//N=5 -template -FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - return FastDelegate5(x, func); -} - -template -FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - return FastDelegate5(x, func); -} - -template -FastDelegate5 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - return FastDelegate5(func); -} - -//N=6 -template -FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - return FastDelegate6(x, func); -} - -template -FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - return FastDelegate6(x, func); -} - -template -FastDelegate6 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - return FastDelegate6(func); -} - -//N=7 -template -FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - return FastDelegate7(x, func); -} - -template -FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - return FastDelegate7(x, func); -} - -template -FastDelegate7 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - return FastDelegate7(func); -} - -//N=8 -template -FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - return FastDelegate8(x, func); -} - -template -FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - return FastDelegate8(x, func); -} - -template -FastDelegate8 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - return FastDelegate8(func); -} - -//N=9 -template -FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - return FastDelegate9(x, func); -} - -template -FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - return FastDelegate9(x, func); -} - -template -FastDelegate9 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - return FastDelegate9(func); -} - -//N=10 -template -FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - return FastDelegate10(x, func); -} - -template -FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - return FastDelegate10(x, func); -} - -template -FastDelegate10 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - return FastDelegate10(func); -} - -//N=11 -template -FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - return FastDelegate11(x, func); -} - -template -FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - return FastDelegate11(x, func); -} - -template -FastDelegate11 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - return FastDelegate11(func); -} - -//N=12 -template -FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - return FastDelegate12(x, func); -} - -template -FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - return FastDelegate12(x, func); -} - -template -FastDelegate12 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - return FastDelegate12(func); -} - -//N=13 -template -FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - return FastDelegate13(x, func); -} - -template -FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - return FastDelegate13(x, func); -} - -template -FastDelegate13 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - return FastDelegate13(func); -} - -//N=14 -template -FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - return FastDelegate14(x, func); -} - -template -FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - return FastDelegate14(x, func); -} - -template -FastDelegate14 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - return FastDelegate14(func); -} - -//N=15 -template -FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - return FastDelegate15(x, func); -} - -template -FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - return FastDelegate15(x, func); -} - -template -FastDelegate15 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - return FastDelegate15(func); -} - -//N=16 -template -FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - return FastDelegate16(x, func); -} - -template -FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - return FastDelegate16(x, func); -} - -template -FastDelegate16 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - return FastDelegate16(func); -} - -//N=17 -template -FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - return FastDelegate17(x, func); -} - -template -FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - return FastDelegate17(x, func); -} - -template -FastDelegate17 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - return FastDelegate17(func); -} - -//N=18 -template -FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - return FastDelegate18(x, func); -} - -template -FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - return FastDelegate18(x, func); -} - -template -FastDelegate18 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - return FastDelegate18(func); -} - -//N=19 -template -FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - return FastDelegate19(x, func); -} - -template -FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - return FastDelegate19(x, func); -} - -template -FastDelegate19 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - return FastDelegate19(func); -} - -//N=20 -template -FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - return FastDelegate20(x, func); -} - -template -FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - return FastDelegate20(x, func); -} - -template -FastDelegate20 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - return FastDelegate20(func); -} - - - // clean up after ourselves... -#undef FASTDLGT_RETTYPE - -} // namespace fastdelegate - -#endif // !defined(FASTDELEGATE_H) diff --git a/sourcehook/generate/FastDelegate.hxx b/sourcehook/generate/FastDelegate.hxx deleted file mode 100644 index 6f2fe49..0000000 --- a/sourcehook/generate/FastDelegate.hxx +++ /dev/null @@ -1,1054 +0,0 @@ -// FastDelegate.h -// Efficient delegates in C++ that generate only two lines of asm code! -// Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp -// -// - Don Clugston, Mar 2004. -// Major contributions were made by Jody Hagins. -// History: -// 24-Apr-04 1.0 * Submitted to CodeProject. -// 28-Apr-04 1.1 * Prevent most unsafe uses of evil static function hack. -// * Improved syntax for horrible_cast (thanks Paul Bludov). -// * Tested on Metrowerks MWCC and Intel ICL (IA32) -// * Compiled, but not run, on Comeau C++ and Intel Itanium ICL. -// 27-Jun-04 1.2 * Now works on Borland C++ Builder 5.5 -// * Now works on /clr "managed C++" code on VC7, VC7.1 -// * Comeau C++ now compiles without warnings. -// * Prevent the virtual inheritance case from being used on -// VC6 and earlier, which generate incorrect code. -// * Improved warning and error messages. Non-standard hacks -// now have compile-time checks to make them safer. -// * implicit_cast used instead of static_cast in many cases. -// * If calling a const member function, a const class pointer can be used. -// * MakeDelegate() global helper function added to simplify pass-by-value. -// * Added fastdelegate.clear() -// 16-Jul-04 1.2.1* Workaround for gcc bug (const member function pointers in templates) -// 30-Oct-04 1.3 * Support for (non-void) return values. -// * No more workarounds in client code! -// MSVC and Intel now use a clever hack invented by John Dlugosz: -// - The FASTDELEGATEDECLARE workaround is no longer necessary. -// - No more warning messages for VC6 -// * Less use of macros. Error messages should be more comprehensible. -// * Added include guards -// * Added FastDelegate::empty() to test if invocation is safe (Thanks Neville Franks). -// * Now tested on VS 2005 Express Beta, PGI C++ -// 24-Dec-04 1.4 * Added DelegateMemento, to allow collections of disparate delegates. -// * <,>,<=,>= comparison operators to allow storage in ordered containers. -// * Substantial reduction of code size, especially the 'Closure' class. -// * Standardised all the compiler-specific workarounds. -// * MFP conversion now works for CodePlay (but not yet supported in the full code). -// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 -// * New syntax: FastDelegate< int (char *, double) >. -// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). -// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. -// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" -// * Fully supported by CodePlay VectorC -// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! -// * More optimal assignment,== and != operators for static function pointers. - -#ifndef FASTDELEGATE_H -#define FASTDELEGATE_H - -#ifdef _MSC_VER -# if _MSC_VER > 1000 -# pragma once -# endif // _MSC_VER > 1000 -#endif // #ifdef _MSC_VER - -#include // to allow <,> comparisons - -//////////////////////////////////////////////////////////////////////////////// -// Configuration options -// -//////////////////////////////////////////////////////////////////////////////// - -// Uncomment the following #define for optimally-sized delegates. -// In this case, the generated asm code is almost identical to the code you'd get -// if the compiler had native support for delegates. -// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). -// Thus, it will not work for DOS compilers using the medium model. -// It will also probably fail on some DSP systems. -#define FASTDELEGATE_USESTATICFUNCTIONHACK - -// Uncomment the next line to allow function declarator syntax. -// It is automatically enabled for those compilers where it is known to work. -//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Compiler identification for workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Compiler identification. It's not easy to identify Visual C++ because -// many vendors fraudulently define Microsoft's identifiers. -#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) -#define FASTDLGT_ISMSVC - -#if (_MSC_VER <1300) // Many workarounds are required for VC6. -#define FASTDLGT_VC6 -#pragma warning(disable:4786) // disable this ridiculous warning -#endif - -#endif - -// Does the compiler uses Microsoft's member function pointer structure? -// If so, it needs special treatment. -// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's -// identifier, _MSC_VER. We need to filter Metrowerks out. -#if defined(_MSC_VER) && !defined(__MWERKS__) -#define FASTDLGT_MICROSOFT_MFP - -#if !defined(__VECTOR_C) -// CodePlay doesn't have the __single/multi/virtual_inheritance keywords -#define FASTDLGT_HASINHERITANCE_KEYWORDS -#endif -#endif - -// Does it allow function declarator syntax? The following compilers are known to work: -#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. -#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. -#if defined (__MWERKS__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -#ifdef __GNUC__ // Workaround GCC bug #8271 - // At present, GCC doesn't recognize constness of MFPs in templates -#define FASTDELEGATE_GCC_BUG_8271 -#endif - - - -//////////////////////////////////////////////////////////////////////////////// -// General tricks used in this code -// -// (a) Error messages are generated by typdefing an array of negative size to -// generate compile-time errors. -// (b) Warning messages on MSVC are generated by declaring unused variables, and -// enabling the "variable XXX is never used" warning. -// (c) Unions are used in a few compiler-specific cases to perform illegal casts. -// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to -// (char *) first to ensure that the correct number of *bytes* are added. -// -//////////////////////////////////////////////////////////////////////////////// -// Helper templates -// -//////////////////////////////////////////////////////////////////////////////// - - -namespace fastdelegate { -namespace detail { // we'll hide the implementation details in a nested namespace. - -// implicit_cast< > -// I believe this was originally going to be in the C++ standard but -// was left out by accident. It's even milder than static_cast. -// I use it instead of static_cast<> to emphasize that I'm not doing -// anything nasty. -// Usage is identical to static_cast<> -template -inline OutputClass implicit_cast(InputClass input){ - return input; -} - -// horrible_cast< > -// This is truly evil. It completely subverts C++'s type system, allowing you -// to cast from any class to any other class. Technically, using a union -// to perform the cast is undefined behaviour (even in C). But we can see if -// it is OK by checking that the union is the same size as each of its members. -// horrible_cast<> should only be used for compiler-specific workarounds. -// Usage is identical to reinterpret_cast<>. - -// This union is declared outside the horrible_cast because BCC 5.5.1 -// can't inline a function with a nested class, and gives a warning. -template -union horrible_union{ - OutputClass out; - InputClass in; -}; - -template -inline OutputClass horrible_cast(const InputClass input){ - horrible_union u; - // Cause a compile-time error if in, out and u are not the same size. - // If the compile fails here, it means the compiler has peculiar - // unions which would prevent the cast from working. - typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) - && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; - u.in = input; - return u.out; -} - -//////////////////////////////////////////////////////////////////////////////// -// Workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Backwards compatibility: This macro used to be necessary in the virtual inheritance -// case for Intel and Microsoft. Now it just forward-declares the class. -#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; - -// Prevent use of the static function hack with the DOS medium model. -#ifdef __MEDIUM__ -#undef FASTDELEGATE_USESTATICFUNCTIONHACK -#endif - -// DefaultVoid - a workaround for 'void' templates in VC6. -// -// (1) VC6 and earlier do not allow 'void' as a default template argument. -// (2) They also doesn't allow you to return 'void' from a function. -// -// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use -// when we'd like to use 'void'. We convert it into 'void' and back -// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. -// Workaround for (2): On VC6, the code for calling a void function is -// identical to the code for calling a non-void function in which the -// return value is never used, provided the return value is returned -// in the EAX register, rather than on the stack. -// This is true for most fundamental types such as int, enum, void *. -// Const void * is the safest option since it doesn't participate -// in any automatic conversions. But on a 16-bit compiler it might -// cause extra code to be generated, so we disable it for all compilers -// except for VC6 (and VC5). -#ifdef FASTDLGT_VC6 -// VC6 workaround -typedef const void * DefaultVoid; -#else -// On any other compiler, just use a normal void. -typedef void DefaultVoid; -#endif - -// Translate from 'DefaultVoid' to 'void'. -// Everything else is unchanged -template -struct DefaultVoidToVoid { typedef T type; }; - -template <> -struct DefaultVoidToVoid { typedef void type; }; - -// Translate from 'void' into 'DefaultVoid' -// Everything else is unchanged -template -struct VoidToDefaultVoid { typedef T type; }; - -template <> -struct VoidToDefaultVoid { typedef DefaultVoid type; }; - - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1: -// -// Conversion of member function pointer to a standard form -// -//////////////////////////////////////////////////////////////////////////////// - -// GenericClass is a fake class, ONLY used to provide a type. -// It is vitally important that it is never defined, so that the compiler doesn't -// think it can optimize the invocation. For example, Borland generates simpler -// code if it knows the class only uses single inheritance. - -// Compilers using Microsoft's structure need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS - // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP - // (4 bytes), even when the /vmg option is used. Declaring an empty class - // would give 16 byte pointers in this case.... - class __single_inheritance GenericClass; -#endif - // ...but for Codeplay, an empty class *always* gives 4 byte pointers. - // If compiled with the /clr option ("managed C++"), the JIT compiler thinks - // it needs to load GenericClass before it can call any of its functions, - // (compiles OK but crashes at runtime!), so we need to declare an - // empty class to make it happy. - // Codeplay and VC4 can't cope with the unknown_inheritance case either. - class GenericClass {}; -#else - class GenericClass; -#endif - -// The size of a single inheritance member function pointer. -const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); - -// SimplifyMemFunc< >::Convert() -// -// A template function that converts an arbitrary member function pointer into the -// simplest possible form of member function pointer, using a supplied 'this' pointer. -// According to the standard, this can be done legally with reinterpret_cast<>. -// For (non-standard) compilers which use member function pointers which vary in size -// depending on the class, we need to use knowledge of the internal structure of a -// member function pointer, as used by the compiler. Template specialization is used -// to distinguish between the sizes. Because some compilers don't support partial -// template specialisation, I use full specialisation of a wrapper struct. - -// general case -- don't know how to convert it. Force a compile failure -template -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // Unsupported member function type -- force a compile failure. - // (it's illegal to have a array with negative size). - typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; - return 0; - } -}; - -// For compilers where all member func ptrs are the same size, everything goes here. -// For non-standard compilers, only single_inheritance classes go here. -template <> -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { -#if defined __DMC__ - // Digital Mars doesn't allow you to cast between abitrary PMF's, - // even though the standard says you can. The 32-bit compiler lets you - // static_cast through an int, but the DOS compiler doesn't. - bound_func = horrible_cast(function_to_bind); -#else - bound_func = reinterpret_cast(function_to_bind); -#endif - return reinterpret_cast(pthis); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1b: -// -// Workarounds for Microsoft and Intel -// -//////////////////////////////////////////////////////////////////////////////// - - -// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), -// need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) -// at the start of each function for extra safety, but VC6 seems to ICE -// intermittently if you do this inside a template. - -// __multiple_inheritance classes go here -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -template<> -struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // We need to use a horrible_cast to do this conversion. - // In MSVC, a multiple inheritance member pointer is internally defined as: - union { - XFuncType func; - struct { - GenericMemFuncType funcaddress; // points to the actual member function - int delta; // #BYTES to be added to the 'this' pointer - }s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); - } -}; - -// virtual inheritance is a real nuisance. It's inefficient and complicated. -// On MSVC and Intel, there isn't enough information in the pointer itself to -// enable conversion to a closure pointer. Earlier versions of this code didn't -// work for all cases, and generated a compile-time error instead. -// But a very clever hack invented by John M. Dlugosz solves this problem. -// My code is somewhat different to his: I have no asm code, and I make no -// assumptions about the calling convention that is used. - -// In VC++ and ICL, a virtual_inheritance member pointer -// is internally defined as: -struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance -}; -// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the -// m_codeptr member is *always* called, regardless of the values of the other -// members. (This is *not* true for other compilers, eg GCC, which obtain the -// function address from the vtable if a virtual function is being called). -// Dlugosz's trick is to make the codeptr point to a probe function which -// returns the 'this' pointer that was used. - -// Define a generic class that uses virtual inheritance. -// It has a trival member function that returns the value of the 'this' pointer. -struct GenericVirtualClass : virtual public GenericClass -{ - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } -}; - -// __virtual_inheritance classes go here -template <> -struct SimplifyMemFunc -{ - - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - union { - XFuncType func; - GenericClass* (X::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = function_to_bind; - bound_func = reinterpret_cast(u.s.codeptr); - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) - && sizeof(function_to_bind)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - return (pthis->*u.ProbeFunc)(); - } -}; - -#if (_MSC_VER <1300) - -// Nasty hack for Microsoft Visual C++ 6.0 -// unknown_inheritance classes go here -// There is a compiler bug in MSVC6 which generates incorrect code in this case!! -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // There is an apalling but obscure compiler bug in MSVC6 and earlier: - // vtable_index and 'vtordisp' are always set to 0 in the - // unknown_inheritance case! - // This means that an incorrect function could be called!!! - // Compiling with the /vmg option leads to potentially incorrect code. - // This is probably the reason that the IDE has a user interface for specifying - // the /vmg option, but it is disabled - you can only specify /vmg on - // the command line. In VC1.5 and earlier, the compiler would ICE if it ever - // encountered this situation. - // It is OK to use the /vmg option if /vmm or /vms is specified. - - // Fortunately, the wrong function is only called in very obscure cases. - // It only occurs when a derived class overrides a virtual function declared - // in a virtual base class, and the member function - // points to the *Derived* version of that function. The problem can be - // completely averted in 100% of cases by using the *Base class* for the - // member fpointer. Ie, if you use the base class as an interface, you'll - // stay out of trouble. - // Occasionally, you might want to point directly to a derived class function - // that isn't an override of a base class. In this case, both vtable_index - // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. - // We can generate correct code in this case. To prevent an incorrect call from - // ever being made, on MSVC6 we generate a warning, and call a function to - // make the program crash instantly. - typedef char ERROR_VC6CompilerBug[-100]; - return 0; - } -}; - - -#else - -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -// unknown_inheritance classes go here -// This is probably the ugliest bit of code I've ever written. Look at the casts! -// There is a compiler bug in MSVC6 which prevents it from using this code. -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - XFuncType func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - GenericMemFuncType m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - const int * vtable = *reinterpret_cast( - reinterpret_cast(pthis) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - } - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - return reinterpret_cast( - reinterpret_cast(pthis) + u.s.delta + virtual_delta); - }; -}; -#endif // MSVC 7 and greater - -#endif // MS/Intel hacks - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 2: -// -// Define the delegate storage, and cope with static functions -// -//////////////////////////////////////////////////////////////////////////////// - -// DelegateMemento -- an opaque structure which can hold an arbitary delegate. -// It knows nothing about the calling convention or number of arguments used by -// the function pointed to. -// It supplies comparison operators so that it can be stored in STL collections. -// It cannot be set to anything other than null, nor invoked directly: -// it must be converted to a specific delegate. - -// Implementation: -// There are two possible implementations: the Safe method and the Evil method. -// DelegateMemento - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// A static function pointer is stored inside the class. -// Here are the valid values: -// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ -// | 0 | 0 | 0 | Empty | -// | !=0 |(dontcare)| Invoker | Static function| -// | 0 | !=0 | !=0* | Method call | -// +--------------------+----------+------------+----------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// When stored stored inside a specific delegate, the 'dontcare' entries are replaced -// with a reference to the delegate itself. This complicates the = and == operators -// for the delegate class. - -// DelegateMemento - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. In this case the DelegateMemento implementation is simple: -// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ -// | 0 | 0 | Empty | -// | !=0 | !=0* | Static function or method call| -// +----------+------------+-------------------------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - -class DelegateMemento { -protected: - // the data is protected, not private, because many - // compilers have problems with template friends. - typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. - detail::GenericClass *m_pthis; - GenericMemFuncType m_pFunction; - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - typedef void (*GenericFuncPtr)(); // arbitrary code pointer - GenericFuncPtr m_pStaticFunction; -#endif - -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; - void clear() { - m_pthis=0; m_pFunction=0; m_pStaticFunction=0; - } -#else - DelegateMemento() : m_pthis(0), m_pFunction(0) {}; - void clear() { m_pthis=0; m_pFunction=0; } -#endif -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - inline bool IsEqual (const DelegateMemento &x) const{ - // We have to cope with the static function pointers as a special case - if (m_pFunction!=x.m_pFunction) return false; - // the static function ptrs must either both be equal, or both be 0. - if (m_pStaticFunction!=x.m_pStaticFunction) return false; - if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; - else return true; - } -#else // Evil Method - inline bool IsEqual (const DelegateMemento &x) const{ - return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; - } -#endif - // Provide a strict weak ordering for DelegateMementos. - inline bool IsLess(const DelegateMemento &right) const { - // deal with static function pointers first -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) - return m_pStaticFunction < right.m_pStaticFunction; -#endif - if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; - // There are no ordering operators for member function pointers, - // but we can fake one by comparing each byte. The resulting ordering is - // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. - return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; - - } - // BUGFIX (Mar 2005): - // We can't just compare m_pFunction because on Metrowerks, - // m_pFunction can be zero even if the delegate is not empty! - inline bool operator ! () const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } - inline bool empty() const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } -public: - DelegateMemento & operator = (const DelegateMemento &right) { - SetMementoFrom(right); - return *this; - } - inline bool operator <(const DelegateMemento &right) { - return IsLess(right); - } - inline bool operator >(const DelegateMemento &right) { - return right.IsLess(*this); - } - DelegateMemento (const DelegateMemento &right) : - m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - , m_pStaticFunction (right.m_pStaticFunction) -#endif - {} -protected: - void SetMementoFrom(const DelegateMemento &right) { - m_pFunction = right.m_pFunction; - m_pthis = right.m_pthis; -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = right.m_pStaticFunction; -#endif - } -}; - - -// ClosurePtr<> -// -// A private wrapper class that adds function signatures to DelegateMemento. -// It's the class that does most of the actual work. -// The signatures are specified by: -// GenericMemFunc: must be a type of GenericClass member function pointer. -// StaticFuncPtr: must be a type of function pointer with the same signature -// as GenericMemFunc. -// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 -// where it never returns void (returns DefaultVoid instead). - -// An outer class, FastDelegateN<>, handles the invoking and creates the -// necessary typedefs. -// This class does everything else. - -namespace detail { - -template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> -class ClosurePtr : public DelegateMemento { -public: - // These functions are for setting the delegate to a member function. - - // Here's the clever bit: we convert an arbitrary member function into a - // standard form. XMemFunc should be a member function of class X, but I can't - // enforce that here. It needs to be enforced by the wrapper class. - template < class X, class XMemFunc > - inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { - m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(pthis, function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } - // For const member functions, we only need a const class pointer. - // Since we know that the member function is const, it's safe to - // remove the const qualifier from the 'this' pointer with a const_cast. - // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. - template < class X, class XMemFunc> - inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { - m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(const_cast(pthis), function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates - template < class X, class XMemFunc> - inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { - bindconstmemfunc(pthis, function_to_bind); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#endif - // These functions are required for invoking the stored function - inline GenericClass *GetClosureThis() const { return m_pthis; } - inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } - -// There are a few ways of dealing with static function pointers. -// There's a standard-compliant, but tricky method. -// There's also a straightforward hack, that won't work on DOS compilers using the -// medium memory model. It's so evil that I can't recommend it, but I've -// implemented it anyway because it produces very nice asm code. - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - -// ClosurePtr<> - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// I store the function pointer inside the class, and the delegate then -// points to itself. Whenever the delegate is copied, these self-references -// must be transformed, and this complicates the = and == operators. -public: - // The next two functions are for operator ==, =, and the copy constructor. - // We may need to convert the m_pthis pointers, so that - // they remain as self-references. - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { - SetMementoFrom(x); - if (m_pStaticFunction!=0) { - // transform self references... - m_pthis=reinterpret_cast(pParent); - } - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - template < class DerivedClass, class ParentInvokerSig > - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind ) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - bindmemfunc(pParent, static_function_invoker); - } - m_pStaticFunction=reinterpret_cast(function_to_bind); - } - inline UnvoidStaticFuncPtr GetStaticFunction() const { - return reinterpret_cast(m_pStaticFunction); - } -#else - -// ClosurePtr<> - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and -// speeds up comparison and assignment. If C++ provided direct language support -// for delegates, they would produce asm code that was almost identical to this. -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { - SetMementoFrom(right); - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - // ******** EVIL, EVIL CODE! ******* - template < class DerivedClass, class ParentInvokerSig> - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - // We'll be ignoring the 'this' pointer, but we need to make sure we pass - // a valid value to bindmemfunc(). - bindmemfunc(pParent, static_function_invoker); - } - - // WARNING! Evil hack. We store the function in the 'this' pointer! - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; - m_pthis = horrible_cast(function_to_bind); - // MSVC, SunC++ and DMC accept the following (non-standard) code: -// m_pthis = static_cast(static_cast(function_to_bind)); - // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long -// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); - } - // ******** EVIL, EVIL CODE! ******* - // This function will be called with an invalid 'this' pointer!! - // We're just returning the 'this' pointer, converted into - // a function pointer! - inline UnvoidStaticFuncPtr GetStaticFunction() const { - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; - return horrible_cast(this); - } -#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - - // Does the closure contain this static function? - inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ - if (funcptr==0) return empty(); - // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary - // value that is not equal to any valid function pointer. - else return funcptr==reinterpret_cast(GetStaticFunction()); - } -}; - - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 3: -// -// Wrapper classes to ensure type safety -// -//////////////////////////////////////////////////////////////////////////////// - - -// Once we have the member function conversion templates, it's easy to make the -// wrapper classes. So that they will work with as many compilers as possible, -// the classes are of the form -// FastDelegate3 -// They can cope with any combination of parameters. The max number of parameters -// allowed is 8, but it is trivial to increase this limit. -// Note that we need to treat const member functions seperately. -// All this class does is to enforce type safety, and invoke the delegate with -// the correct list of parameters. - -// Because of the weird rule about the class of derived member function pointers, -// you sometimes need to apply a downcast to the 'this' pointer. -// This is the reason for the use of "implicit_cast(pthis)" in the code below. -// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, -// without this trick you'd need to write: -// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); -// but with the trick you can write -// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); - -// RetType is the type the compiler uses in compiling the template. For VC6, -// it cannot be void. DesiredRetType is the real type which is returned from -// all of the functions. It can be void. - -// Implicit conversion to "bool" is achieved using the safe_bool idiom, -// using member data pointers (MDP). This allows "if (dg)..." syntax -// Because some compilers (eg codeplay) don't have a unique value for a zero -// MDP, an extra padding member is added to the SafeBool struct. -// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so -// in that case the static function constructor is not made explicit; this -// allows "if (dg==0) ..." to compile. - -@VARARGS -template<@CLASSARGS, class RetType=detail::DefaultVoid> -class FastDelegate@NUM { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(@FUNCARGS); - typedef RetType (*UnvoidStaticFunctionPtr)(@FUNCARGS); - typedef RetType (detail::GenericClass::*GenericMemFn)(@FUNCARGS); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate@NUM type; - - // Construction and comparison functions - FastDelegate@NUM() { clear(); } - FastDelegate@NUM(const FastDelegate@NUM &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate@NUM &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate@NUM &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate@NUM &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate@NUM &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate@NUM &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate@NUM(Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate@NUM(const Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate@NUM(DesiredRetType (*function_to_bind)(@FUNCARGS) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(@FUNCARGS) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(@FUNCARGS)) { - m_Closure.bindstaticfunc(this, &FastDelegate@NUM::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (@FUNCARGS) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(@INVOKEARGS); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(@FUNCARGS) const { - return (*(m_Closure.GetStaticFunction()))(@INVOKEARGS); } -}; - -@ENDVAR - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 4: -// -// FastDelegate<> class (Original author: Jody Hagins) -// Allows boost::function style syntax like: -// FastDelegate< double (int, long) > -// instead of: -// FastDelegate2< int, long, double > -// -//////////////////////////////////////////////////////////////////////////////// - -#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -// Declare FastDelegate as a class template. It will be specialized -// later for all number of arguments. -template -class FastDelegate; - -@VARARGS -// Specialization to allow use of -// FastDelegate< R ( @SELARGS ) > -// instead of -// FastDelegate@NUM < @SELARGS, R > -template -class FastDelegate< R ( @SELARGS ) > - // Inherit from FastDelegate@NUM so that it can be treated just like a FastDelegate@NUM - : public FastDelegate@NUM < @SELARGS, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate@NUM < @SELARGS, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( @FUNCARGS )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( @FUNCARGS ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( @FUNCARGS )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -@ENDVAR - -#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 5: -// -// MakeDelegate() helper function -// -// MakeDelegate(&x, &X::func) returns a fastdelegate of the type -// necessary for calling x.func() with the correct number of arguments. -// This makes it possible to eliminate many typedefs from user code. -// -//////////////////////////////////////////////////////////////////////////////// - -// Also declare overloads of a MakeDelegate() global function to -// reduce the need for typedefs. -// We need seperate overloads for const and non-const member functions. -// Also, because of the weird rule about the class of derived member function pointers, -// implicit downcasts may need to be applied later to the 'this' pointer. -// That's why two classes (X and Y) appear in the definitions. Y must be implicitly -// castable to X. - -// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. -// GCC 3.2 and later won't compile this unless it's preceded by 'typename', -// but VC6 doesn't allow 'typename' in this context. -// So, I have to use a macro. - -#ifdef FASTDLGT_VC6 -#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type -#else -#define FASTDLGT_RETTYPE RetType -#endif - -@VARARGS -template -FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE> MakeDelegate(Y* x, RetType (X::*func)(@FUNCARGS)) { - return FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE>(x, func); -} - -template -FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE> MakeDelegate(Y* x, RetType (X::*func)(@FUNCARGS) const) { - return FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE>(x, func); -} - -template <@CLASSARGS, class RetType> -FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE> MakeDelegate(RetType (*func)(@FUNCARGS)) { - return FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE>(func); -} - -@ENDVAR - - // clean up after ourselves... -#undef FASTDLGT_RETTYPE - -} // namespace fastdelegate - -#endif // !defined(FASTDELEGATE_H) diff --git a/sourcehook/generate/generate b/sourcehook/generate/generate deleted file mode 100755 index f537ff3..0000000 --- a/sourcehook/generate/generate +++ /dev/null @@ -1,7 +0,0 @@ -#/bin/sh - -./shworker.bin iter sourcehook.hxx sourcehook.h $1 -./shworker.bin iter sh_memfuncinfo.hxx sh_memfuncinfo.h $1 -./shworker.bin hopter FastDelegate.hxx FastDelegate.h $1 - -cp *.h .. diff --git a/sourcehook/generate/generate.bat b/sourcehook/generate/generate.bat deleted file mode 100644 index 53c863a..0000000 --- a/sourcehook/generate/generate.bat +++ /dev/null @@ -1,10 +0,0 @@ -:: Generates everything -:: Usage: -:: generate.bat - - -shworker iter sourcehook.hxx sourcehook.h %1 -shworker iter sh_memfuncinfo.hxx sh_memfuncinfo.h %1 -shworker hopter FastDelegate.hxx FastDelegate.h %1 - -copy *.h .. \ No newline at end of file diff --git a/sourcehook/generate/sh_memfuncinfo.h b/sourcehook/generate/sh_memfuncinfo.h deleted file mode 100644 index fbfddab..0000000 --- a/sourcehook/generate/sh_memfuncinfo.h +++ /dev/null @@ -1,912 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** - * @brief This file provides a way for getting information about a member function. - * @file sh_memfuncinfo.h - */ - -#ifndef __SHINT_MEMFUNC_INFO_H__ -#define __SHINT_MEMFUNC_INFO_H__ - -namespace SourceHook -{ - - // Don Clugston: - // implicit_cast< > - // I believe this was originally going to be in the C++ standard but - // was left out by accident. It's even milder than static_cast. - // I use it instead of static_cast<> to emphasize that I'm not doing - // anything nasty. - // Usage is identical to static_cast<> - template - inline OutputClass implicit_cast(InputClass input){ - return input; - } - - - struct MemFuncInfo - { - bool isVirtual; // Is the function virtual? - int thisptroffs; // The this pointer the function expects to be called with - // If -1, you need to call the GetFuncInfo_GetThisPtr function - int vtblindex; // The function's index in the vtable (0-based, 1=second entry, 2=third entry, ...) - int vtbloffs; // The vtable pointer - }; - - // Ideas by Don Clugston. - // Check out his excellent paper: http://www.codeproject.com/cpp/FastDelegate.asp - - template struct MFI_Impl - { - template static inline void GetFuncInfo(MFP *mfp, MemFuncInfo &out) - { - static char weird_memfunc_pointer_exclamation_mark_arrow_error[N-1000]; - } - }; - -# if SH_COMP == SH_COMP_GCC - - template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16 - { - struct GCC_MemFunPtr - { - union - { - void *funcadr; // always even - intptr_t vtable_index_plus1; // = vindex+1, always odd - }; - intptr_t delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - GCC_MemFunPtr *mfp_detail = (GCC_MemFunPtr*)&mfp; - out.thisptroffs = mfp_detail->delta; - if (mfp_detail->vtable_index_plus1 & 1) - { - out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE; - out.vtbloffs = 0; - out.isVirtual = true; - } - else - out.isVirtual = false; - } - }; - -# elif SH_COMP == SH_COMP_MSVC - - namespace - { - int MFI_GetVtblOffset(void *mfp) - { - unsigned char *addr = (unsigned char*)mfp; - if (*addr == 0xE9) // Jmp - { - // May or may not be! - // Check where it'd jump - addr += 5 /*size of the instruction*/ + *(unsigned long*)(addr + 1); - } - - // Check whether it's a virtual function call - // They look like this: - // 004125A0 8B 01 mov eax,dword ptr [ecx] - // 004125A2 FF 60 04 jmp dword ptr [eax+4] - // ==OR== - // 00411B80 8B 01 mov eax,dword ptr [ecx] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // However, for vararg functions, they look like this: - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] - // ==OR== - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // With varargs, the this pointer is passed as if it was the first argument - - bool ok = false; - if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && - addr[4] == 0x8B && addr[5] == 0x00) - { - addr += 6; - ok = true; - } - else if (addr[0] == 0x8B && addr[1] == 0x01) - { - addr += 2; - ok = true; - } - if (!ok) - return -1; - - if (*addr++ == 0xFF) - { - if (*addr == 0x60) - { - return *++addr / 4; - } - else if (*addr == 0xA0) - { - return *((unsigned int*)++addr) / 4; - } - else if (*addr == 0x20) - return 0; - else - return -1; - } - return -1; - } - } - - template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = 0; - out.vtbloffs = 0; - } - }; - - template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones! - { - struct MSVC_MemFunPtr2 - { - void *funcadr; - int delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = reinterpret_cast(&mfp)->delta; - out.vtbloffs = 0; - } - }; - - // By Don Clugston, adapted - template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG - { - class __single_inheritance GenericClass; - class GenericClass {}; - - struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance - }; - - struct GenericVirtualClass : virtual public GenericClass - { - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } - }; - - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - // This pointer - /* - union { - MFP func; - GenericClass* (T::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = mfp; - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(mfp)==sizeof(u.s) - && sizeof(mfp)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - out.thisptroffs = (reinterpret_cast(NULL)->*u.ProbeFunc)(); - */ - out.thisptroffs = -1; - out.vtbloffs = 0; - } - }; - - // Don: Nasty hack for Microsoft and Intel (IA32 and Itanium) - // unknown_inheritance classes go here - // This is probably the ugliest bit of code I've ever written. Look at the casts! - // There is a compiler bug in MSVC6 which prevents it from using this code. - template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - MFP func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - void *m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(u.func)==sizeof(u.s)? 1 : -1]; - u.func = mfp; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - /* - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - int * vtable = *reinterpret_cast( - reinterpret_cast(thisptr) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - out.thisptr = reinterpret_cast( - reinterpret_cast(thisptr) + u.s.delta + virtual_delta); - */ - out.vtbloffs = u.s.vtordisp; - out.thisptroffs = -1; - } - else - { - out.vtbloffs = out.vtblindex < 0 ? 0 : u.s.delta; - out.thisptroffs = u.s.delta; - } - }; - }; -# else -# error Unsupported compiler -# endif - - // This version does not take a this pointer - // Useful for hookdecls, as they ensure that mfp is correct through a static_cast - template inline void GetFuncInfo(X mfp, MemFuncInfo &out) - { - MFI_Impl::GetFuncInfo(mfp, out); - } - - // Versions which do take a this - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(), MemFuncInfo &out) - { - RetType(Y::*mfp2)() = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)() const, MemFuncInfo &out) - { - RetType(Y::*mfp2)() const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - // GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - -#endif - -} - -#endif diff --git a/sourcehook/generate/sh_memfuncinfo.hxx b/sourcehook/generate/sh_memfuncinfo.hxx deleted file mode 100644 index 5ed37ab..0000000 --- a/sourcehook/generate/sh_memfuncinfo.hxx +++ /dev/null @@ -1,332 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** - * @brief This file provides a way for getting information about a member function. - * @file sh_memfuncinfo.h - */ - -#ifndef __SHINT_MEMFUNC_INFO_H__ -#define __SHINT_MEMFUNC_INFO_H__ - -namespace SourceHook -{ - - // Don Clugston: - // implicit_cast< > - // I believe this was originally going to be in the C++ standard but - // was left out by accident. It's even milder than static_cast. - // I use it instead of static_cast<> to emphasize that I'm not doing - // anything nasty. - // Usage is identical to static_cast<> - template - inline OutputClass implicit_cast(InputClass input){ - return input; - } - - - struct MemFuncInfo - { - bool isVirtual; // Is the function virtual? - int thisptroffs; // The this pointer the function expects to be called with - // If -1, you need to call the GetFuncInfo_GetThisPtr function - int vtblindex; // The function's index in the vtable (0-based, 1=second entry, 2=third entry, ...) - int vtbloffs; // The vtable pointer - }; - - // Ideas by Don Clugston. - // Check out his excellent paper: http://www.codeproject.com/cpp/FastDelegate.asp - - template struct MFI_Impl - { - template static inline void GetFuncInfo(MFP *mfp, MemFuncInfo &out) - { - static char weird_memfunc_pointer_exclamation_mark_arrow_error[N-1000]; - } - }; - -# if SH_COMP == SH_COMP_GCC - - template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16 - { - struct GCC_MemFunPtr - { - union - { - void *funcadr; // always even - intptr_t vtable_index_plus1; // = vindex+1, always odd - }; - intptr_t delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - GCC_MemFunPtr *mfp_detail = (GCC_MemFunPtr*)&mfp; - out.thisptroffs = mfp_detail->delta; - if (mfp_detail->vtable_index_plus1 & 1) - { - out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE; - out.vtbloffs = 0; - out.isVirtual = true; - } - else - out.isVirtual = false; - } - }; - -# elif SH_COMP == SH_COMP_MSVC - - namespace - { - int MFI_GetVtblOffset(void *mfp) - { - unsigned char *addr = (unsigned char*)mfp; - if (*addr == 0xE9) // Jmp - { - // May or may not be! - // Check where it'd jump - addr += 5 /*size of the instruction*/ + *(unsigned long*)(addr + 1); - } - - // Check whether it's a virtual function call - // They look like this: - // 004125A0 8B 01 mov eax,dword ptr [ecx] - // 004125A2 FF 60 04 jmp dword ptr [eax+4] - // ==OR== - // 00411B80 8B 01 mov eax,dword ptr [ecx] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // However, for vararg functions, they look like this: - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] - // ==OR== - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // With varargs, the this pointer is passed as if it was the first argument - - bool ok = false; - if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && - addr[4] == 0x8B && addr[5] == 0x00) - { - addr += 6; - ok = true; - } - else if (addr[0] == 0x8B && addr[1] == 0x01) - { - addr += 2; - ok = true; - } - if (!ok) - return -1; - - if (*addr++ == 0xFF) - { - if (*addr == 0x60) - { - return *++addr / 4; - } - else if (*addr == 0xA0) - { - return *((unsigned int*)++addr) / 4; - } - else if (*addr == 0x20) - return 0; - else - return -1; - } - return -1; - } - } - - template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = 0; - out.vtbloffs = 0; - } - }; - - template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones! - { - struct MSVC_MemFunPtr2 - { - void *funcadr; - int delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = reinterpret_cast(&mfp)->delta; - out.vtbloffs = 0; - } - }; - - // By Don Clugston, adapted - template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG - { - class __single_inheritance GenericClass; - class GenericClass {}; - - struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance - }; - - struct GenericVirtualClass : virtual public GenericClass - { - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } - }; - - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - // This pointer - /* - union { - MFP func; - GenericClass* (T::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = mfp; - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(mfp)==sizeof(u.s) - && sizeof(mfp)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - out.thisptroffs = (reinterpret_cast(NULL)->*u.ProbeFunc)(); - */ - out.thisptroffs = -1; - out.vtbloffs = 0; - } - }; - - // Don: Nasty hack for Microsoft and Intel (IA32 and Itanium) - // unknown_inheritance classes go here - // This is probably the ugliest bit of code I've ever written. Look at the casts! - // There is a compiler bug in MSVC6 which prevents it from using this code. - template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - MFP func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - void *m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(u.func)==sizeof(u.s)? 1 : -1]; - u.func = mfp; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - /* - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - int * vtable = *reinterpret_cast( - reinterpret_cast(thisptr) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - out.thisptr = reinterpret_cast( - reinterpret_cast(thisptr) + u.s.delta + virtual_delta); - */ - out.vtbloffs = u.s.vtordisp; - out.thisptroffs = -1; - } - else - { - out.vtbloffs = out.vtblindex < 0 ? 0 : u.s.delta; - out.thisptroffs = u.s.delta; - } - }; - }; -# else -# error Unsupported compiler -# endif - - // This version does not take a this pointer - // Useful for hookdecls, as they ensure that mfp is correct through a static_cast - template inline void GetFuncInfo(X mfp, MemFuncInfo &out) - { - MFI_Impl::GetFuncInfo(mfp, out); - } - - // Versions which do take a this -@[$1,0,$a: - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]), MemFuncInfo &out) - { - RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } -@] - - // GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 - -@[$1,0,$a: - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - -@] - -#endif - -} - -#endif diff --git a/sourcehook/generate/shworker.bin b/sourcehook/generate/shworker.bin deleted file mode 100755 index 63b8d5233837bf9393b75edd185a1b67c49a2c0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59291 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 gc`~ch(jOWgiqQg>v#c2F#rGn diff --git a/sourcehook/generate/shworker.exe b/sourcehook/generate/shworker.exe deleted file mode 100644 index a251da14479b56dd75dd15f925de69e066c036c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352256 zcmeFa33yZ0+BTfhA^{2wQluzg5fHSfD5zi=$`GhZH7$cEC?JCc5tO!o10sefA#B8< zii(1WBdB!-1uTQK2p&;UK~byXag|g>_q0% zUdg&_i7nn{vnAkvWu?uw7JvCKL&E5RLUGd*Uu$Z6so~r0*2WEayWOzd$$6>Q&X|7H zjB(ebjvqH|+VuR?D<`JTD43Qyd0Ohgi-)FOGkwCu)0;GD)WHOuv$f+h$31r8Ve5bW zXHGhtjCAv-1|GJ_-?YO`Z&n2u# z%3V&IZAe^w+t%ij23lohwxqbmaSa;TmVo;*oqN~m^=vi=;`~o3m~qO7|E#~ZB@N6v zHj$qsqzwZ38~mdi-qOIMaS4$N3Ri9S~{te7qr@L!QT}@sURUz%Q#(E zv-N`9ZCxR&uK1f;pT)s{88%z->63NErHzmc83|5T^?JcZM*loyr z#*Lsy5t7YW<)Wo1y*~v2CiF*g?k8yRz@LasoPwY@9YJ~y@@C$T7X2PL`^7s#tcXM|Hd#53J65*YJ&4%(D3XrV-1A-MBQM%(y z1S?qDZx3RvUq+RZTM+w^pp5!RmR^dOn+&$4Anrd4rH8&lFufSTYwJP5n^z*{I1a(6 zml15c20=4IX`PAScD6k!fY>tu#MDy=?tT!-i%J2{dmNAt^dt62SHuqdiP9ENq15p) zf=`}C!EyH@Xhtj9_b_7Lj6{`VOHg`w9%A;b$Q%DHN~hV8_td2bl1aw$pAj4wg<#@z z)LTOH*+E2;_9B)&9>Mw>ki0#c@URtCzM%+Ep1co1w_N1iyaajPUl7Z`9hH|KK*4JR z5i9JCAfpJugGmSmjYh$y_Yj-?f@ly(T(Q<94}BetES4Z9EZ+K}G| zI-$VR3VFq+BN&wgP>(M_-t)I3_~SF=4fY^-frh?;c2(LIvAZh}+?#9)VzQ zKLiPsP~X;wy;g{rhg6My49N#q0q8~oeS~7_^(B(8jzMtJFeK+JN4*8KoB>}VX!{Wg z8g574s`&`sFsR?_koQ}L2;O7=eR~=T)>69TE0Fwb z4T7F`1IqsXi1qD&(x=}<>6>36wq!SAt8YbcGIl=8<32%b8Led2qex!48iCOlLGFpD z{M8`@R~&=V?Rm(%=TRi*QYjxdMeIH@=r{?n6Mg`;SH4G(-2i!sMW}pkA_|(a%0n3_ z7`Y$G_B{|>(G$T_w9^h`ddyphT}BGNZirwPAvY$_ZFB{3Z4g`E7*Gc1AXcv(f(;}s z@igRp^*myqQG-371CD{jkwowPTNjkRNpe$Z**jJuc!k}$*$h-3!e*~hoVU^l|9l9s zC+SAqi;?V8f#mfM0p2PCc;{W@jU=`#1_x=`{#gj_9f5)`9zigO1)Vr_IEdFc20`b} zC>VM>f}832*R>#hYtiiDZb;rhA$~9$!L?(NT>Tb;L7$=WyH6tM@&gJ=dZNV(^AR)H z%Tmrk&}{(nzRN|G-b8fhW8{sYdTzJ^0M4dK9b{*Ew;__}e2-+aNr;W6$Nc6#B>U5z z+nh#htnwlOJlhAs`PZV#O=$qS{C5=mb~%FjBav53=P}BTSQOk^ zh`h^>164ilMqW3H?%@+qrIiA#}h^_1E`^7egW#2S5$(wFHhQ#ovpdL6;f zf1tEoXCNB#AWH9>1}H1PN9?q>QMzXeV$CxUyNGW1d=E;y)2p1Ajb^=0L9_a!P^F0d z?MBW}j=2QEIQqn$pCfi3UEd2N?c46i>oE~Y_jO2K!7-&3N!!m6`@~_0{q{4eyv)JB zE0L$s{ZIM`u^%|;SpPIiKVm<6;a^Dp`7H_-+=b+etnw@e*XubEng2eLW2PW>nGcA* zrs9h^{@&OCl_$}S%%cO{NhkP(7eP({$=*v4vvcU^HW*b-r(Mxe2jL&O_d@SEB7RtTKBY3fhlB@(LSD_i`Y8i9KNXNhmm; zHnffu+`<-De}&`?OrCiRO80R9Kby%Px1gX6!DsG6y#Y5Ob_EOWC(~Q~sQetg;{nd$ z-t2~;nAkp{E?;4{%BC|~wgL67dJcIjsrW2<{*{C>v>OUGrXaXJemwk=o z2OUtQh!*BQ1;L;!1n(Y?V9f`BGMMw6FP}iL;Vk5-4QR225!>G`{V-Z}y z&OY%W1jR2Q`QUH_KVO98BYn}f3#V_hRw8(T!^wtiC|yer(v7mZVklw{lH3W;qF_14 zsDHCN52x~OnT#s0v)Kst{Wd3~Uh8MkVlX9sEA6lMEL0guBHt&G57T>l;}8t|9l`gs z$+s4x-ozAC8M_+E)ej)K?KLzzld`YKNAL|NHk`lyCv%VK?YmW1kQQ^!9&~7Y^?(YdEX)VF#Y(Y zqY&Fl7yb?ow#qLXgIN6=P^BxU=QonvpVuIEC;dwzX?~Tns$8=FDSNGWfe_wfKEzvk5R+MfW*KLN=R9O%!aGaADAU&(kR&pH=v=g^9mE=KGp zcEsa|qu~ftNno#dgLePGMTot8E@H)3<$y*tkvzdNl)%mYiuVBerj!L}`x; z5WN2!04%-(K{auwLM}D=;3}`ir|^o z5ad$!FD4-Pj$Q3~%3wa#vxUtbpaT9=iDbrZ#5&YN>7X(svo|8>LM~sOhTxF2!N9ioQ{=VkfgpJ`l5;s-eL5S#V;uKwlTdK=ok-54dB<_WH~MY__w7OQ)*BH# zGatzX%p1?x;&ljGEkLmKMU*Ceis0#NKrZ+du@wyve8OJ)04cccHzb!)-Is8bT)7X) zPuTi3Fq+u@k95Mey`?8n)wg^EX$sNloKb(ZNCm)BrFK$Axh}L;K^?Mhc z$A(paH~V_T+S8EwyoluW|3;Pl0*^NSu@k}B^y5X>qI3sA&7=>z?tA1dB1a#wr<|0F zJmXYU$;?6QYvNs;jHH(?GJ*Yk?x(2t8b`GcD8D5fyLV&&z-=76<32-P#UTV&aTfF* zj>XHLxdsIbDE6;DL2NMHCQ^QTlb!Z;1O!!5B9-J zsLL5N(PwDwcG}u_&ci-?15nm|hrHx2$V)mM$@Az-I&wnVm7ewW5(LMvOFl9f!A;am zgE^@3LQe#L{)9krBK#BcuAm#a{s3b0|3GjDnSOxX)N?5cT%6ISyAj;>BoN)nd0p!c zD0r3AkNzCquUU^|=Vqu9KL*Lgq`BuWNcL(6a>o$cTfZQ$K27wNHV7`f3BfTN(Cqmf z1nVC|Fsl@K{plOIAzBMSu&vP(YR4Z*w) zC`hCb8(fU!S!sxEcn5iV9z(Ku9|ZH+Z0~!>OJ0s3iS~DV9D>Kl(Jgd5X+I#DOO@S8 zSGtqE@m!8pXHjpTl9oUp#NOvPxcGAA| z(d^v|khh4F_mZEHy!A?yo<XOPEwKh{I631^H8I0O!*R`;`D6oajFTAz zA4cg9-y%7BJCdDxA-R&{;HT+`&0deZEqxLD>|9i7NO5*AK~T8?!SOSY_of?xg9Fv? zmm}}rB=?K92u5?k_G&W}eEATPZ+igcNfH!KEgW_s?-Widceh2}b0qS-Vg&!mM2myu z?f2i29JC3v#I;7=)T@#A4IR{#3=EF!ojH*kPl4UM1(h$Q-yK$p$|v4~;A1Ze3h7FV zxb#>}nvW?(@HJ7k=4|+*76?vqquJ#g4HP}dqg)t&cM_75-$6n0$B6Z%tUkT~!OI^b z@7^}3awEIn%+|=uW^z$S)cdG2f-hO6cNPlzu%JC>8Et8VJ^w`Bsa-(x7?N=r=ZP(d zsQ6jL(zqu6`5pw%vo9>#jo>4?g1gAVx7VXt54z3fy%D=;DVptl63JD)5sV?{Qw#(J z=b)g7&S*84GXK5-mD|y?4!IezC&nSTl|x(BbTrFthGcWf;8_l6*R%V*MAF9Ggo5Mm zMnMbCmX;_4H`2^rq36GI4PrZs5Nq%u>ixJ1u?_1Hu)?uv|(Cwl+sW(mTjI zwG)!V>F|nIAn89A!M)cZFPp~Di+$!@LV1BZy_c^*K`FZkI31u5LuJ&tN0>_BgLZwmJW> zv1RF3D013!d~dsq7H417-=y6600kSpX=OaF2VqU@2{J*^&4|&Y1*a?_mJ=@sOoxJ1l(c=A5Z&m>Gf~|nsv!ApF zgg~|cfd{`30yihrO2-kvKk#8S_)Go~_@MpuvdYR(!q3%!w^TDuZ67y`t!^LoMy7pK z{0B0+wO&w0umng$)Z6QW%1Wp@&d4fKU3I*kk+n#5(D8V~$c2Da3!O|bjDbuZqm%Uw zBbCWtpk@F$#^>zp%H8$CAVSVo2j77?ZB2B~>1->wIQJdNE>iD-4>Peyy%|hsG%r`B z1@L24X~A2FbU99eZMi#5aBkKpmc$}8lZmxVXmFF5ep1rXd<4_0BrV_vA#E6c90m*B zH46<&JO`14sBHcupTyn8abAh&WV*9+(jB;yV$(@i?lOT#Ald5Ae+kQmhe`CZBDI(% zBF$YsgP^l>7qLMhYvib%(!ddHut;5A)gbql5YQ{bL2CxPhE$#!Qn?_avTz@d%H^G* zFRIF9`@rXr$OLI={~2P~0!M&iI~{{zFe}^0N>m^3vsy{5m(WVoI!$VMZ zGXOz#fMl+Kyj_EAsI$~KfYfvetQ;iEarelUJ5Ye-6WGZbSYs1G!Y{}> zR_7(=_KoXX7 zjYGOgQ=^c$b9^3VfPpfkvego+$w4+LWauqqHv zP!n}B(J+Mk5jxpew^xI85*iaB^guF9_MIt)#$Xw!9l5PV3`3ar%ZHNJ%RB(9$s2T)Bd%1yw(y{^NPNwk0e+UZZXmiF&G_{sBDKhWhv*Y623} zzwZ&$tqgeOFR+(Dym6N&l{LH#=nkwbivZ3^rA3_6mO>g~-)II@!)Jg!IKanF>N#Iv2^@wZd6|>5=bA zWUe&q7HlXLo3P|}U2r>W|$87RzARAX({(>Z881SHl|qD9fkFxXr@qKyeO3#z-2%v~g?*Rc3%jrx>G z)C&Z4|0t+W4WcF>K|MsHKE*KD+!_{vT2Qql>YD`hAr>FpC0wTk`wW>!ciknZOCYk^ zxb6}}O+bSBUEKlG41>+pYHj*JEvS|unR~6E?)5v03pDD}B2lNHFh>oEg8K9zY623} zBQ)yM41>*8*C1*^)sCnq253=}tjrXiDygLPN z`zUz31@RJ!;5|*_Jqu2VfExty3Z4Lf<#rdmJ^n!PyO=6MP~9yZWi5hjB%>rpt%js( zGwS*$n-k}loGz>OZlY`bMcrGK}KoN)e?th}Vo5q_ShS!0T9MvQW z-d;hxgd%ubYP{)&!RG1*Z6x4V@O+76t`fXAvH10!VimoE+9`rnj1;_u5O;0-_6g!8 z6v4Y(`+(kt!RG4vAYQ>Ug?RS}-mNSipz-z%!@EN8wuyo_BZ!w!1aBvex36Kaxrz(o z6+AxzSZ=A{RV?1IL-_5d<;*OxiZ6Aigp{P#dbHwH?Gn^>ag#v}*hXR4_3T-O$fc-* zq_s5m>ZG-BzCkCgW%boMDJ$+VIxZ{mp*k)r^udT@!49V_xO*U}H)A%B!Dh_jk{UK+ zlCki|UPl5{&dnG*<{59HGHgpWW2TJlZ!0q6V-R0t#z!E|!GRk#7b4Di9pn8F=TwjJ z9*A@4%6NCg$ur}pBAz#K>bMzK<>k+?@&EYg*IYABB2&lZ7C0GDZ#j6GdwIn9lJUgFF%X!z`hUv}ZGOCNjOwGGwLK-;G_Q{H{EnA!l?d)}s z3}zWqkQwhRlNJ@+g?3i>AN4sagkur}j@xb5>afQ?YQ|!}AohJ2Qt0`^tEGaedgq7{ z-bGu(;awF49?rW)jEg+aSi2_~M)ll!)2Leep@(zo2lasI*rQ`d47TNFyf{dXz0^kZ zaLmmhHuszgTfqqwc5Vlhs&Bv>O4ee38J}q(%uSU>4wv#;jmq3}%A}FQZ1h5Cqm5_; zRk(5&G>3^At_n;T)%UN;%-B<0P`@1C?AfN+bCUtr@UYmW9tX#mID3kdJeeppj4sGl zufHzSJ24z*g)cMF{e>gHd+s6Fhw3XR6G}WCz$}`;!t^{)H$9Cal(O>EYoce2re{in zT*W<0lZ+EBG79SXdzqPr(G?ifo9I!PyT<8cwn^a**dcO3uvB^#GtTmC^nwykDi|Q) zJSt&aj!GEO$@KbE$lMEb%9XnhRQR&WvQ-oC3`v;z?uypFo!-ZWfdZqDGRaYXRPcJJ zV)h@^`!&|@;J-hDe^BC2F-CQr9RHGxntgkPRGHzMYj*T8wz|Keh;V^>ygD&gr zdE$%JXvmL=h8X-Q@Wm1L6~Gtjqnm34)qS+Z8~?@t-{N5~Iz}k`7daoOONd7Rzuybt z@Q41x@Rz<64*#c3{|xg<80R+eB}VfIvB(R$-h^2}s4hBb*wu9% z3p{7Qmyrx;HTBF`+GEOc8gzx(jh?@B0CAYe1k_E~4+*7m9z6mqCd&LI7JPq`-YR`* z|L_L-Y$%nVu;12Z*D=r+3IEcFetBb^@T2=%P7yailIhOGJUhkQgdH83Pa-qTnTRP4 zZuO))EAns!!y&0ay3=0JQ4@yAWPDbI%q@3dN$FIo<$OAvRdRnRpDZ?nx>$TGs`FJczN8P)7VT~gGz$iG;RN5+PXN(@I` ztA-=qX5#w6H{6b`SUvKKYS{wgk4@83y_*Da#-Lvrd`^Kgac@oFd|gC&3LJc>5#5Vv zQmsZ5#Afil3=aVW+)pbF)qhlXAQA40!*6%6;G928J5fDak3p&wsna(b41 zMiXC_L(PCp(w)iLls3bJba`5qJv}Qi51M6dq`X;)tUdtM)11j-Ru$>a6dGBD*O?;5 zmF7%=<@mCb(}pLeZ=NOA`JZR1Kqd;DG7U36D&PGKlVwvt?T66gop#FtKd_Q1F4fJl!xXf3s7ItISs*>DtGQI*6|vRwdt`c?g8nlL zpxGdxyde$dSPec~YZ^CKZ2>h==UeDUSV^FNN!KjLhy36m8QqPbb+gm0di0I~b)uC- zvpE(5O+tfDPg6$69n35^k>qG&XGpjDKN~#)|21FwePU?8&w!Of3^nw7 zi{Tjhzk80uR?wWCE-NuTGa0?qnOMF?tjo+waxXQL?D^=T6~5t)^x+jrx8EZ94!6RL zvm&jOB{1o3&&#mjb?){b58Fs{?#9|LSYddXdvlz3IJ!CSVPfPNz8hEFw92ua!IgD> zn)clArNhf|)Vtbnv2<=m@Vjw5ft6xfsc)0Nf&XFgG@-_EDysieBg_%#=LGatbeT~7 zh|{WDKgEz@E&iT;#gVkJnam{{qukf==%M0UKSB_`hkqjTtgo~!2$d{eqEo3D>2QGJUg4e^8 zPeRZXMRFRo;ER5r*f95VS3NGw3#aCN;uTzy);4t%1Tnw|;k8qGB<*Wj-b(xE_JJvl zx*RGC&M%)~|3YRaGU3gwq2FN+{SI1B6E3>bIIVE#VgK-Buo-xonZsC|iDAb9`@;Bc znojX^oLv@siu1dfeP30;+O4tVSHz*u_igt(!!7CgajNbx0X0CVwx^Y{>qrk7jbYB;o6{QIH?}`(HR`Cd^z^Y28oJaaC=^C@ z-K){oV$?LSzRdcIU8&0c>d?RF3-d!gC47#(SF$j9t2QMRhmjd9$7mtb;qz99&D7F# z(xnzzs??K88CuMx!yGLCEpAP z9fGy`9cXGRXav&+&|>t3ZpEPBgyLWJh?Gb(CT@#S@OM-g3;*UQ_CMwSW&Jk=&fi*; znSJw7*mj+)3P1a_JzzZR083kkw>iVcGsv?!^a($Uql&m$iP-T+HSYLxRI9+`%PTq9 z?MJ>yn-C%GR82zk`613zuB~>Sl06TrV{4b!PO8oerE20qZtY^QJ zS4s+n7_Rpq*G{%6RgCo|tQ{a~@7i;3lt{YDb{R!u> zuxCt0Dr_?wbF)IajlWSc%OA|DpTZy(+7>u> zByDu=a0gQJPu7u!`E7KhaelInG|F$RBTe$_`628wIxASFXPuV)vMJ_)^Y``dB@a%~>d3A@S$pJpdD47OHJgGYU6_xf!(v@2Xu!=YVwND%$5 zG5DeI+2gmM@@^PI0^;u=K4WtJU%CcBP5h;QTHl*$(Dz77-^;+?Iy@L_>05fobn!t6 zhUX=eio(8v1YCykB+??I`yK$BrD_2@rdC}NrWWevCn_t?DlT6Q;INyKrrpe4E_TB% zk>tVioMI`HsrNwK%pM%l?dp>I0cfMm9XO-lWDfgw<*dp{hBIu$ynV1D^ESdDraPEG zdTJoYRyFCQf!M5^Qw!jmbBCD}m4j?|aXlEbxqTjI7{wNAo#BeTo)t*?3K@C}DI?2F zJWOaC23tWhVQb|E`xFD6c~M+Bp0I?oslef&HX{+-Td?jLq0?Y|7W725^WhNaVuT$5 z-P%;AU31(NyPj1AQpolS6p+S)W1m5S1@-lzAlX{ICxk`}AQM0d47opL>B-_?9J|uBfAQDgU+`YK9#8n)>AHT9 zlR2JP>rg|!^j6Kqb`PPFuaKd)kPWQPCSR?p`<5bKK5GqjH?iIx_n?*JM_4d^DT8Xc zWz`We1FO{hG`=$O{?ELSkG{pq!aw@vkO=$mVs?tZi84`>j7%)JD%_ir)hna&% z^)4yPs_^zpM5s=JT20ObK-kCaris1usPJ-xyIP_4h53J^f${#BTtvdXp!t77M`9~H zW(v4B+12W0*6u;0wKj;f{A1}&=KXlHQY#SeD^-`H&m?Wcu?<%dsrknsY>2B!j|x!S zgE@Ggm@5%2WS++GCEPP`mSi}P7lHk4w9p$K!_C^i7Rnfb?S2bb{&{Ha%XD15y%DxR zycamkn(yeENcplI#z4m|#Jv5i(kw{df7e>P)NS)Og2esx@np5Rv@!dElZ)Ee`@vsz zXriCG*V`-60ZcvR<0u9kC+c;wTec|E@*C^OY58saJ*K3ASv40T;@_*#lz(qThxfle z`jx8t%3roLzNH{m6Pc2fIDCCfa>}?k!ADB z7oNGhj~$HBGZp#SsucDpRGLa!LDP$EVPGmq=!?ES$z3ILgn;Ty%1l3Rt`N@92y36T z#{i%FYgb|JyGC2r#AqM$?h4vR()?R=Pl~XSj`>5hjht#3%Na11OQxJkCFG#H@NZAR z;os|E82)FcoWb}xW?37vYy!p||6Nl$vg~-XEY2*O36YiOL06%+^xMOtrP_rSrSk~? zRXYVK03E(l!1p$EcVL-&1H;bwP3K939XvnP-*-x95_=6t3;cZvGuJ7nFg6M~`dFfv z2l?=M$*K}8<+33woW}~5S$??~?Q1g2GXYQ-CZQO18vb>Lh2Mh!gQZw)=jocx1gHqq zaJ&(^r`|2xk%e-0Zxof8McFKJmc?@|nhg2i8##oS&`86kU|6UpT2Ox>^c!>6kDcCO zCQ%l>>$S;{-kuTkKEfiN>(xl_70^j2y$`}E{1@n5#W`Szd=sna^_oSNe1D+7a+W1M zS2MxSK>VQuAAq-wmEhRrdx%{zgx=94N^5wpS!B`MPt$w8%#TbVP6AO_uI5|b z;H!neVtIp<=2e4Kds>GU{8*T(Pd`y)j#%Guz7r#Dbc;e?9plwjbG({OzQf0>xpkq7 z0X}$9zgiy790xnq1~)c%?DXC5Fs;l4xtsp1PRWGAum1cJmuSa=)Sk}784YBm?9btk(VOsC*n#2eUm^ zcIN^C(o~muakF7IT&wgRldnJM-0I}3wjogX?Sauqw&qGPNnLjl+_bedC;KD;_!sP) zfHl44p>*1eZN+~B_MMapg$GI zmH!Kb_}!u`{_>X%aT>TM2xQA(zn4JxHIzws_aJN1jG*`zTS-ginweP{!i}~ z)@FrO`C^YLmOU!k;~-FP+T)~0O5uwp!4elXc?+=xS-+Jyx1!wUhn;K{JK2f|j{4_d z=LH$#7C3*M(#UY`f~dFR){ie?p-U};+2LH8xkgq%P7>8Yx?fxvTWdJiqHeOf3-&{! zU8@2pGCUPpU&(4W{4d(ARnNi0==Ea;lMZOiXLA>K4WeZ3Zvcb4DA|fGEfVRCCer)0 zO4lrdN*{oUn<}Lopwi>%<)KoZLA``30jQDjuMppbcq-zbBEHsC?;gZOvops{EtqJV zIc~lT%Kj=JG-1IkJDT^P zA|{c^DuD6X>sf@PuaKd)kT9&>4i6JhnIl`>j*%KLf}1#mpf2XbDtMyMpj&bI*Nts9 z=}BnCea^M0hJDUtbw?EKBs{r7DBKCTVvogT2{cdvhGRjR6hH!=h$M_JoUV{pF28s8f&`uo( zo~Gc7{q<@vT$JpccP_X=-!R2?CC=aJI+YV%(Y@7Sc)FsIII&id_$25IMwJv{T%}^UU|mLC!sk%$<}t68MMn^AzN*i?V#}z&uj>a z^lPIK&~e((fCUdWtXDsB%_{ZE@34a|>#eXQXbJn1r)5}g`z@mKlR4AI$4oFWz7vBQ z%kW1m_z7JjLDw)Dd1yZMMZ_-E3#cGgv&4sb?m)eQvv~F)l&#cr1L~stfxr-{qLWA$=_^jv7?0-m?{R4T@r5ozHlUNr$n~&}I3grPGy#L5b z>OSxT+wpov2U)7d_<1x1?!Lvs_*4i}8{<8Qm3a8>PJ}V$Q(sk#Pejru^~&poGR`M@ zz<3wo2^93Y8TCrl{ge||SjZ1DE|2u!t4rhw;|^VyA|~SlS+|fa;H#K$sfWRjFzy25 z=y5lZ$$Ma)UQZX~h&$GMjXudRk5bailxQcfjZTTg*h(u+H}f|(VN?}JJ=zX&-2&R& zs-C&`;>jmfzN{4W415CAo{MVWK38Z)_ET_A;Qj{;RQkf=HQEiNphNid<6*h>VCVR^ z9+uJIaX1y1`Y@P2j97_>&k#ju63cpQ!x|uiGk=#F#NRE4)TN@MszaW zLs2H(!Ox7%C$7lPj zk3_9Kb+vn0&7N%@!oLWP;OemA3h}Ob9iYa*6T!i<$U18s?!c{PUTw5zs{w%L-kKb$ z;iUP`!F7glG#@|oiJVl>1SotH38a#+ z6Mj8?%8@x1UE&Rhm3a8(6KjST-DRN6Ck5sBVNuXGMSRbni%1-g(lv3=0$+%Nlsk)* zLH~(2h!$=F_jC@eknK|5UX0?dZ{+ttd@a%pTWv_vyh1#bsM`S9U`wd_yj4? z@nI;yxt3KZt|ASmi3w){@`-K@tHHyfDP~T5VI~{hs2lAelcnli{&8SZjAEaM z5U6n0RrM?yc&);{K{Qa%6hjx1=^ke0x768j1#`l(rxOn?B26fFt9X~@0euyuthGoP z4R2DT;Wenu@KQj$Hazf2IO-W_(cf2VnVU^o%TuMtQOoxrR^r)*su5bwM?;?!_>)7F ze>t+tANvWSlXtzFJdI`5fH^hXsF{s52^LuE2nGu*q--rvc|AHFKYgEq_)^5Vex8Up zZJzm;Bc5yKk3gK=h56ZtkDoq4FS!b?39h_kF_wqNq5fyqU{$N>qp_nB_o= znAW`tfaZn#76&9=*kk%lS&8an<<2cv&oNMq2=$v-$Icplt!J{o}u!I!nhJJ49`{}(RWq&wH-x7A+p$>4l!#9SFw;1zF1Y)V}2D;(b9c&W}X62ZT^ z2kgQb60uc`TgCXL1mjxxDfJbKF@(qYJgkkaDPvI+Y4_x8P6&BPa=J#k3P=ezcR>*Q zo|^@`OTA-7w&@7y`3|uX887LjfdUIN!B{j?2m-cBlf*gHh*T}d&s$?g#Cn<(Y0;); zQt-k}6)9O31p}=}x{iR9@radpIHX6A(yXPK16g`gXz7r{$oVMGni=(AG84825yay^E;%v_O<9p+KmK6rgxieRvuZd)hC|HW z0oYf_&|5eRA(~=<6lke)w9YgLHD|6QE%~|%BIVmgm?9AWSloFaL1*4fk&HzaMY8tK zBHR=Y!LShwA&F(PaC1U9hVL-)S>vk~#_QNf@d-FR#$NY4#@Nq6NVTVCD$q^P(}n{g zdm7edw(C)OZ6(gp5&sl%n%`2y_aaW=;Mc@$yAdZT99Q2$oN`D+{7uBk5Xa4|1MX8d}iAq}z6v$YlM=Fx_SSk6!7+;4(Pg^11QyVr%Ik;Q1uXky?; zfR0rKlq`=J$Exch;P2&%@$bM_FGSeK?X^J^dQ;(IWMnKuM_rc*>oZ42d}5U_=Vm>+ zta%v|ec2aZ#hC1iUk|^pHSq{yE;Turz7sKBdt|Wog~8IiV5uWmdRnk_IAVH_{R@zS zp-{dJ4&>TV7k1!M-^)^%9})MKQeHBY2)^ellL-9uR5&mU(D*2vyYxIbkPpAFn#JtI z^4kD9*JeR{CJ%6_v@1h$=%YtFriFLa z#jqs^wAR;OV!;Qd4uC1(!Z!$00neP1nl3WUL{a0{NHM~{&VpZ$9xNRG4j2kq_&e}V z1$-!npEHw-xmQ=iGBFyKD%*>ZpGUOwwD5JI`w8djKbYCo%2fnD-gwsIVP}qq5%0g@ z*L;u*z5?oEGQlsJ?P@3%{1!^{#`LW*pcMXM#`ow|L402^YO-kJJ2qB)b&U7C&&c<3 z^oQ-s*`L7cC9rfn&=NZQJ%agM9Wsqkf4^N*4fw#ifkSOE!kmWWx`23o$ zAuL?`2Yu*9iCq&hTbN;DjP@=>4E%60$KSQnU((wnkTi*oBnJ4fDwpaBKO4!<9TC26 zC6+XlV4eI#x9<|^Pv~+OY^~?4_?UoQH69NHQtB?n5gEH(gvp<1k`VJ_Te0weh=YFR za69-?~O~G z`?M4kw7XNitCwxeVzU1P^E@VL{qK_yM%Rx3AceG+;-s}Sd^ z&1W!{tqgz!S6*i^ao=O|kN_VbxV>izQNvkBfSHN)|J1hN)* zo&CTw z4G}|o$}pq02Rx*G?EW6w=pfUli_kxOh4k?5x8l4KiE#DZsgc^Ir9s)oNPm{y*UXE< zS}gL_rI!P6__gIycHug45orwkYJ1$wg-e7PZZge~2KNfewW-~;6{hyml|fT8XLsE- zO=4;fpo(Q`k0TztsexXMPn~NTpIXCkb+6hDhqi7o%sA@!bS65ixsS~8X(hxc_XTi% zX!+Li)c_&`P}um=U<~~-7yk<}*YFvPsW@@=^rb$7q1RB%{#^#OJ;p^AVCsuN3kR_Nk*g`LjXA+OOY??&KY)Bu?H2(+qL)i)gPNW@@Dk z-3Fyqj;+DTcY#>pDGI3nppzek>Xwtg3i1CnColF}3@yoiOa}M~Js&|A#4R$PEiH~a zbs14Thwg&W;kipWm4X;*@jfy2C-e6Pr1Qd!>nTgzD9idfg%>VjKG!U$h9Q4j>OAnYY#2 z|EvRH4Dk6*QGUuoxp{(5En%pQ*~@_JbU2kzWM6O%37d>EfsX+n<(<*F7QIUQ=;MLt z3p;8CK1BXEIx@7i1FI?Bua<8|zj^|S8L7uzQ!kw~<>CyVK$Qv@E_eK2M10J!Yp#uX z*o}ohNbVxi6+T9+q6etcG-8Cm;?i)<46Y4$Ebut0;Y$)uaqw|*l*jdA8^0|5=v8Nh zEHk)RuoJrZ)99Hype7q^Ib2P*V8WygjFTc4Dp`sejrb8M%Ish<^3QLcYE({)?f)zC zgB=Z{Ug=aT_^G}rJkL%DZ_8zo!W+Q#h4fAe&p;(hc=sb7qwr$pS5Jv!vzI#k8`gy! zG_(?G-bg$$eQJ0igHUZiW8znP!;4_9n6OwtgD!Xnyd>rRclJO3C3@CRbeNt!UxTf6 z(3v5UI>*&#gc|O zA4&|)%sJg%HvsM+I5X$>=eXLz<0kMi>k{6F51^Ld+#xjZfe#>;jgNwk9A+QBn2YeM z5y~E)sjy_1St-9KZc~E?;K4ozhMgI$Ut5&9iB8s1Po)KbDM%nmUEkl_?Sy_C(igszDSD2ULm(JS48L^>Du*Q zhyMe-UuciGUW`r5D`lG~Y~Osch912q#O@C;-gD~F!&F}0RIqFtXGzaFran4k*sFFO6+%97FSua4Qj}C8&6SHj!FPyI7QVnc7+2$ z2LQ=|;FlxF@;+^B@4OFVyMAcU*oYX$_A5NSmI1$}`G}R!oEvP15Z{M5=Z@baKIS4^ z%ltdmC-z30*8JMYZw7#e@yp$N-Cs*UYp{m})Cq7yEK@UvS^c#uliyv){`xvX>973J z6&TrsAu@pBSh_JPc?}}-w+J~b-3h7T=hKm`m#U#JOJdc7eOzpTn3Ir3A3!R7a)P2G z4-nl(tg9$GyY$mzQOWA3Z4v)FlB)7?p|KeIYlDlz`)f;0X7#}}MtG+~-j;JV$Lp=o zMU5^Xl-!ucE7QF`4B^%^-x#G4)$9#GKlW>8SKF_dS5dX7YE2^xKcuX{&yyh+hKKK& zlWqB@qUV&@cJulHpMx5!?v{=wmjLxPr<|~`4X(m-Wef)n_f?^mz}sWrgI*fBnD^s^ z0I(7qy8sL|2`)i>3~=1~H&1Zf+v}m<^8H;YeH?ZOD?JXNQG-B+SLkK?^O_8xh4}F@ zN7%zt<|vs?rv?*r#Js2r(@=OK7JHz-`$PB)lniwIF$_y}J(I0&UerJIv$_WTR1FfH z!Cl0qDtWIfbA>6)fsPfFrn#9$p_PwTWtqVZCo|`HOnM?jWG;tOIQ-T$T?=QvhLoni z^smrgV#~z0*A~&vilkREhv8&}iyQSZtcD8B%*9fSP2&8f$o7p26*Vw^hfftCF?4J7f;B_mm z)tY0P52)M-dLF>+t~TKbe+te+kB2Gj3SloT>-Uo!zC#$%Dsvn-aJ>-V^oMQgFlMCs z+}HX^bbaqf#fu8fH(Q&i52YS~`&)8kd>n4YrED-J=-KOGfloqF3(3LI_7#18EIJSE zHo{M_=BLK@&68fK-B|#Tw5QwE^5BGeU0)EQ=a?=ia3*<*dZgydZCf!*!2cLA|M+?gIH8kuwaPq+UyZQ#Brp%)7t2$*~ zY(qGAO9VI864RK22^O!e1=JsC zKiN%PnK}f`KnFm-02@+v`DGO1mD}#bD-Y%-mN%t}oV)cj?%q!^7kT0Q;9P|A zg2K)MdMM1Ci#&`<)?DOi#K&Y!%pdnp3=yH~t`@IT{|lq4KQ{fBfnQVq2N0t|5}j50 zKLwJ}`u`c0K>f>ayqfy2F!j$NM%2#cZ=<41eIvaFN{0UN8&=SRyvapVf&P($BDM*r z)&rpbsi^2uuR-e6;2{>sUU_8>??tSF7tltaE@f1CJD80zgTs#~>B35bE0> zhJBO7+9oGQ1m9U5ejgKlYAu!>1AINNtwoM8wEw%~g&u8c9R0)}V*aFRn13t_E}}+a zJ7e8d=m=F#65bo$#_Ji2BK|%N-gH1LTlvvVftOh1^HDoy%IKS@})hb8o}3vh$LUVa53U}ijfBz^}%T?qopFSN3H*$M`t z%$GSb+u)D!(Sf4ZxKz^&lOq1~OJi7(*C0Rs#;Togz=Y4ku>3GM#v4gomkJqcHH-z$ zj~*$*^iY1{wZeCPraBh%VJmi7#6a?RfnAsPQOVwP=MtldEF&kCm z4~{SjXQK)}E?ugI>MEmA#bw}Lv5~b0IR;-vT1ao1w_?%tt+dTdEHB5h{LVSI%0WhIgPA<&Q8Wg$u{Gp4X+TDF9x~pIg4;t$r9!{=xzQ2le&cvgt{0Mi9uCU-<3iU<>4!2 z=q=<&vmuy%f%^0(v;I!1yVNcYuknG@U?v`b?Snt&nb&>{e=majY8Qr{glsVoosh}NBnl<8^IoI#Lumc3_OeiO`Ie0W2FRs0S$ z0R?h$pmXpp4f17RATa32gWe4t)v#m?6NBI{w(!GOM4Z1Tx{@|>>UQuvvBPff;Sf8i zaPz{=f{P7-t5xl|1b+1SCdd1(;uMqSF91NMbAe7zF^)qC9ODc%10K?v^wHtkL2I_U z!E$f-F0i0Gn|{q473Wg(wEHqA2I8dktYA<`oBUR6lLsFyF0Z%r`Gj&ZhH;Co7M=eW z%wF`0fR(Jrcq{vwU6Y?AHd61QQn}F2cJRmD1!5i)1xLI8t>8W!Eo{@mO`#U{DkK$yHJj_3 z{m`CX-?XMdN8Hb&h>QEkAS{pIzJ$28wWa5Zt;vtFJd9kI>W!%`wC5ikxfD4W1aT>{ z4+dkI2A3kKVwL-QhnNNwTj4(e3rsz?HK(w4OkuxZ?{?y+{oZyNEgBwx*X@mlBg1a^ zZD1YrV|v$Ss8Rt0^sa3X{|A;FqMxdp!D}!Ggx?H?#X??7Ko{l@T^OH_xRzJ$IU=v) znERs0s|oB3@+$8p^AhPln5w)AyDU$&vd}d$w>iIO|MJOn<@+2}Pujr{ILsyEK3cZg zES&?ZXVQe}$_xO}37=$@zXOpF2K$uD>&mE_qy#ugxke_lf&z7j{^_77fhwtyoFmwbnfS06ix;dw@&Rkf}OqI1d7ji;Sx6 z()sY>;8!knzV+ynUwpxUin9BG+6f9rKOgX`ysP6A8^A8v3(>Sh_bjtB1n|^oWdVP0iWg}XVr;R8|L#;j7*!o!SMYI@D9ZjCyh9)0)IMWS zPx=g8iAL^uh~uvebOrdq1V#6yx8he7+2CpM~+I-(-!~R5zfKY7nn`ok>N$(Bu;WLh$PlU;mLVH3ppsyID9`XlXc=bS;eS%0QQgnZu7YuUfhLyAhw=e?H+4=n=wp z8=@{A$mS8F`Q4O`j2SqagjeZL7h+c~D#bcA%Q%RxVh15+SD_}*RTiK-Lvh#@URhGidVEiPuigo18y+`n3P$Id=^9W8n9MKBd#dw+_Q`z@Mm2>Pi8sv`w%D zOLLk48WedF4H=5e6TF$W zd_1j~s4A#l{)U4q!p;=EB?xoTd0LiUyUJJ4FIQLjZua1waON}UJM0H!zW*^JnvnZ#s1Nm9^3u0kiJw4&TRt$A)7gS}e( zT&3P%M~~dMtbj?F#|z6*UgPn?D%g{?jZ|q{6^oOq$X4VvIcEbiE0Sp3K47vVgH7XL}Ax>p)CS6@L@l$ z$Arl5*Z$IZv$D>cC#d#Vaal)&ax@)w-fW&Y)1oTWG4K|sO3#VD7;@sgzv{%;HaKM+jEO`FBjIy=#qtBnmo*LZEf>wAUy&2slLSW|k z^HL6#f62^alZU&Qo9;DXh^;-wZLhssF&$jeJ;mrF3;I#I8fMgf5es~bE9D7lEyRqj z=q`)P=VxYk!NH}v!`RR(buzR|UPV#H(j{ZVua=({M2<5YJX!JD=@#Ztv8=xGaj^jAXqC4sk57C}ofWdt*heVP^nJ;32>vipTW zwzQB}Cf?|P{tNd!a|nwwljGsBv-pjc{ElQm&4V@Ql|@=8&70|j@C{ghysUpmN4fxX z4}FB)hO~!^_6IH=j))yS|0>2*M9v4W4yb8=-XT*DH3ZfG0>o0;1XHiM8e>hCr1dEB zO2%AA&(ABc3A4_LwjuL#Lw;aVW_FLZ2LpUw8`ba%jaPnw6%TA9>C!JBXRGfa63kuo zuXO6ocf2E~zih_yao_;o&Zpv!OKsIvIqQnOCP~Dyr`U8^J)A62om=GDJ0O5R>}oA_O=p9qLAJNy{4SM zhoQ{}ub1GL+R@?*-N9f{X<7F4ti(LJPo45+CCaGXv4k?{G>aRt1x^GdkVqup_K%N?iz!Z3(OCkzN(8|Do(TtKJ`_e7UFjF zrzjLW6j;ul4h8-f=C>iLt}z;u{;{W=n4X!OcRBgm)`>djQ$qT;=G4o`fYfori9hNR zyhl=&?ySgzrI2g0LtY}&5pFCrBcz)IQdwH5Z^=_7~S8!gORodf0v17mcLt$P8{Ozc7*8J97^I$hGKW$+TTSVPa=BQTzUhmPgUz- zV*Q!Ha#+6@>n&}=O#3>Wbg9wsJi?RN^`zhF{^qYfJhekFI6{9OX_TVBs-+UVMdVUR z&R=%5k3*ZW*~R^1}!x8lCb74l;+VwdvrBjK$u$nS&lslED))Thc2|?wXn(>tiMp z(gU`^(*PpO3Y^!nQI(1@pSJba2l80t5C37^0`7uS^VP5&F>uTO(Uzjx%RaEG`xj>U zmFvz$GGue3Z zV-7P0ea_ozF3u)k`4+8b9+5wb{vKNe(ChIxnf#<988ZIzauWG;83vCpWfJ=!H=0V- zKH3MKjz&sICm;-yPn{SG>B4~Mr>^}TtWW59lR~%SPY$~q@ zW9WH-eO4p6E2iEcc^o4Wksp77LoX9I;Wy6sEerCo)l)W0wtBM4(lW7qqq7sR>*DTp zr>&qBUVP+rfH?IqHAt_Ij52S+Ld-I`z2iF{r#2Pc-rFeT{ETe{U*bF?`A+WHu-Ou7 zkC;H8e#MP1;?3JiRw1F=xlH_96A8;fM*NLMp0LYN4s-jU;3iF_3bN{p&>OY$>P5elk1ycTKJ7f zf?Ij+ITf~<=R?18e+hGIecD>#?scmz|9CzI3dO=!Dtrld(io`lzL01z-_ZGL@Nt0q zJhJ(QWd3m)0rw_-{q<424Rjzk)GN@Sc%B<{1fytywauTa380P)kxwx&pugAneIo9k zHI>OSeyXpzM1&SLf!)4yLLIckAb*^HaA#Ki*aEQ3?b-JmF&kXqy8)6)SBF3=uA(NYuaBiMaU&WZuHY^Bhmpo=L&}DMF_&tGkU4DjFU0jzEBOAz zA(hTxC3-HsSN$G2#`i>Rfwz31AT6_ywgTbO=Gq|A%Lw&pcy2r>qF!xiVZu)iv@i)_ zg-Zl2Z{c?|nN>5{#-7c+W_{XpsfqY8*kJh%*(?V;?=-7o#{=*#l@mk~P?d-aJ4v2Z zkTW!kZCHv}L9`efhDwXnU<;6Svk8!76-#rHHJOb%O6_OSm$-NbKYg*-LlhTOAzo8p z73#2^0>fUC7T6Qzn9OSfpFZNL1H_BTY7ujwRAQf;54%2Wop1y1XELLHsX~ z;#32&zd8iP=P(bLrK&i_qyY`@2M+z)QbFrotE*L6?}O~q5Xd($-10XOke%HC;!=-T zpopu|^lv1npTMP_=T})T&j-|AvlhkLh8?9;Ef844Em&w?FG!YH?^ROaAO;gtk@GMO zL^Q&BGgz%kkzaAH2)fTOI~>VwBUOTmEHW>$)S{2jZ(L3OtCVntQn{Jwv2RZ(iS&qAyC^z7VHR*dfKwv5n`ZUdB zCk(KuM;ixkT+;nxtZL8k1#_%KxpDanDpddqhu3w8kGW{#?4!S@SjTMPf4*4e57ECz zGvp_K#T2ij(a;F5g!aYa^LvCmmsA0ZN3lZ<2o}rdWDjUhAs|i%2pZx5LkuxdwUW+2 z*VGX&GwYLZqPV{vD%!L0GtjUiIhw5x59BXJV;o1ybB!`nGQa403}dghzP}|zk;hKh ztX`jW2kwZgdbpp5gUyLtK|n(xj%&Lk7XOKZuY0uG;rmz-N9) zMYPFq-FWUT5ns(wGD3=j!#GLlK+kECLZ~2R5&bs0Wu2sm++yONv+->835FT?olv$@ zHLi#~)KG;8{DVP$=_1$lLNau|XuWV3P!Ga3#0GdjLTuoBT1D9J4PA$URVMl%DN~a~ znYcIAQ+5oVR?!<(9+gGkVkEJOo>zYlE6W z9q;H=sG9*OIGW>|5co5%{?S?a4N}T$o*sDt?3C|7 zfVOx9#AbMwp(-YaMQWOcJd4P)cBhqkvsUF_OfH}d7~}9&nAz|>5UJcxSH6H`r~`je zQ+R=7ResxTo>z(6vNynO3G-bjx&GMzXG#qfx1eHNNX74<-G!3tzu1!1PRPpNYn$ht zh`O7lE_40uw|PE^K)FgvnTrQQmg0~8VE130u|T@@@L_zC7Ge7H^-?K7`-1<)YTfoB zD(^-Q=FH+J#ETGbjreznhdc{X&9eS)WN7=ITZ4V`iz{v4a0`)-%)uqt)t@jVeWwl| zEWoXD9%w7~AfPp1N|D)%ZfV)C;zZoDGi?P|=e`RG<~nfEBX`Z~c<{2dGPF_XPsmJj zcW>Z?k-u>y4-lyK*oM)rjGu>*9-`8}sI9N$n&ts~`cAGlJ2OIchtL9Et2b8Tf5nm4 zqOMr{7aY=A>;~c2f?i_xuX7BK1wQ);F*iFzbSv*E95^~DRxePZMefkMJF4A=O4RY6aD;~+K;lof;CJ(+(_kz8`Yda zjPlLk#|H5=U+D_#FMx;j!IL$NUsXhQ=J*x4J`khE%K~tY=AgrkDgF$Leo6TWd<3Eg zw==>EoEVER{cIJUdj@hbBfA%aS$M%1z`>}54<~zKtF)nY> zwjm>f=|78@1(m17{Axuk^f&|COlJY_5VF#)$qU5>ul7e+V`&fhq+$eV4f&)%Cj9h> zAC%zHee-TeGjw+SR`GJEKU6?>&>SG3*0BocAEbvb^d?2nQ;GS{KTZ$&`Myu% zsooW1;m>JLug~uR3+P1E%Q%F^s@NRFy+5=6$!>k{GXYe33uC)WJ@l zv{rH+3w=c2vT-Ma-t_6P`_ahVl75 zVcw&Y-+o>M58^JX$7lTUb3zf*&>~LRqpksC#Fx zf&Oh%Qb~0l+yeeC=+_k`^63sAc;$sZ)en|rnxb3`n+iMP>s!`IOQvNy>ANZy34xGwGe(wNm@_PhRTIS{kHx?39ckyNp{gH!vLl^oO?kF&#=7G@vkG*$+ zkE*)%$0y04BMxNHL8FZ}*3hEyfkG`9X#p9HNNgq&MXRDM))C(_L25yXLo}0dlvb&< zdRtN3+Ul*eS_DN6N=bawVx<);YE-H_&Rk73Em5QSf4^(*GjnD#j{{ooy}$qE^C7d( zIs38pdhNB>UVCq|y#XEtR?Gep1#vz^>n5^$ui;iyypvuK2nfW-AYm>0OOtEvpBe-&FNAXt_e$G!Z;Q$gy*>)9cJm7zbme5<jhaeqs+3G4FxKw}ri8AMx>9iWTj?rSt^VMTVw zz1IZQ{qIq4`l12k#|~l76$>)TG3Yn$ZxhRxYs^bi**jae(fKNn_cz4jeBzi^!+qO0 zmr^Z5Cs1>z?7mOu!@$dY%(NNfu+Eei(yGVa>PX$HhHSI$Q6^+)m@%hn+dr)Cbjqm! z>2{&E1wIYj`_NqgPS*&`c#y&(x&$yw3J^+#z37*A73B+Ios1kTUB6iy=b)|$&Yz*# zmD~bFb2C7ry3A#@=TSEQ4X=g23+p%d4`lgM@hv*1nTK$-F zW@lY@Ca=ixiLxxT~yjUL`)erpqLI&Fmd+K=(Va2HEwEm;PJX!dkZ|W~-nmVojawx>C`uB7U ze+S3~e^}1=@JPq#{M={!)rHCzDhzp-{uL?@8@f;x4$6~Z@<@-P_H+6HEmh@&KF}FU zUIj0?Fcx`KrPyQ{Tzo!ePenORx9FrjDCa5pIxXeTPL1ccW0Y7s8|2R#&%Z~xa>D0-f+8+o(EiqqoIble^T0`AGe_g-Dkv4oAlW&MRNwkjd2p_$%^&Y$|iOY{P!*R7e z@B)ToeJC_A-3sso&*RwzgxPLK?-*eaukTW~Lkns!uzWHn-r9lskhxz~yo^%Ju^Zqv zfrVx(P(v5k~9G}eyBSj|hYA*r|2HM&Pq_r$-^Niht6(Q|3`cS!5j zzP7OyMc6t1q*~LR(>4Uayc^RMeDkPNbbE>YHnzg)Ip~VZ4_guI`)m5MUJc%S99DzF z-CPZZB(!WG^`V^mpiQ;<$FplIGIe3%z*S&{^k;vQqa`t)?ic(Ee|aK@|2BPSI$0;{ z&~!PbcFh*z|796Pz`rgqK?{fSSh7YmVoR$M5Ec0elGEz4!6R$mgKi zgfX8nqTfY11hX)?Tu_cXv)19r?FRMrt%j3>>O!kQ24?LkUmr2tkIhG$8D@n7zqVcl zRqfCM?`qlNmAab~m25BZ0-M&2U2K)bS5$^Ozsg$=1y#xR>Nq{}uqbR^*q~eWP@x4F z`<(IWOD0c!7vfss#l8}J7IUGV=5jt>z(?47p2XM0)IG<72D|E-(IZ&DCz)503zg#4 zmRB?i_=>eG0<-H%r%0o-Y;fQvoTe_L3ign%3n2#(lW40b0u-Oj;-VIGb$7p(S>3RL z)&1w&S=F7-;-)$|d0vopofb|;&5aaG7`wjK@m5qI@&fa%7x&f#)tTmLFZ1v2 z`gOG)9(%hEQ;eP^kS3w-daVxAL^xG<&rXE@FnNRsMBs-n+7L(xt~G6F2o{&(1I?gt~G7?YMZ*b;}We7OMeZSudFwL=`_B+ zWvOgjCuev*g|Vm2Hx2J2=E;J0Kb;-=4CwTk2Q@=@8S@j={gGxWASv=eNqOsy*vpg9 z411Z?Dw!G`d=kV5ht_(^m!2-0g22>|WR{*L?}64kA+$m%W^cVku!0eg<1~@>nzGKTFp_`lskA}WX#d7k+Ezc9_2qVNPjtsDZqd@isC!;eU-WU?R zP~`m0SS>Zy$thIN#U`hp&XoAS(*FxE;Ap<1m-`kyM}C7ZeWJeGSBzcbiP#mRilZ5p zwl6*3-I;jpTJWr~AHnXOF0a5r;BW+*SIyR+VPsP*ve@2uj^@B-as;PEIw$zyW)!b_ z2};F|l0KLVXsXC6q_g@}^RvXg91ct`c7vLMZPOfCGM8VM=r#-Z1U3H0?l}G}gj)pA zIFDdZ#~Z;p6xnM~T)7edCNdVshVd5^_2(NN#Ek8XKW1Y6sv_+;#P?>X>kNGV?a#UJ zO{=OfJ2`Cce98~~7yW80Srosg@ReTiq+i)O(g0s>A~RTD@capZHP3bqyc~vv6P#PT z&R-|+n*DLV1+f9KNBtV3Es$kzdOHSoBBr44&1rk+;#s=OQ8`9lcBd`SRuV^1d_PDd zjmyJ6K3@v9uu#J1mmn^w=M*yS5C=5GMa0#PDoJa3Ix&YlO@xu7gW%S2zI+mFle7~E z>M5!2WET|RPu5~h=IGEinJUv6p^ktcr>4q$)1a^0Qdc~QsdA`-Q)N0=g6iiWK0U;Y zno07!1s!0dlW0UeBU5N&AMorHZ65#vUu~Vc8CSw3)!XD_9LFN_$O$Nsdboo|MpHMY zBXi9Q%h;Ip8TZHU~Y|6}jBCAbjKSmx|6>r7H z92-W^J86sQ0;OEX6ToL!~yD;z;)=PHia*dHfN_xKBB*h9f!=nu|1-R!_yh7(@jLJOu7fd z)0qa1Lia_RHuu~nhAe97F>hh1_UNLqrp?&@g>66h`n2^`{1ThV0qRJSk{^F#eGIBS ztyW=+;>*qHFHw^O(%yl{h*_#ZyCj`yZYmQSh(X$W0v0Cg(%B}bvZ>pj(&SEI@&~$d zJ0?e_OU}2N27JKeT-zhS{X3Y0tOgwX%_ITtH>^w=+>Ugn-&>h7F!{4|hEfBa4U;X_ zR~shp0C5CgbFGg-^`vGep*cXCk^b@xlLTmYS(!9wW73)SO=Th`=?v-deGGF259h&r z-~k=yS%rZM+WsDOqS#&8cKmcu0A5DUE2wC9{zS?lD((O27mmg^ZSP*ck@SbXJFvz& zTQ#*)Y;Q1c;ep>^(NTL=8yKjr-;im~{01CTXbg8!KdPOLVI#wy8E#}C(|(+yTPtio zwj{SfJ?Wt>=YDpyH-l^m=}!WIdVK=}P=i{p`CqGnnE;3?3+}YXMZ)obNH?VQ$s}-m zqR4xIT%;cX4hihMK-@yNd^iT=NqtxeVUf|Cpg}CIfVt*~KH1DJ`0UXA%eh|Hpq}_c zN+110TZJ+((NXKc5{vaUTJK5x$uf&rBf#pWC>NX)IH9MYG^n<82^@AKW{I=<9jwP= zY2^+X!*x8!2hd6ky#$3K>&w)2{A5_i%&dm#ri)p8Me&R76vB`*{OC$@v9Y7_AmiJb zyX?q45H<{Xs-R8lw0=M29NcTK{|T5MMR`{0AJF`XcsB&c53cL z%>tdcL6fp|B;^d3euQVN!RW#DnWPGT71t>mij! zeFunEL8uDCV&Un=H6tO}+0tN3PeIyj{gciTc1XfsVUiR@X0~wVcy@wsK)Qg6BY<+Jhg!K1nH_8Q&;Z`Wn@;}A#vu<+*u9*!YyH4Dwz)!znKB>zM3CHuVO zFkCM<4#(oounCgyib==Bk_8rD#>nq z4K*6|$cZCHo!%9KI=u_rY2rCpdu>uxYY;H}Q=Q(+Oi-r`wOxa>Lv`wiKg?E~gQ&+i z|H$EQzlF*TJdq#KMj(M7#B+pl_@~lJx6uB_>oBZXE?>(9EJgxtL2%W` z8G7GAHzo%;+1TD+&}+#MdIejO=>r!$wEB)F=ds-T_na0zw-?+^x^$KEj%e`rAJ=fl z&{o{a1^y0fO&l8wDC`(|t_L?k(HY0n-W1lqZ`%t#ilZ!og?#T>;r%Y zRH=mz>Rkb9GuR#t5uI!Hyzp4p6A6U0%L;?sZG?TbWId(+^Y`L@-V{_zP%mPtt(p!) zO$5DulLSyBu{By(VHNXJax#}h`_U8x{8*UeWYWS4K1Hd|CZXl?)*?dITz>)2ii-FN$j)n5Qy2Z324F4j0?`>!f|!TP5lyNQoV#vp9S^ zu}`6o9?rp^Rgh54pYVlcZ(2!)24pdVtgGfiu#D=6>$4_JK;W-er4}==mW0KOEm$ha z63#==421I+91M#>J5(ke;Kw>2WABI1M5aA6PPbZMm~~LUt}_q!Iw)`A|IZW0QpPIV z4?xm9^;(#a`a85L$?4CEbmY6LOsa4IA7q9;p)Ub_cK+()a9osPQh%}eFZ~mV)Se|c z1-~a6-z?0`5O?5HTEStJfb-;A#5P6Fy`a-9FChjc=s6LFE)bT%G^rOez>10g5ctjX zd4h(&0PQUt+kc(l3)0WMPv8HofM&;82dB{mapnwP4eDX&^>n|1h!MIq29aSQzK zVg>Q_U36cv2i1P)Hgv0jkjhm;>| zJoYfowO>W#5v~iyMWXEPCN}`O*fi1P!Ri*`BJuUV)}~-;u)ZdBTqM5!DgE_N_Zyh- zRp33qWY=B;WWK{>&ORrxf%;~r>{2_;3#El#h2*b6`3(5L!b-rC!oBtY+@O!!WZ1MYT z<|}Z1DEgSfx#st)(qBU`t}^)jRP#df`w8aB@cSK<-!#A9B#&u+|ANVlR=;4Hu<`rH zt4$Yz>f@pO{%ZQ`wEr|PS^WNNHoyPQWX|UIvmpnc1HTtvA3B(fHFSMwrIypw`Vi=N z)ZNnA2C6OUkXP}n*M~3@NG%2(ey_nDSBYTOq2Sv4Y_GD{hfW1A?i3;*&#;F!4Y7wX zKjUHY+929SgXmZcx|#Dcnds0ITl{Oz9x9$&4@pe1OPr}_oJ2;guEf3>lsOWu3S}lkVWlaPg?o?2eF5?cnyo@EUn$_gLTBTP|zpnsDAhy`7bqb$+PxA5<005TDy&|h0M9tX1*$D>pHEU zvuV9Pr0H46WOo9uIGFTklO#?v;jYwh=OLt{`aRpXK=bvh#gG>}1=mBy$RhSymy@Q_GrsNeP^+Qv#Cg>5*xO{>`JQ?#|qYo?? zDj+0Efq%~WuUA!g4h;Mt?W5Xu=)CWiWMTQ7cWS8OL34hrOe7w;lbX{U^b(U>6$I-> zGEao{R0Qkk4om+EuQ%WT4(QTv$fal4h?LAcMh2P^2h-AF>&Vkw}sD&K&?~9*X|BU}*|DVeEXP1{BPy;)Vmty*q4rSQnH;J*4;bA%4w2)V8 z3%&~Tqexj${Q*^3^NcVyFhSUY%KvkDNw1$PTH15F*1G(1=1Tnq@q{s}BqBCamkLZy ze?P*^CFD|pvrWzSX_E^Zz|Exs0jrkur2-$^uG@fm7;>oqEa*M$C1m+Mdp_X<#z24q z<3n03(LycPX0-rC@eW{}S4^oZ-&gmMOtRyDcC6)E2Vwu5Cl)ITV}LI=e9LpDNB9y8nmvy8y9;*75PE%~;2{HK_hw^&V_u zGgDf5A)|}}-D}t2OkMRenz%Y<9Pp`QAW_&F99i7u3YRA4@*V`7t;VqOuEZ&E?s~ly z1t5r#{=w!0LKkABh{w00Np%HU2(8!`q4lkNMs%-OaV&}Qcd}8bXC1a-s+)g;ZsPX{ zh!8@gqH-#cv5yJvsi-U_FLjJg$#qyS{w6XHIWm5%ww?d*D~&fE8NVAczl#xqW5rmc zyOCzx&H+fzX_$Y`f^%JSW?u503qCtDJFjpGe-zbkk%_M6BQ>37=s|~XDpsxnfiOS4 zlfN`VMl%r|MFbtC^Tk{mKYOUbmi^yVOr3UGpLV@PLZ|2}X zGpNTO!DUt%XUK^VECj!^PnU*X03|{TEdv7+v!o16#=I~rY8@xH59dyh9(}0X<4~8; zR@ToM7=O_%SOZL@&bLRJ(~8(~9&sNXwT29lHQnM$FhuQ#MB%5@z8W8q9QbI^@`xbA zyC{&e&}M47N*^1Ku}!KI(0S8mm^z)Vg%82<+9W~+vuaSSSivrXijW5WjkdBjPG4hj zrr^_o&H&vx_l(D-%s*~{fHF++i~RUo40JR}WeJUYPkg!`SZ$T>&l3YVnM%yB9#o9v~b-E3~ifzF9 zOzOwXTkDdQz5fkzM|dQk^bZ|h@F-foCEOt!8>-uUkoNIBqL7h zN3}DCI6S=uW+e=~RFaWK38M`)HSRvy@KqZq@4Gea9ZQJgO~ z#T%VU=SS)a?4_9H6lXDMpKc}XiK5qMZC3oSXSr|?wS!nb~7CDbzo7QX{+H3P2PTmXOgpUsSZRK1H)p9elIo5|os#{c8NL0 zG(Xh#&87vP9l&E6*ZuuZ2vSympQZ`*Z|(0y-DvLq&NR(`X8lDp3-FnzM~?8tNEDfp z;v$Dewcl+-8Pu>AcMc8^pXJm@#m6=W?WN((fdU8R0azMdf1|ochKg)>{|-Ze@D|yq z=A=F7<4!6@`}lM;2H&Cj_)^no{$UaAVLozq4*MrP2#}$LvZ0luW0zXhQNpQChh=~2@}@72G<7D_8H>uIs>#3VTHg?{mM;( z8pZ`eBcyMz7z-S>c3d?f^X(pZi@3q7pfl{5KLUPh0$Zc4>(CgjSN=*9lEMlU@*}Xe zL$yPm3{v>`(G6U$>wxD1?nV{qLI|4bISfXv*nk;rv_SLd24Yg_m=5$X(m$nq>4RvA zYHbs?OQR{SES2AIhjh>m@7v{TLoCh*^$Apdv=u8?IH`(% zqwx)V-47cg+DcP2ww!;X%QxX~ypx^^A-Z>X;Q1>Qo}F38fgH{!MET0kngmcM8Yo&u(9x^{mI zwKiRQV>E}Z{bf#FJNh=tHLKH=7S^@b4%M|cq3O0({K?X_x3;rlC|2lNeub{(gZiQ9 zJoF5@mVfmLr0RO8(P-=Se7&51qsuv(#pP5&=vqGD#H_f{FQ6)QEr0Uq+VWPO0@fLL zfC%H5@qn1Z4_Rm3Y;C(zqbOrdVDC7IhCaYPh(f`|zyjPU*vP>4PX~ z)dlru`XD`t%19BHF(w#a&S9fbtw--*__np`KFAMtuVsuE-!$VzZY7_C2qU4oauH## zR2MRdFe2RnLxfELPVJiRfFS~Pf4r3+K?FVol`FFYd5Ms%t|{1YJ9LYsl|Mo2EvR%BL{#+ty} zq3N4vy=N~-Fnmu3Mc5ibP2Sa0EAbJqB#={~n;kOxr`xeoXb@On>$p8pJ4@3{_W&sgs{9X0EfBChwa(e!%HT}$u{>pfG! zCb`yo&O>GP^`3v+4uv!anTIGOv)=O;5))3>*GjLjEkL0hC^kycgDDVg8&2VS?*o2!Fl>&d%V^hh#9c z)+5a3}clF=WoipI?QhviS4I$ZYZF8lq$E!G@mp?x|3LJTr@b*nRg z^T-BnuSuO7^eV|vNEC{-ul<7R6)k*it%ce@20AON{W+hueG@8kR?ha*H(RP*A%R(H z;0*{y!M;-i6qbKb7U66SYPk&KdaDAN0Yg%&liE%F47(Qo83($poq#7ZlOyNMbE_A> zFVu~;PQ>@fBmC>aITLXva4%)7G>X+rKIpsi=ni8|sE7ONTQ;zMfb<^awGgp0Ri8W+ z?mueJs&J?B7vOJCyQi)GBj7;?<{?7G+g|@soAGE59q>O*`&e4e9$-$3B1%9kL-aG( zGFsvGEdFQ~$;;r6bD@W`aF+x94%ag@9d;bPJoGd4__yHWf{uy?buNShLyRzIhi1+u z+Tg{RQ}A6(UVgRkGm)3aX zIKfY!<)&lUBZHF%8|41urJ3#Bk7pvM;FJ*UVSX_uhy7MKo+nIhKs?Wdp?z=^LTF1W zp2w#uMf>ND=fQCWCYI+GK)1uOJZ`XA){>Bk<=IHPZ3lVZj(01q@$s`yfsa!$BeBId zd6f4`vTiYagy-)BJ~;WwjgQsWe3tllJ_kOE#W&H?N~+S!Q)a%zH;uztkoNedHPY?7 z;fN{_-&7sWh;JH&GRBvcH*{%rOEJx0QM~Z4=7)XGA3FbDs@>TbbS?$-YtI2G?D1Xo ze)SIs{2131m#g`!h`Xwc_2s$5Jjuw=q`t)b6V8))D->#vw?gUhh-kms1`I@7@dw^t z{*A`jsF^>-mh+)el>#pqrR--^umbfJ&>)Vv&0LK))a)WW@SXbgY*x&IciDdl%pyPQO~6dV40`*7QbyPh8M^5v`Em;wWO7n|z&tRjiK?`~xJx%IrEd35u=3nykl{ccV?z zgh1~_Xf(3HUYsrwXpE)#8(;rs?kI3Kc(w@?Fr~pTC`x_ zR*Fpg5DeQ8Is*zNUVl4q+TW;7yG&GVLmaeL=K(>8`vB=y1>2h{hRiQ9a0b+S^a;2{fENH>OT~Tt^dfB>Oaz{{v-W)^uG%9 zuSDdlU)@0249z7Dnr;V$5oy_UiNOKLuD%1f1tCqVa1mbx`39V#6@ZpRaLqdxX5!%7 z-vbA4fR!?F@EwRhaZu?Z4_t&y77p5xCJwmj-HP<5#DQIG9PvXMA6G$_HiSZUd<2BU z!4t&C$=Wt+h!?`gD;H$qqj@#(@jO^76CWo-fu-@W7?~`5`~+zWAIp*ctnon&sPzK} zzO{3KcDsH6UyNVCvE=G6kVoc04~%hDVHn0qV=O>XO^oCxFS14DT}=K)TSFjYO%g~iHIPod@}QPS_*v@QkKaa^IyF8b3ZM{+iTiQ@jQo+L=jF=kn4nFx`36X8 z1GYfK!ziV-`5)&Q;SDTpP(PMAGCYKFR*UWQY`#%<9K5|Wzl!g{AR5_lNJ_;|Uki42 zLn;hAoAGoh2kVr0&qSuBXyHPj|9qqg6~%il(w`wa+eQ6zNsB%yJb#52jZMjSsF9Q} zE`Rr91hM4rZRm+S@^?M5eQxsiZGq$e{Qpk3u{JCL7r{(V%WU}P12Wd4@hi#kD*(M>AHQJVhVF%? zl@WWTOzL386&kS*nM)L>t=O+T3KSo3ehS5G5LWC;P=YAdQ-;Hl$r`b1k=`kz)rmfV z|M0XBTDJQSpTdiw@y0F#V8M9fmSj==)#;+2fdK<=05f(c+)rWF0R=-Hdq(?8e^Rcm zYH0nnUrUn*^TsH&BQ~45#-MhbMI-)pf26xAj4K53x+e3r&%8d+_8Pek%X~aI^;rIB zz=xroTQAz{eQi8EIr4Z(R1Q8A+W{xJwJc83fN0)rW9wG{-**#!zVX4NSl$tz?mD+k zUZcwP<^0~p$|QzM1CB*c2ErFY!VZi?z!&_7C+6^vEQFOTi$se)1`>aoMk0I;c!NQ| zLX7}*qOD8t7>o07G|tQ^w+0^?Rn51BRnT*5t{i6ts^J{Qe{`Xuq?!N|9$#rV@$oWP zux)|I;`J-kB`7UU3~(QIjlelOPQ4?Bg|{tmV=PdG!;&H&)P(nrH6d9V=|40KD~!OP zF0sOxmWnlq^-I)?WFi+4WLcA z)4BYH6?hd3j050RL4tS=xgO8+&gC2R#&_6XuiX}PHT&j`ivr{3BofzZkY)j-XrQVyKyx1PjbruC zA^ai8yJOlI4X~?afw5(QL&^f&NAU=YbSF+DOO^51BfH7d;SJVeLamqDT1GRlf9HK&_7zsnM;s zR^dZ?;4v^AQ-A|~uSz*^5E6>!@rW>mr=kXhU7Z?qwAa|+noL94W*j=8y1 zlT?R-QyZ-KgZT1osp>BoQh;KTS$$us`l&f`SCvU`zXg_jmhPwXTY@BokL@LPKhtZkR?Y30n0~l2;{$7PN zMUlL2W3FmcteIN6H*;|Q)(*Qq3Nj(J&Zvmi^v!h zD%4wGz8uVqg?f#Mh%U!{HB<-+ShNNlXu220g7NBb*&91yU#$n>hD84?#i$2M>uX?3 zj<7r?{1#;HLZ|7P-GuZClYRo}Fw)HPFw%1Z7tcNS^7*bg$6tO)^QH5{m!E&}dFFws z9T=4VFYEtW41C7+rzeN~>61ZtW_UF0LY%9D)mi zu8}SrCL&fTmS-)i^peCRTBUHAgt2eU*IrlB7XLDsJ+T)CwaDx4?SI?%&r4qKUh??D zw&i@^-paq9tLd7PN3=aVKZiZL1f#RqvzVt2u00z_ww$SG(>j`U--LN*8L)Ta zBj45PcdZ@eH!L%+#^O~JYi)t*Xy7iauNmtOu>nlN7@Mb4v8KCfn%2RnJ3amUT(k*A zs$p!@1nvUzs>C| zq|fVQkgTq$Ul*-MpR?P)H&y;=F|+OEP5ZQL&I53;Y+%1B z{{J%KiN5au8bq~Bfeu^?52dAA68mDYQ}*mu#_N4*FbK5OSBMx?L>5=N7T`k13hb}q zN7}Zye(Fk~J@F(+!6UQaKk&=dJbLRp+X41}0+KtO{uhA{z6Be6a{!-!HJWQ}1ZsB; z)Zd}<5}OMGHOv`M0#D)nk)3ivA-d|~O;HR(v2Moj;q0ydkO`yAKe{kQWCEGQMPzoD zf1f$vCCl%GvW*;{3LZb;8Br9T1Vs3=gva1S&Hom6J9f1`8HVGKamoGaK+p*j!io6!-Ya;|hg$bdQrqiVFq5C_{ACE7s82$B@TNn2 zzY2q)>|77yjvO8L%-4@$m_zMl)BFu;7i19~pOohJWlzn%CPR#O&^|j~Fo?}YkL;ua z`e^8D>pi&Z2k^}iO_rm-&zxlXyC8ReZ-C_K{x<0hH4ODYjel(VWUx##qFS%hWk87f zB2+AT-)?RHK-N1PXltc(71Q-6K~PsTJ$ z>;e5K7D5Fg2E?C%6Y47)=E0h%2&(Tj2$JE_jV$gLL$$vK*U7Z98f<;7uhhpn$CmSj zIR}yj)1$Z-AG8&42B@Do>qOIKJYk(p*WkRZ`pV|g#3XoltKi{<7ppzPDN~7>AOvvA zd;}g~P3d`a&r$f88-eUPRC*^z>jG}=G{SZ;CHUQ@@rzJ5Lb-NQ8o?&sJhIU33QxAK zAv(dWwl&fart?O0OO%5#8#AesHY% zq-O$e(e;7+{_oGHJZReo%`n*L#t5)GI%!{`_z0YomzK`pOV#f|{r8|gd;PZ-t$%07 zS1($d%-V&*kv!w;7j*lM$5*T`tjIARD{|gtDTWy{@mjgi>@Qo&{blz-9ohDm%_OH5 zJn!;jS~WTLmt6#y**{){2|Wjy zhj^H*{f`_*A@Q8weSpl?{<4a{rT3SOLi&Hy{<73jNqIFr_#5qPo2c*# zYHJdSxpUfB_y7GI{cpfz34Uw(!VT&&=Si*%q&%T{bQ9(+717c)bfD}0BQ~=DZ}HRrfcow54mo!~;M;@_ zX;B|XU1!^1sqHOaO~5-T;Ge%c*7VF4N_hT!HBC5Ak|koYozkFWND~`4B`_bT z+FCAdnWsvkk^sMQW;mY^?H@5j-R^A z+uZFxk?Ikz%e=Znkjbpp$N8I`>P!OT-x zBu{02+~9``zW)H4@vJ2EIE3BERa|Z{lV(=qEyA^MyLW67)xome07{Z@H-yJ4_+`p zR05M?@)s*=j0;ohui)dvngn*O>*rfx{fS6jf`kz%ji5UdK+t^{BZl~Ek^mVb7z3%M zNO)zt<~_*16%f#e@F3E2j=iM$;$pbl8Br1X7W3cg#TnzCrPciv0_$ps%K`7OPx{r1 zU&R~jn?rK?WW!v>NqZt~38xDYh54;L@R3I6i%FpKY|v}==|+;sW3S<@#c%(Gv}1l- zl8fKcvn=|lGiO%<^}iPdRVYJhbktW>RM9H=4N+UZ8);G6`eK*aA(-3nP4-zoV%;T_<+cVZU4 zgLrG<`%I*r;kzZ-0l;(WCymPCkSa?iYr#x<1px8$zL*DV+nC8lhbR6j8ksc#1q$Lu zrBhr23img~Uz6TNe_h%Aor!hi=nrj#V5g7EfWN3g)r)k&XUlOQ7S}wrvE1G0GgT2AhZl+-BIiTVHEh%Q>_U^c;-|KyFPUD zBY}5m%S>Nxa?+Ng`uodQ*STAtY?k%&m#MDkA{b_G?8~~bq7v++J&Zw%CP*Xp7B+yr zi_=!>FE$?bVA0HsXD)ZqSuieB|FH`Ceo~1E= zAEw7+KyOfSkOi_B6^9|CjrvndhYU`+6c(TUmU1bkPG_5iZ^iMQhFqtd7_#pYbhT84Y1az;<#+@s}Z47+|1`eX&tdUt%k|mzU6m>lb?B zp!ceAKuW!@Ol-4KK^Oas5%nYtDtRjhDt@R>DKYStfs2w=PFxqQU zG4ePGB3dpR+3%+}Y|uye%du#lR|F5B4$H@ZA~nz!`o?xG>C--dr2D{nL#AgQNICj( zEenW|O{t%O>|K!hN~BLgdQRi{=Y@7^dR7>})_na?NPr!y{g}1p#;Vjum~E(=1}M|6 zRgU-O%6hDl$<<@FncXNN%w3L<&odA8E*A3VVK;PnTe0g#9wCmk!0%6%*01#;x98@hD><@ zvonz`4R~=hi|lI0tmY7QjhoLs(P@Y1s>e7-4xjPa=vMd*SD#A zQdI@o8q`IoD)fMq;nInEOqXFeR$LZSg7Nrteh8oXA)G?Z{iU8fr&AN=vCXnQ%3M(f!lu)0nNX^OQZL;AbgC}Y2gIjJ8Ass$L3Xzu6eRti13f3tJ< z&+3rXLEWcUVK!KO0tO}%COi4^SZNAzBp2Oq4YS3PlXn&$Proh3qZ`dqNxN26#z%%Ln4?HJk7-$)Ys2C!43 zuNI^1(*J@00ln&5`w?d>rqU^)dz#@@_9&A>`>&W-KuJB@UF)9TG!c0lPp-Kx<<4kOdclEfas6hl6_i z)YHN|fRCu_Qx6G=`-Vtiid}a&Vet>(1{!>|qrzWdA3W+IK+&L{1S!cvRO=o&haIWi z)GkDJA+brpk*Z%*c>Mq_(G}EbcDv~y)RV1JQe~Mi<+1K)ICKx9HGh$Gd%)#@I)d%3mV+y#@1gelmprg(=mAh2%N0wb{PZDANYOL{OdrTn(Z zqX@6N{LyRp4JXQ$CSctSsNMDf+9}u7*n|5;EeCnDaGGV&zRe!0f@+1pqb+#!wJzCL zw+2l1gG1@t9~f-(z_Fj$lAr4`>IXe{y)fHeiX?HvU-!z}(E|ikHrK>PNb<>&s3Z&v z(lT0mJ@TmAFg6%+F&=ucA9q6HP~Tre!K`71o-R_gsXI2UGKyhN^EGu>FLhUMWO1)6 zJf1^#og40JOltzYJ50dLqegzCcK|jNq^KKA z8=ZzzfV*Q;@z*Xnj_isw#&;}b_)lWYv8iXMz)4;XOEF;UaYRaz57v`mrymH1W83i=z62er^{ja$`B1W!mJ4Ew83>D=I!i zkS*|IyzdW10I-cuuxAKrQM8p7EQFQ}sH34+qk%qhMW03y=CXa!x@vSOg*9~FR|3Nu zAa+jm^K?)7T44$p8$iBR@g0L+`qf)s+L;ar{C==LD@m%44kZ4QvARmA%fv2d*Ak|^ zC`>YuYU*uN&mtej-NY-%oPsAA3s%7-L9sxerA~09kQgekhXxwdQF^#WvHE1^Q~`bm zaZY%l4{$O7I9AQY=maoq3#pmkr|0~h#A(n^gtMV?5=NT!U&(6>6V+m*}JeR`Qq2NB5C9y#rAdYTF_dE`P6>8U3Opzk{KOfet@cO_TdA} z=@Ru9X6aJ%N8v{XgbacrzX~Dmng?t^+aSPq*b|d-*b@+9ZclQlgHU|lg`o!^N7_)F zpw8dhuoKNxW|CpOoF*-9hLVxlW*Y{!i3y=cW@GD~NN}5!*t)P5GmYDf9@v1*ku>;V z&$Z7o%SD0jktFml=Zi7kgk2l-&fil%(3teZyw^|_W5D2=KZLi}%=(%~NUrkLL4WI? zDa8Yc!&FG@UO2eGcb?ih@BC5J4buR=C+2U1+0Kg093Tn8Wjaf8z@Pm})8p10^jH+F zzu7vdBXBbt#B8m6=^X$%9@q@UbhCQd&(UvLtbSRv{(3{1SknqY@`}&~D#H5f)dbK7 zn(gd(;5Mo=^-C$$7OQWI)-N?Cmy{}vHm!&U)=1UYNTwyR`XxAX5xN@r=(>`8I0|k> z3}-IK5f%<%xm*e4 z2&GSyb_S#!+LbvNRQKoW7Y&_X9HTCPR)i#Tq$_Xrp#xN0@2W10hNd-DXV3Bqx*ocL zf9$&BP-`gK#*@>;wlAk~v`x(fc+tQ*iqJZu4Ts=F1B&=SY$g4Pw2Us1!3a*fURZJ5 zy03TJU=42p+D2yBxm}n}!@XFco`tw-e0Hh$2x^?(=;(W)31cJpSA89{2vIZ6bE{eS zF6Kc8N|Z$wceuiPu4FEtu0!35oYBA$j z2b?~GUUvW87${~v3gpo|S^3{3QuH(;H*0BrSd@bw=sz%{ar21KPsUAisdGR9jJ=_s zkt}JNd(c1H;Fg3>+ zz3?yOnM>*ZuNcyQ`nNgU^{R&5QtVHrbUh<#wl_6f>rKr&$g!GtdfS^kZ9%_L$-=5@ zU>l~pn!!eSNSTvGtp347pcw@r*Ly7K@4mKN$m4+CPY>y@_HTh;x`Tj}3XBTiebu>_ z7CcBP9F-UZX$>rxfT@dw8YJaC#@b}$m}^{NI6#n%j~IH@$$QY!`Zj8y(Y8^4Yg7rD z+qof$I9u_3^*!AJ^#H~CagB045GZx{?&#>JV~Z3nHNE{857mEAs=d@xz3K%Fa6o_| zC88+Q(ZdA;-cN?}4LG(P4I!3X&tIG`KBfc_y=PiqIy zxRst9L&Bm1%YiJYRq9mJ|HtqKj}~@T=|>B9EA^wU)vbPrM@uY#`b%Mkd@53>Ts?GCqm%N&#h9=Hz0 zq?M>teX3Cu>PSpme@(zs8}QC&;BhSIuW9l`o4kw}YTnJv@)HPS_10p0F_;sc8gXm* zp}3(9ff{a?>{qWrwev_LwGjlwycm;kOp~qk6)1xNIGqzXBi&nD@1KvF6@?qq<|gm> zj@l+ajw**K0PzR&Q*)q;h4(3Ev2p6r;A3U??~ii{wLm)H=6X&??0B;Z2!0@PwD(oK zjAsOTHHOaPP>Yuf@v?^JykjKs)dmLU!`F$ik?Y{KO`hg4x+(Om3_6&&m>^RhZ=c^_%749QD5~Zt3vXP_9r+vR3 z^;60mal5bRal0o?w{C0i0gvQOkJo>NDgZqU_<8L!ZU1rIQ4ND4X;6MM&gY_l)t*Ml z&^qxQO9>+1qt)&lSf{{amQ)*t(f;k@PC+kM03d~4w1|l{2m9vz(CMj*%JKK~tKqxD zS}#16oL=|1VJEa;=)%wZGo{|ik;#Y5INnuq)t)-kUEP9?i{-5nqi9pX!&V1c>Q|A) zicwRj=^>0Y2sy@m&@$gHf6QMOdA&q`<8=Y*>wpoZ*MHz?d5!bV^3~6kKj>~4<5~jW z;g{@R+HlzcEU=~zHU>V#?#^CLWfP-t+DscFuLB?Om6$gGrY|_JEKWv*HjCp1xDb0H zmjK>@VFQCg01fIk`m>iWf?}F8!UI{B|oPK=a!yX{#W=og@5q zrRKM{9r0T!Ktq`KE*5iv-vB@OZHvo#RfOM4ZT$AE=!Abezkyc5Z%2w|`ya_~k;Q&j z^Jw)F5G(ZSS2vfCR|cpr{1WZJQ&^}k;AQQ1H6L95V3W7yLrUpY<(ZBMz@R%*id#ZLrl~8)IVNm2KApjf11RTIdYc%aXf@BR{Lw zGVrQnrnCvA@TW(Wq#!aepzL z`sbG>j-l#_b5=u1{h>%IW7Ppf`J+K>nrt2oY^3(f0O0ua;e!cZ&s5lp#1k|S^b$

      5S#k(PQQ8@zAZtkdmG!Vl3doVe^0FgGxo%umTQ^*o3$ z+jNG#JFQya+etzFw93&gCVG(Rnl|>BmWwBs?Oj2(pS|7hjv!k$Ia-Unfx6WO3c+rF zim@6qY7m76??r<{JwE3H#6p|(p_AhI*_w0NnrS%Mo({5IcWAb3o8M&fE^mXR0e2Io zBgj_cXS224wHjGLf6Cm?8a(8o3dT?!e#ARZi`36(gF_ZjH_!0Vpic{`FzkdVdyCy5FIMRM3 zkRO?+&`JJU-LG>uxI+#dxTZCreSc!ctj@%l%^g~AL(T7kN%SYK_tlxg1>ZUYTY-;@ zfs}TL4hlk%yJqM;S}t!3-YT|}@i5=h;uEvCnn`9h|Hh1!`$9>QnkeDyghI#*Fh2zY z3w8`3${a)#8RprHdaS{9`mH3yK`G}OA_2kz=CfN_ z1>3ts$8fiQ&z`Grp2IveXX`a`zm(_KG3}Mvke3j`j27-T{1wTIUEyD_JvN1Qg=!=KpxX(@Bn#P~k)bou9gw8W~=ce+xTe*xD$GS8172|3(7 zehT?}lr(8x_H=v>fq`6XauTg_1OlufG3rhBHKG!;s_!)HMyS7~S8<*K^QT#x6Qk z@BM@!Re#97tKt7Shan62@47X>f0AOR{7{4rc~|8ndyyKsldD5cf z`CHPSPP$$`p_7jMS5RniMaBG-*yDtgCY}^NZqj6zr?l+&h&`2`bkdZQPCCJbo>);i z`A?XQ`7c{F)=Q8oIXi^OTP`=5KkD<1im;?R_My}#>ZPLNqr8N_w6M-(pB#sg^Lq^V zfqsLyx%f!|aR)qC2AM;wvRT|JA;>GO3omP7@))s^BVk|tL^KEz%w4@GRDF`o&E!^& zbC?XI>A>XUXoRkP1vebnQ7TQ5&L7HCTm{GfPpw`mu!;rvif&*ri^o%}ILZ-s{DyUy z9dnc?FDba48%X&T9cx0*&0Vd^TB1i2QgIZ`LU$UUc1gkVZ}~t`BPfN*)Je~<$&;!7 zFe78Wz2IitAmyS4*F<0GAT1VsVEV{B2nqh(E$h)f{4L%3(h>YE-RJx)(Tr5|p=9er zlGnCAR1h!EvZk?Kt*3iAAeSi{R<=!gi|v!1X;u0&+9T;`Ay$=q{9&F8BCG$-76Dvk z;E(Wt^st*YXTuwMO(T1=twa@VTW?{h;k4!n_0M9l(j2KgMJFwVRp4xCE9sWP6Od#Z zNtSY)M}jU(fQDyuJBLYVODjy8b+EnBNk7#?m|>|BGu`Rif89% zSU+i^oB`7xo-dzF56UN#yn8)N0@Mmdveia`zn%W5=Y8uf^1q~}DZ65mtq+G1)0?-m zgycjFyXw6&&hVuR4=X{O!_P-3ndR_dD)BiLi&90p>0vmdeVi#jVLp}UK~=ckRX80( z>W)ImE}J}7|2r=R!YKC>ByN8VQPR~Zfa~!wmyO$saEKR>%D8v zRqevouD)kkIMcCxMkpeyyYyy-a4(qWuIP_xst!i@>D3QusTY%tgC&W#duak&Db8^? z{LP)_)NMg#&au(~+m~=Us{+hr+9sUbAuLa}ZfcBtRyuhRPYvGPcdybk^`@HECR^89nze_dS={%@ps2f(t#@0RyAMed>x%_tbtGFm zEKSEDX|C>j3u&5{FpD|8YxI_%Wg`kZ#fjOzWG6b82ePL(-=uh^gm+yoo^jik+=_98 z1629eKJhHfDPvmM2QtCMta50WsSUgO*^E=L)%`(D{;vKC>m98EO+Ahb z=50WFj0E;jhq2or(4V7~HD-^LtfcW5huq28n2k%{4^{CPHREP!WVJQP;k#=RF^^6; zR9p8G)@n707C&XX_ZhZ(_nUOpm?jO|)E^a8d`dm6eH3}enXb7rqA}Cet%FD11AXU0 zh@_mGYn<|55y0U0x3 ze&6jIr|&>y2oO|eOyBjLD4Go`u&+oHdS73S?hif{`!Sb?-yvsohwg{h#D3i1{ms8Y z%1yAN?Rb}Z$o1zx>Jb8WIGW$=qdC4)=>|jdw-}oH-SCw$-Qc|`uN$(>{s`|I2gm&p z7!Svfw#)ivaL>@Fd*-Vvgd4GeB`GP{g?zK#Crn%vdZl<#=<|G@DO!YY<3*vH`FxYl zkNGSpSrl5#@6_<3P-xPT{t8?~p?-?SNkn`x!6k~CVDS^f`Z?~`6gkA_RX)WOGlS18 zJ{R-3l+RIeYX6<=zk49KZ|L9mz;B#UF-suSFsD+;RJbwMW`79B})Er6hq{H?cgn(h;xy|- zmh>L;%vy#0AbDmLPseRqCs@Qpk9@td>8#>Tz8`JgYsKZ0)BD7kssp2cKtrDS==Q^w zfulu%KWI9KUk|@7esvrfzZ5kNeks`Dmp#RgOU`vb#zC}AAZwq_n_L>0-Py;6U&8jW z`1ML2e&rnhe&X!c#jtB3T;pKaOfYPHfMI*~H+tVH&%-e>E_YGrYoM8%k!;Ks8JeA8 zXr}q

      rlYHRn>|K=w?VK>6qfKPhzcljNb>h_QNq^5~}f)tjf6V=btdIqIu@_h#CA z;Q&#n3rIpNTvsM@#mn9Vc^*>wAG*Y3KPc?Vika@o_ zg5d88L?02nHF!5zDEGwrxjZ-$KLyKMFrJ9f76uX0oE=G+D%(O35|U9HJ>XyOi+oOE z?q*p*6FjfMyTxT|4y_Uc3!D#?84W-~Lf218xT3VXeIHHLv$*8Jl)a`i3Ph|uCRxvD zGK_uRtJie9zM;|bVh;H0P7rwNKg4n3NaD1l83-#8aStqHBN^98g`8j3#)jO%T`2PT zkK2}I02;{Y`?pH1mf3n8J+@x1#+14O=C}eZ)z?l@s$wv-pSh;{8V7q8J0+}6Lx(5H8J^ zF;c_Ei%@$GBZqY9=P?^$Nd?uZe+*<5Be%VS*ylsXq&7yr^@ZH!}@VlVcW__yL+sft|f~gxV ze=*n83#1?J>Y+m+QzmEgox4pWKGT}L=Y?FCNX7hxpiEz-oOi3#Yq|=tjSS z{>pi5N`Rremn@&1&gcOl_E+c8;dd)sy;G2dclVBAD9syJ(a8r<$Vt{?V1j zLxw&ud~mYd#z!CEM!U~QwBG{UY^8!@4>Wim4vSFW9bUo7C-ohQpPy{qd&;sJtnwKi z?X~{*W+IhGcd2Qe1+EjqN}U?kB)duj6M3rAx_;+q*MCSkQ|44Kosnz7WM6H{Jv^z` zOP0SaeXkzS|M`V=efx8+>-`=NI`*(0&kcMfW9)YW(@-5nc#_1D>Ml+GHV|P$D z)&{aaA(=b6dq4=U?e}nA*EK!R=zZF8H>vg|)YNsIdi0!$e%C2D`J}!vkz-wl!o*$! zM%OXFUYMDVu9M5Ibr!gen;3@V1KH2G4w4VYbVlFSLH6*ZzO94wKnIFtuKdsy+?hj)^^^T3Tu%|BND-SbCOG+|B13Tz2F<7348;SykC4$#tdf0c z3NosJ=J2L*CxNUyjnb8-HBAq6-1}aDuX7rmN7_{ee0U&10C(xSljd+Ok`_GuHRx@HyQ4`8jya4yQ8aUA*MrKA1VLuasC+9 zt21mq3n~Aqcua8eNkw9=C>>jM^A5R-cp$TI%I;KjRa@(-`U<=lLR?lg@W9olyGaBG zbTnmuEGYYmys}RU%2sglNqy_8;5XZl-Z>4*l zPQF~SBD^O0bTNjQpJtJ-Vl;Axk(#zTuNV-8iQKhEanW_gn28z&XO>V%JE+0xK2$(- zW^XQM_SsByHGK454!Iv}^rpkgu>DH5ZV$Dx@g9;JKM zx3~rw7h#_x%*&p_>U_Y~Xb(K+lD513WcyW&<4nzuj(LdK5LFqReHee@xF&nGdN@9f zl-|fnCk9#N^OG*O&Zu@kBlcyd>r6j>RzA=%Wm-!5kFzgqDn$=0mBs}dnZZ;8=iqEk zdQyug_*co-Pu@)&_cqZf;rwZv_nVPdMzlj|J!Mhov{M&_cJrw_jiZt3MWK(pi8Bg5 z|9JYM(A9j3&%pU=&7#n6`2Am``x`#%`Fx8{s3=raR8VyIUt!_lVPiuI3s0k{6Zo9V z2SHZhxPJu&;|Avf3kv2?(^-73z@JAC*nYVx-@e1xgN6(i{k5Z+H=pf%cJSHx3Rd8U?DvP~MFN#&{U?q6xmLQJ?n3G~f}=?s0S>K%I%V zTJ5Gbdt-8+IW~8RpIZ(wT-iaEUS)|@W5KDx`&GylXsya+IjgxxX`U$D1nt|>S4B_D9>69=MZU3{7Cgb@`p7r77wzHY9$q%v zOKsDAsit)-{aap=Ok)ti#Q-q>i8Uw{{fBgHZ7TNvfhFkGwG?33VDR8`ti=zqcPO!i zA6Wm?_L6KJtf(gI;8OStvJYmWohX$(*x>z}F$gSqL`Mg0{i~8ww|5Fy5lWLN^Kjs_ z@)*Wi9+b#ac_%t;6_qwVP5;#P!mCt*yKGeUpTv%`{KHb%oDtvbVc;R$dc4(Xz{aXL z`*Sf>t!SI~AABxwbK0RS9mWz#^(l0x%knX%8j|1a&mFd~eU%D|0Q+{~#3h;7^3D&L z?%u9+^dW9?n+n}tW0gMbO10kmg#T=IjbNi91|F9;^lYPxV|V+_l#URJh^b`%HCZIHQ@%6OIw`-DppE$*wYN+N8x#g)7*jPr<&g5sKP-_L^sOB(c zQLHWis@+OOs71&8BEnE@DdMGTA=VmDEP`qBdR{y_%J+Jd@&Cj^u{K}|8UhtIyWyJU_a^4DE5qXC;1{NXm9r&L)D-_7+e zFA910o5%q+n=Qxy>Yz{?rxVuxPR;7M^8_P)8t2Dldc@CPkrB!65{m(P^IFbSId0|v z2EQ$l)v{Ud%GP3(u2l5R&&)|xHgnA(@>t1_c*o3BWxDKuVs^|aDpO3#z9WxSzLjEF zkEY{G(#pmj^ew~-*an5vmRP>dIU8>!I9uVOiKSG9=r3b#fLkt2SK8eQl$-CNERKG- z$LEeJsR5o_heCMUgCXlH!rWf3mfLoDfgZcL&nqg}k+2u`?Jn#s)z86}WrJ20}pdK!}5A zXn#t3#3;tOsLaSs2^&*n|Gq>{*B`wP7*ACEvCi`2L!pftHis|Cp<2Yr@DdU-&s>2X zi-UAA7FB~SZdRs@4E`mNcCF&M7{cqlkOO^l=bWMv0d~+|2jtIkAQSWR!TqBxhsDPN zODB!-(hVy7V9%K1Q#uYv-+ zLz4wcaUs9;L|wpd1K~3j-Xa<@!;d-7j}gsadZ|QiQnnO$FHnQzwi(%Xy&gD#35X`U zY9T<#H&j^#6?hvQAfon)Zn+BX=TQ~xC5pRKx+UDOfO+Nwx4O=<-B}f6uWP*kYPuRinf1jhsT}+ z@#k3B2}sd!UCDIS-!G;LP{`4S>&h+^WIxn*?egb2A8q}wxb`}ZaM4nVF_LTnr_meE zxbpBkRvUc4lm~Yn+16oYxV%J{Z0>(tM;r%VV#(!vzXCf_x6&<$=P;*=&UHm*j$XA8 zI3v7tFFt4&eQbwr+w0O5hqqn<_JWIwwx$QRyowmj0-j#Nupb<$WmPFJsU_|GPg_AF zMHuKf|2Mh2q`H2IK120N*xl+{$ttUmaNfLQBCw0LGn@=oQ+2J5JV-_E$Tb0BEvJZmS_MKf~XPRCMDRQVs~P`PctD+L3{ z!wcxXqc6qvW`9tM>&<>y;*c7^a8ay=GPn~~fE!%w;@Lb(N2h8Xj83=j86WEuW*0?g zZWJEth}WoU-xqBWC68v?5%UPk@khhrK49(j${P z;}@)%knAd0b563mVD`57uV&1jbLy!(Ry|)+xTSdhUA=j)vwP#;Kee-(8wH&o_~4B@ zj>6WsUtX+y@{V{c&EBuI^s)KheE*|0nRkcQym``rH523KP=~Xrfyy7gZNlt*%L@yC zF?)!o9-g{pZ%a&Onk4qj+ClY>dtA)@ZG{J)O>a4xDrmiihWZZAU(*}QA?j?MhH~R; zzqRdOMJzk9YU8;=n?0l87&m;Rq(D!lG?Ams!pgiEk zIWN!Ih*SHL+g6O%arhJ+cB(g>BO@iM*Bj558U4M&m**Wo;DIJ_PM@QPitr|}6Fccg`#jb><9Pi{|`T^D+|qRj(#wLX*V_p+!AfJm=kA^G5M+D5Nk4u zW7xGgUj5KLkCVK8G|S{V9*p=S(#A9F-n$c)#LpKtphN+A~fJ|NSfLbnxXGcx#Nz-HQf zNwL!Jb{A!SW$G}$`v2Se7Wk-&d;b9<#27UyR#dbH1c{o2@KBM5=B*;l~p{q**+ll=BKkKg=e<~Q%hnZZsDK9S(#%E)7!_QPiMwfgVjWeVzGKp9v8jaUI;VgpZ_bu-E=s1?2=zKezu?|Lm#$t6a z$m;>{y)0v^Y90rQ;ELND<|5iSzT5YfQ6;C999w)1ocL)h)_T*yeriIom> z`i{OUTOBman7>43eBiU*H)()1FXY&&Uc`P|3kI&yr(izS=V~LHQf-V0eb`u_VI)?J=$GGb$q1Zz`|04XhDhpb7uE)Tzs0AFaJv~#`M@ZjJi4P^LnDGi zDDP2{5T5Z}1gjOly+)m%R;dML=5>Z|S7JM$p=R~c5AI9q;n5PgW_2O_FjG6_B|f~# zsuvlqRrkGO((aevZ7~D++Qub^WCkKMPC(@+{#p3^>JEG%FE3zFT&zDJ9){Djml0$= z%tjRE44U?g86-~;BS^`-2fwn7Ft0R25E`}#j4$x^%0pKaBdNn5b?l9N|Mm9A_`+}# zzc4J>gdrtJ&T^M4_bL4!AP}R);}vQnsuyAqY!axkE2wx> z4N(DS%w~3m)AHaUre!13!hP(03DR;W>Qi`fq|$=pwRui11e<9g%j&*Ezf)=1Cr{uG zK6oRJVaWrpyVl}H7d!!ur11W=5%QxI4ONUXM>dXHiwjgRjs=aGT;o^5u;v_1!gnMTQ*);>Nd<*vL0OnO|GEqwg)mO?^85kGW|04-{)- ze1%CL`elqIVxSAH47kL-6wpXUIEpk7BGRyTKmW z=%eX6G_AhJ7=8Q|Z4$Q6d3gw@<%JyBp3AY|v~&CL8#+f0D69K!M9+i{?jbs@n!#VR z?mJ`*GZB(Gu>4%#MZb{)OF6XRgu4GONrY!M*b4A4welXC;@ku$m7IlXeXHP;yNQ+{ zj5szhj&gu%Jieg<1A~X67!)Z69E+JWG9KrW!MU_HRtn5PGWyUfj2wDI_^G zJ9FIwV9nf}f&;d4h=%6(2nVlxNAG*GJH|)=$+Dv{x7>k6KYaWTr9qP8YS7TpwYD#( z;o-4^zj3n3Qb`8E)2|PnV~879<;d~$a5d`V*YQWCC=P}>9pc+%SodIiC*;B_BY>O# z`E??46~}O}M(*sl1W|INGxK&XD1?K_iVDUM@PC5T=CA>mFK@wI6fz4FAcMaPI)21;=IT43bDqlP)F`l6ZLaQn^!N0E-D6x@d(S?Z z-^M8%5o|O*iR{D0m68Yo=((cg&=5Wz!9{9pXk&&U`;TLj(6980GwyjV0QbIjZ0vW0A#V7hl(5 zvU?26U_tD%WuhPBtU?ZGOQno5(HZke;I$ZwWS;qC=HOKy&IsZ=PfTYpsXp_`;py0h zzzW(ioQFW|div<#gINc+Sj`{oKT*49rb@PdI6rdCC~6qBqb8#DW3yrG@f~3_)Psj; zZ~48L?1zsX{FC!rmV#D)tTXLi7TxN;@xM}K>@Ye`HN6dGEIhUEud-aEq3Eh@CCqHU z=-g`Ig6fM|u8_UIaopjJmnAcD!uLXlDYoIPHvEwEFeZ3?6D2WDQDLDBvPJ#Jp$5!u z4)%7Ngx)xE+0e7Y|SR_DU%0IY_>YTv>8Zfr8*T=WV2J==F5URQ?{5zXI*z@v&+0H(mZ_ z%HJ&cJ6!&bkiR44uO@%T$lq-FnKlfOavyHx(JkiQ-BceVUoBY)S)-}Ul$gZ$kne>chB&GL7P z{M{;lx5?k_@^^>)?UKJc#03eYTeX+0$Fu-?x*&Bsog;>zB7ca_93*dN$oM({z__Xw0%x$_fRA|rPfK? zN2PWhwU0>cc51&Nwfm@DFSSRhyy_F9Y8_I$joRy_b`7;vQhS8j zVyWFr?G&k+Z3nf#klIFSpOV@w)b5blL)3mpYIjq6ztm3t7}|TJHjCOdQoDlM zTcma#wSKAHMQxkZZl<Uf6ro{h!8#_C54k1AuNJeL8J}v<0 z4?){C@+_q7(wE}X*0qH$nPHdC&R&+i@4X05`|0!^be1G{c6QT!Eo>EOht#sU=nv6X z*4gm&M6|C6gU(J#>3tHE(@FW&Xi6++u6lZS|FECI-9h)8qTM??H?Ulu2HVcgE@}m} zl{@>7zCbI%g7&u5@)n=|H>6gk>9$HyqxUCH6-8 z4$yaXk*F??XzlH6S!FwZwrs~~L^}?tF6i%n22Hutr}gjqIU0Rhr}e+}Q}8=Nera+1 zqGP*f554p^_TLBJUD~(#P?{`W6V?GD}|DMc0J`E`uqE|PpTnuPwp!NPTjj=^Y075>e1A3g%^b#d;UorlT)Agjn~ zl1zvuA^&Ogzm1N=qaDG&Yx4Q9KL+oH0F=D9JOM9GI=votk_4(fyP4swr~A{F;)psc zyZd|SzMk$o61sQO{V?4(ByfMX|H9|sK5``7g9+U~V*c6aUKi)?JRj@b&i%3Sm!GC6z46RKquewikIgI)Bgtge+>}~`-s+1KI2hXRC|8u`Kb@T`SYBC9AhqWrC8XS|6-y&yMT47{*1Uf2xWXiVs5dz2r_XBi`F^mjuM zkFFymyCaG$90=+E7@_~ok3m1?V$ffooc;%(@2Vitt2>Ar{VTN1io3){|4H{10|QkzX}HhsA@ z`0~X0GDBy3e7JuRx|Obtq_o9R()~KRchh}LLia1^-beSeIQLHY|MrjIo;3>Yy{Ng7 zu&G;E?#xC%Vss|lt9}P0GV`atEZ?e|<`%LZh{?|ASHp61X2=6NgySGlmt=|NJ$_ifs_PN68QU)0M56sJk*Uf9(*9& z`O^X{BtD)GQx{|T{`VG&$5%9ziM|UTl3&2B+(pW1hx%qciWQWEcix?lUkCa9^1*0+ zN4Niv`K>0un`8KG9f;rKz4Y?k?_fc!;BMTDdHN$<3`hG)0rDBtkKuQ8B38W;Dl0ZrVDG8(`kdi=30x1ck zB#@FoN&?C4rO#QW8i>ASHp61X2=6NgySGlmt=|NJ$_i zf&Xg>;OtIHr6iD&KuQ8B38W;Dl0ZrVDG8(`kdi=30{_qwn0RKZjS1lM8LfcckB5rh zx6`Bf`SaeCNIyOz|`O*d(R8FmH56@|66W=K}E z5%Gw-5pjeU)21nVZPcilGYv}6g3y%WlAsVJe!tg`$lE>Rf|}Q-d$h3ulhzOS zK`h?@?bOpUPKWmL@j}>}TO4|8o71&$k-OdF_1)wT1Vf9LEM2y|u&CHpQaY>r3)fXt zR?V)SQ&U@4-!OOH_4AwZCrq3)`O2%Vo^p+hX85OenI~vps_Be|=JIIzQlDQB1YBN^ zK{B_lRE*JtDE4|Bt{|-KZVQdJ#1(XULo()md(i72#d>6_Q8R>?0cf!MUG`?Tu8lEV z>~6nqcP!I__C>m9lwnuyS!{Q^9NJ=&)?;ti6(iHl71R+3;-Cd&tj%yrYHDWJOx0@j z7U}5m22mKi0o|c^7kfi)hem5D;8qu+GFo{aohQWH!kVh`sut?N_<Pshu$1ALWxAT+3r9i5V(Pc$q9`vSiqrkaCLR0`(08^d0{OFG#zW2LR43qrT znl=v(d%CUiIlsMV5*}`gS7UubFv%r=X;&7BZ=xLUL3#f#=&v4MB;Ep0wc6bQ(gpn? zDIpXdHuX`ty#F}9dCM&l-y382$r5GaysIK+vs@{^K5sy_tdhSIv>Oq&>32WOy-4>X zNdLQt%hw^FTl0#<>A)Mt6^TCrUypeH8R2~b_jhuNMB(Ick|oc~L1p3v#6JTt6Yk{k zA!wfgm^^NSpGPk#5;nwh1?>MkF`7qSV{|pivsA~t#z>KbK3se@A>3(bAMQdtzYX5Y z!E*`B{fNUKVK;qjB#eEa^&?y>EhC>kxJ=v$TB zKw55spH*-l1X;Za`TPKBKQ+Hd?1cSl$jVeXX=UOpWoCQk@&=lk?E!u2RNdR!>|H`P!pq_#Abx?9O8W`WJ|Rl<|!x}rWtouyAIGlhV*SzWvJEb$CyYPHAAba zuc$C+T79TD!B)uzB`eBN)r%4uxOP%yb+7mHa!RlO2$^I%iFyUot&HMvd1;% zkGsqWTA0>mY%Z50f_S=C4i^+(lf?AnXl`@p?y#6dQ&Gk2;_I5~uCFd>Dz9y7D6A;A zW&37foRfR4rwH;{R3FgI2p}FUf%YEeovD~l+9~&(Z<OfFwMno7e-7%l(%`jezcOsHFctjWxy>&sb81vrX2T9)!OxT zuYZ}P1WnagqLg(r<)#If`Sd(MUD z)w)01htlr1*@Jd#9O|69X2cTW%wIazr!BDu%v{0nxtRsQ)#icLk1;S}7|78=0bOfS z)=e1yv8@S9)Qp7?h2b{H=!-FK)-_CNJbD{irp1X12fSPJ-LL0bid0+?IWg^tiwW{L zrVOx&P|1kRe~XidZAzFc;dVv&H))dPE&1hMdvf_|E37OmE19a27ZzEG*<*3arb?nK5NSQ+DBhAb z(yM}D_%NG-Y{uW=1T%6B7%(g3LXppCS|a2^(c4_Dt-4?Lw4jm?NI$!I zA(jXEOi8W8IEhG^|HC11y1>x!`a~DOWaR&w7c~!G;8LlH!%=4`{j98ihz>13gun zJ~nV|c-3ia-o$xeEo_iY3oD4~iru<>Q9u>GI&TokjWm@3_PlJqqk3M<%h(8`1Hojk z8I1^9az{eSuxBnn(ZC8PJBmn0o;}*zig8R(YY%~Avo320$l39a&e8JCekOag>?^or z6DGBz>|n^s3OR9fPMB2K?Cn_m05jQS86A?-)#5y1w`8e<5S3s%WwefFYr=kw>rIhX z1AUv>i^X(q$@{d=#y4@>XB|d!zVpysHt{5Y%IndWx`M_)v59S*8Z(ma?E7qD1b~WW z;*Y;+m|p;XRq3tng%23+w`{hFI{~Jm|FVZ|q7q=zdmgcgWdPHhxy>fd2bkusL;r{} zYa;s3DYDgHw0&aJEbIXc^tW2X|3%ZU92EJ(9|6!{xG=;Z!P{~81`Xz-A< zQ-%&pKQ-gD%+t>}GwZCg&l!I1=gu2({sk9~yy)W3YokVAGG^?hK84&$xDGfw4+lmSCCqi;Xwj*t8(|`tr>yZn^bKGEe@uekzKa>dGriBs=J_nqN{= zUTkoOxpH<@NnK&h^`?6nN0wD6ISj_M}tI`>qSr6#7zK}(UILYF&aSq)TeEt0FY7<3B=bgvmR#0)X;cJ z+WarnM6ojbH%Oe^pIMWLZ?pUj#yZN${F(l>h#>xDb@BQ7uhkaEr~lL0oTvt{tPRJX zS>|Yp=(G5A`=?N`^e5NzM5wYvL~rN@S(mW>C2N5z&?48T*v({zJOR0UaaneYc7-XJh6NpWqy}6!O6Y>OI?Ybr>R>u55?j@6^5VI3>laYN_4qZ7?H;2Vo0;d(@ z?!wR-+niy)^j{maV~I{p5=e;X`$O38w2&3bohi(THMB%mG zv?DUu!^b$C&UuQsusGyFGw4LJYwJ-jKfqi$3(D z8$oh=TAJ)W>^x#^m=j5?&eIRrmtuiPUux$}aH^(doPKJH)9%+=v>95qOS=?H9Hpg~ zP0KjF*lG8)$z2}u<(e`k9x7hTFcHCyu^jAU8j9&91HTEInXce6GcMRs54o|Pg((=; zRomrWG5O?0iIU>{REqNhxhTMJN@}a6m>3hLRrkA>X#x9Uu2^uF6-yXeYsh14kt4_5 zNPit=i~kTeUqNoyjF^%iNf={`FNcnk5`Hk0V#RDBOw{7_EH*O7aI<()({?S|vt4tj zSv&UXRY(yg{{y+8jOW%x3VErqzN=xiO3TIMHcGCnKaag+6ORL^Xl~nU6N>;;8K+lz z9U+v7Q>77RuBaI%bM4to7E311ofxZ@_F%^8oP(Pl;eDLUlyIexTj@rfv15%Bs~{{c z;X@DOi~#Xl7_meKHS5d@Sx3wh7lswifgoxQbBEsWK8|_%DZCivNS)D8Q78}CxXaw8 z`>RnVkhdyk*Xe$b?w&N!Y@jNlTaT!g!)!7vTSJmdRGXnhV{RT5V+EWoh1pKX6&N-T z6o9pLQ1Kx$_?bBp!w~MSNmH(B#M+u3Fq+^M<91tMl{cRu6+&lSe+%7dRI{ zVdKHK6e=AQVwgxz2TI2ujd3blctl9J@n@{)WP3txH?-If!0wmPb7F-iZnLfsCv*Jr z_z$bT?jU2i5(Yfi?)RYh$gr?a9n#j^ zR-^m8{vggFMIQ;^E=2ikquZ5HkUu!AgcDWhlI>Wx)FPaX*iY5uQr=kXf5^pr^Q4*K ze~DVeDTEOf&L63bLR5y2)HE1JYKpJ8LX%Y)oSOZ1|FTFN4C}F2*2};cgy(XwJQqmx zmywapW+0%|=s|4Pp?=CUC}!8{b{X5h<|14q2$7+hQVn()vTdXedfB8ZJp^A8K6hqH z6*L*_pj{p;&td32tWRJ!XCNIW@ z0ghl$7>cl&sJk5jELf_5$HV~k9jTHOJ&&Ngw0&om&ST(dKc zO)-1dGRl@{8Q~iBsR{eXrax@=px?i0vN=YTW@V83$QCz4HixZ8{(st&C5 zNppDsMU3a?y#7+%j{OWhre7(ksVb?M#A6FWzal?BA2<+n=$^$!n+-iylNZaF*qdOj z;^e}vfVpPLe!QcpM0^=QMYFb`L|h7>@~d&MaoAB>iPKT`>MCZ})*443X%w|M3}`V5 z+w981@+zy1;kV|h{E63`o{?*eqcFrY>jBE6hvP5=h)$b57YiUy2QEfuulsqt(i|H` zDr_E>x->Ob3UOhd>ck7%N5M~3DzMNP9JDnKs?y4YfJ7fX|Nhi{ax~2#)TBJGB)<`xwu&bgF{KwjDdZ?Jf_eN{|btI%roz9yv$A zV0KyF-=u6pKKWAi3CkMlzsv9SaF@rDPWq9uPv{5DhjEhE;zO3n{D~|ht!^)hEUKy; zN6I1&8;9X_!SQE_=fI_AE5 z3(i@fF|uPU!kx7Y8~{Slks=Ut%tggM8Wlyy-i-7pld2GXa7)O~39-@iVtQ%rZ5uuJ z013_r&z+(ZjDm@BdQu4ni=+ugMt}MQBVp#+N;qX|yb;c_aO#bI=!&)yF#$luHj)c6 zW*dfARUfLvrKlW$O+*TrX1E@06@EOeHd^`2){;O1A2|%n?cnZem zR1+p%Df`sZ4BBSeEd@ToJh2nsu zt&OA2Flc4Ib(6NXDrwp>4O&Zli$xdw6c<*-^UXqj=Ue4aCbogLtgbSSHq)TB@U0b_ z$ahwJUStdhUscWw`4)?Hq^&8B=WEbf_*RG&pslEn&x?!^;2V{1g(3*r>I7*!btGt8 z@-6bM6%NqOFDw<4CmC5}mh}vSR?63iuT4~d7UQ_M_-1H0D;p)V22lXohLQyG9Ru1Z zIm{N5L5q#Zc)r=7jY?aM$N_D2NliR$4rp7f`Bp15(BeCxcv@8JNm21F6~jSWQd}QT zI~lZ5@vRVT2bu8N&*B?(h{;e)b}HWI3B}}i3PP<_sg#sigCQUz1bzpZiDX8mxpvW z4K^=^WSC}qFa`I8nlaNbq*{xG5vNwz>W3R`s_mHRL01u4s<$^|o@^|8;QK9%3$z+V zg*gt^5tn0)7#+W4R2IUh0c-PQQVbprXli|Sk1OEBv=ozg^tDd4La!}?TzS*GK?eb9wCZ!cbiLn@KK4uc8fR6Tly)o2XNAqandp2GqB08yanl3 zaa4Ml^in?;PULxFPYZ%Bb$P;c&@-`2;&Xikt+v{TqRfLMHmS?yy_bru4lO%n3Ph2L_x0ZIlb<%eH$W$b7B~D8u_oIjGBI0mg_7s!ektw!nu%k z-He_%@IL$Tda+yK9SU!exKL~auBs>!>!i6@tO1@sYnE6oak*FuTs#Z?l(Mf-=E=%^ zq%_xwOknak`e!4&K8Xv(K8Y*DE{Ti9Hi?VGCW*_%8i~IkmP$NdG)i16rb}EWawIMj zBPFgEnF=3$k7K$b(JOJW*duX;*eP+X*b2LF%P(;s$9$hF0Vs) zz&J%NvK7vfxJn#3jB;I9Bn|+V)YgjK5*LXsi7UhwiD!#-5*G`%#5OTc;!;r{af!&5 zxJ(R}c$N?nSBgU@=Nvojlek=TOI#?nNjzU{lDI~!mbhN{B)(qElej_HfNL8{#dKg> z3C3x(uPT%Ehxwi_&GoWu|1Ew(0Xx=nQ3p{c0!v&0*2e(aM6_kO*yahBU#z*Xeapp` zTeyE<{7n0hrQb2_j5?-;>sZ)c^*dp+rT>c98GVX14E9B`r=um5Ny~3*{A_Toc5L(6 z5m@X{Zyh1OU2e>oe$iQm`yeZ=j!CWEy*S)&n)H}d#@V6KQvIYqs-HCdw8(xiT*brj zZn5;cVOrH^o91S(+qGErZKfTMxSD-92(j*TK^FnC?a&6X{c|yxCt^%?mLyG6z7We-}Scf-=o0)vo4d-Hf)y-pEFi4vE7y zzVsTVfdHd;slG&dbl}r1XKq9!?0Z;9f|1dP^lRF4)!2^0q=Jxr73l*moK|pQ`@k5s zh3(l7s&3Gn6xIxi!~*@DIgV4M)Qq#Gc$s}7J`4*Nxv(7rsS20hs;F{3ySQ2u z0c#=)?-v^ z)z85&Vi~uUmvV$^%u=2ZR7fvbDhHRaqbxyU zSQO$GjOudiMyiZ!o!YoKaCLrj$c4SG#!2~CUybki8}X$@v)e(`81T0=S`VbF2%MC^ z*bhRLU*wGv|6G^H;a!5W0bJmeu5jZfo$(onCGTWnKmm7tfLAE@X{x=xkk4QWd&ACP zDJ|7bUy;`kh42Q@L$`Y6YTc|^Q`_68%I;e@pmMZID2L}G#v`j(eR7^FNEBZ=@+n((aez+)};S zA5uHNU$A>jEyF|IT`a(#d@-kMBQJmlewUFCc?kFy@F!}yZ|5-Pwxxc|2oP$WGvp5_ zyScgpmCrELp$k;js81fLt;Km4`T-vS|MV;1M}U?z0`A!J^S4^pMzcqoCvGZ>ifc6< z(87Kg*2)9iz2M%tkDIsH!@!vl<=6U+2j!7HdcN+*-3(~HFjqEC5|~TwC-zPMCm9DU zNhgoR$?!2gjKY?SJd}rX0hQI2OcpwW*hC>+_VGTn!{dEwnkLtWn+KN)CxB{66WGM8 zAM0n7ibVh_djj|8vP#7Z0IC)zzpgPDP$&1JVL#!LIaOGq11_&3C9zH7T4|4bM0O%q zk-5lYWHoaf<<#y$Q9_AA!9w{$F+*uXp+nh25kyI3fs9eXf)i%U$mhqbrg`Fw854M{#WcfxLX10B)#4TVspm=|4*>P|l$DCF z1E>(Ia4bp-D{76NES^WoCMAJ?W(m~P+G=0R-E&~i_Ge~oe`4;k4Zm}}bOjQOJ7Rd+ zC(wxAn8$Q5D{E`SU>zrP+uN0fALTb<`ovqE^hWb)q(*rxDQwL1Ipn6*KeG`3hiN-D zvn=eB?NitQ&4_|B9@&#B*3AL8!AaaU;_jLifCT`n8Un+P7(2R?*DhtB$REQwoWLLB zcTCw&A0R&2qAY2AY;cQJj03#_OoEpHi4Sjtk(HERJj7mMjk&ahFa3U<|;jn1@Sa?C4HjYm|K=e+*|w0)LEO zx3Z57i}5~`zz@@VMA>hLo+?fLMlg;0;AWw{DW%AA&8e;Q2 zi2H-)0j2{qfK`$IdW)SI9{Fui_SX2u^0vk|*3BBVmBEp?UnrI*(=`S5v5I_b%6-HblYlRI9Zp~`nWuhI5;zG7%*S0|gp^82ASD4M0oI39ok$f2B?0!+OK&jd zuRdT6_bRdvUwTIT_<>$Xzg^LH0dow|4NO0~f#vuXm~(>P1D^u?7VuEu_Y^*+@UR<8 z#i_7A8<_4F0iOn(4UD6lViNG_z}Etw0bCADx;kLaVVabAA@JEShk(xk?f@PRycYOe z;QN5-?*ZWRfVV00kAcsJ`59$?0r*0g_bcji9cBJd;j|{m3HE0Kj{?2`cr@@> z;7fq>mHRY>OBJ32JPz)S%G?IbPnP`3d=NyQFsS17h#`L=3fBw z;PS7Pxd(VM%mor} z{q$JEn0)pC@@Y2YDASjOjyyN3bu#j%*__)`PqlLZcgkc7c&|>tf0xDXzzKNtCE<~N zj*&jbO+$K!uTc0ZV1|FK!sWn>dmS*_peAL%5SaPM1B*F|AG8S-`ELe2)%SoYyB{e& zPXjZ5s7y>f<(Kmb_UyM8$?zEmhEKn{5FW#3TeJas+U-jc2ZnuEg?&_EkSA2VPsNwv z{Na)Engu<>DgaKT7?##zq%)B_?VkS`?uP~@P|m~~R2WSE3Khnd1YwYWf#Tl`Ouy~G zlm-1BNZ<$7Qqk{bMN5Ap&P|?%ZVO$(0CYVTI_Cg%!ePi{G%&-?1vcZnK8Zg@nsHvB zXz6cH5?a!ASm=%nK-X=d8~M59G7x&Cp4$eX(=2rE0q6=WbQ=bsTVSEvIRM>e3tjI3 zbln!Z%<~ebm$Ek3^(jl5Ic~Vna%VZ$&Z$iIZ0M(``?+b)HE=4c`#YnHq#es<5MkE= zCR^grq{h!1lpX!{SmL|WLMs`m9~nk#B!7AbpwldLnIn>?pL+^a*7(1RJKU)l|H<$h z8~^`@`_-xH6kqx+u!OfFNqD4NV4>SG03G?0o|tuj%EX4r_-7(m)F0y^y13l?8&rdEV#$~-F?hBI8l5V?&Zp{F62r`^T>P__@%OYuF{0ZIQ z!}v0u+o7l3-UPfEKAfcLK|HKx(|*;>27mG(KVt0ygFoey4n6JiffFgN15%m1S!c%K zzJDt6bHbmsyf0PnIjm9q=r5}+QjWJJ35Rs~7P@@{(D^_|wN%kF9>)ft-)!NVb7A6i zGW>4ES29oV^ZvcXQdU-3y1~zE=j))S+lmBXkbln!`0xKlJpVlw{yP-^14;M`XGG4! zM34zhyGZ$Ad>u*rFpTwzj&a>E0Nr*A-Od5%dO%0j zX9>S|0Q#(j2K@+Nv;7!;apE*Gz6FYo@wE*=$2gFl*s6y0#kXB6z{d>R4Ly0UOTgRY zXJRYghJ*2Z_gVPvQha+qCEo|$j^~^6`AB?6LeKb42aZ*Y=X#60f(dBohjiO5bejgC z+iRiQm4uEwxfe!7-ozZ2jK{k#rs5tOmDT-P^+pKGd8UTFQ1G|5)BDx9CI@b&-@}Lx zc^p-E$ReX0kw=}Plf*GU^pme>DZlkeXh~OXq3are&S#J9?+5g9YxPNKW_kf%^hiT*9<^c4LT|pFlBU`@<-WjPvVdCjLUB2w_EvPoDL=N zLweC}gq5!F7=?3y&31F-=)|%z!(5KIQj)V9MYVVERARW2B37=R+spl@D5~DZq?JF)(>m0h8DDz?2brO}QkwjNmM| z_e&*Z4$QGpsT%)~=W6)3*11RUb`RB-6Y!Npsh^YtQW8i>ASHp61X2=6NgySGlmt=| zNJ$_i0Vx3w-pTw|SNR?Io&>NS&<#kY_O686ZOPq}`TJ+IFZdGV1?T|?$R!_84e$Zh z1GWQFDkXuG1R@f65$jfyuwH!s=v13asf@sT>M50yKuQ8Q!=~1|Q?f`&;9p$==UkEM z7yi}D0MkF~r^Xy2Z)RbASvDOwL?v~s?8M)6xfU?#6~1043iI@WZ@GnpMpzN zzBIJrd5vI!aUD=>kk)wfIk}d_!6v>NGY}opVo(;?Y_nnrt^8(=X)5;ynhOS^ad`uA z;YIT>WC^;HPJbf*xU!L%and|kge`pP(Q~=Kc*Z>89>3}JK$$(g84YR4j+k&eB6P6S! z9m_u6+w-=>tVlJ*opMVG6wd%Yt>@UwT z#M;rk4r4ZJ+?hd5yk#vxJHm9)-4$ssrRLE!m_ zk6(M?r^BDbw_1R7fB+m-?IcJhA$~~1oT$b zm~DKMKs!x0+=!!IS~V}buy`B{J=2g((VdV|DGB_eNTBMif+yGp6srgiRKBfgGU=^$ z{}=kdmw0^Ew7Y*{^gVO1zSao+tXXB^*H~k#R{ELaibR3Z|1zgYBpm8 zi&Z_pEER9OVDM(%vi-E?u?9Z`D%x9N!7FH=e^n}aUoI6}0385RIe&xx5-rs8hqQA?cUvJTW)uO-KqQA$Y=efXP0QTeS00Swew?lRKl*N`F$P?HH%wwRKc_c8uOFr@kF%L~Q@}*zmGXdnwvOqh^g)$+~eiVTAS1NO%GP6CPdo_T5 zY5=6;#k<6F0px!@fML4vI=ZLMlHB)*=?f~<468z zXdZajz$?Gi!=fPyZtakGE9jqo=+%cb!#VDEWx{}Je4da(Dw3&fib z_C5H;C=2f;H#W8(-B#)2j<#ofuF5%Kks}e29BeZ#82UM{;5dG$MnJ9Y4-8 z#k?p097jAmfLEd}vwTyS8sJL+t6D$1Od9i#mWmueHed`u1B?WW0AvBu0mnWl6^8-6 zfCGTNfIWcSfL(xYz)nCHUjg7U<+U~U;|(cpaZZJKzbj*30MHA1Iz+U2jl~C z0NH?%fHc6-zn~3bdaa2VK;MCiLE6Lb8Q&dL*VYX{ePX9-+h_B?w7N`m0ZydY2Aeci zz18kw7$`6&j(Zi+5zN4KT`p0N0tEY1MC320{Al^3v}ZF zl>j&3glhBPf-ueQQzH7mrib+fn=-@t>Sxak>&F~9+thd5xAAkPUfcQP`G!92spl{J z%4F&vcze%_7e4b!Re^T+{>OY*Z2ga)ebZI2_lA$hzInk{W}km>Rl!a7{r2ACGfwHe z><9N3eE8I6+uJM8zH8-ej~6^O{nwAYbiDlYOP_hA!29!_b^RUBm;L0Pt%W;pUsONt zn$8b=Ju8ZKzV?+reE7|e4&M6RImHjWwfIka{(RZ^)hjQxWoMoD-J{>n`qR&L{nd8x z+xy=C;Na_DSbpzICHkJ{zIw(Z-`{-xpB^ebT|X}~wDQZL#m~>GoLAKQ?R&17c4gNO z->$9v_M11%_}LB9*4}^j{Npz~a`*wQyYAt2SKD9yc6n`e^1&GctbrkdHq{XU=y_`{V4+uX)a1 z_1`m}eI-Xf|BZR){rKhgX6`-nlGSAwmTmjlx8Ipr@W_u`?jM};)2qLHaOR{LJByaT z`Rff&{pLSsKJ)R%FWOh1wPertdS{NW_~Pr8yPn)|?_1B$yn9#ew2?%U7( z$ToA#%!m80d3fA^eQE3EGjG}UK<`e+iqgHW)nD6k^Uyt))Gb+c{HrTxeD$wW&tKj$ zws=DKw&|npczMcgWnb$OAOCjRfi?5eFMPD`PhWmy$h4oYE-4!Jqpydq{(aumNjHuB z)g`~5_)huy`PV%1Z%=m5ef8nn9(nMwiElW6c-FUTzGb`q$5}aJ%X@RLnmoJq`!6mU zd)M`8Te|=7%q<`F{ruwl|8vd!xnG_BRQ0OSBdV^`n?GK4*AIqnxaF+g+&_Hl#b51C zd+m|^><&{ZC4rO#QW8i>ASHp61X2=6NgySGlmz~U63Fhrf{{{xT{BGVUKuf)_QcLr z!^EwCI{}*j+W8N&z%Ky50lWi9 zyM34#377~d0Ne;z2v`AF57-3wE}#qWbHF}8FF<^Gn79Bi5l{hW1uO-88L$!XL%=hD z{eX7>>HjuNi~w8?m=34_+z9Xiz6{s|_&(rCz>9#l07n5sA)C(uMg#HzQvs!bMt}#< z0k|9RAYdopML-YWZ>3WC^Y@)U|2AZ<%b^$Jj7puiGUN`rik1a+@r%JVL3h1p37$a{ z-xyqDcLnfnn>vVtdjbcS2a4>Dxp*K~uMYafWrn#1Z_d#uJ~tT8&-u(}@vycy2(O?O zd)x8Qq=Rql6^cL7ra|`yaIlB(zb&EJc=K)+h}<9%KM*BLUFL&qV$tAm?CQK`l*QD+ z6~&cyU#)!Q3VvMV!*|%^i6X3iS>5O21|`1JR$R^Z+r;c4b$I&{PX!|pes7D;H`k`h zn1=j#z%m^2M%s~r?*K}w0A4?94z(5GV96q!1Q}f6wIf}4veUl|ad?#UwLyoG5Zsb8 zL<)*8+K7t>mwWI48IDja(j9oQ%CEO0B&@;?o*fGMLP5zloSM;A>T*w*I>ZnRX_0Fc z-d#kvc|tzAr-Gd}1TXW|dz@05j&SCI9^s2jnM0+1T^HgEQj$-#7jKa91-UmxsXG*K z(yl1f+KOz#eu4B+$kQJpOX_QM!;~RSHXR3TyvszoG#RfH3bA-dg9~q(+TAj!fN3&3 z;;o6K5fpFZl{a0tyiRCHB~XZ!N2EU9LA;a1$6PTxu@97o^O$x+V)FGbA#NlsQ(lJy zA>s!#;Tb@r!N)>VD84pWK4pj}*IT`OIkiQX9wD}0leW&)vPf~dmgZukEY&$tRvhIH zlt_!MDt55OODG6u8J<;bufr*!!hnncbmCH@ZWZI;m8@Gol$5f(Glt0b$D(bJs;l8g z);^r;v7^*oX__S$ybp<$TZCu08p#q5%hxB3C>Rb9wfG(B`0k-iZ?&U!s3$z9FYDILCWRE15U&r0oQu7lfY+@T2mNkC!Zz)+iAV@i9m2SjcpS4^jqvxIT;_W{I#W$v^0~;#I0e=2!)c~)O};YP w2Hb`k+!nk1UJu)V2D}|>Z)QruFLXNG+{8<%lmt=|NJ$_ifs_RPg(UF*0TGwV1ONa4 diff --git a/sourcehook/generate/shworker/Makefile b/sourcehook/generate/shworker/Makefile deleted file mode 100644 index 86ac5bf..0000000 --- a/sourcehook/generate/shworker/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -default: shworker - -bin: - mkdir bin - -fd_hopter.o: fd_hopter.cpp bin - gcc -fPIC -O2 -o bin/$@ -c $< - -main.o: shworker.cpp bin - gcc -fPIC -O2 -o bin/$@ -c $< - -shworker: fd_hopter.o main.o bin - gcc -ldl -lstdc++ bin/fd_hopter.o bin/main.o -o bin/shworker.bin diff --git a/sourcehook/generate/shworker/fd_hopter.cpp b/sourcehook/generate/shworker/fd_hopter.cpp deleted file mode 100644 index 7fc149d..0000000 --- a/sourcehook/generate/shworker/fd_hopter.cpp +++ /dev/null @@ -1,370 +0,0 @@ -// From fastdelegate -// http://www.codeproject.com/cpp/FastDelegate.asp - -// Modified to be run from shworker by PM - - -// HOPTER.EXE -- A simple header generator for vararg templates -/* MOTIVATION - C++ doesn't have a vararg feature for templates. This can be a - nuisance when writing class libraries. There are a few options: - (a) manually repeat code. This is tedious and error prone. - (b) Use macros. Messy, can't cope with template - arguments, and users get hard-to-interpret error messages. - (c) Use the boost preprocessor library. This slows compilation, - and introduces a dependency on boost. - (d) Write a program to automatically generate the code. - I've never seen a general program to do this job, so this is - a very simple command-line program to do it. - - Why is it called Hopter? - I wanted a word that started with h, to be reminiscent of header - files. At the time, my 2yo son kept talking about 'Hopter Copters' - (he couldn't pronounce 'helicopter'). - It also reflects the level of sophistication of this program -- - it was named by a two year old. - - IMPLEMENTATION - - When you analyze the problem, you find that the requirements - are very simple. - Varargs are needed in two places: templates and functions. - You want to use them in two ways: when declaring the template - or function, and when invoking the function / selecting the - template. - - It's a brain-dead implementation, which just does a search-and-replace - of specific strings. It could be done with a few lines using sed on - a *NIX platform. Because I use Windows, I've done a quick and dirty - implementation using CString. - -In a file, @VARARGS at the start of a line indicates the start of the code -to be expanded. @ENDVAR at the start of a line marks the end of the -expansion. - - declare template -- template <@CLASSARGS> class SomeClass - template - class SomeClass - - declare function -- somefunc(@FUNCARGS) - somefunc(Param1 p1, Param2 p2) - - select template -- SomeClass<@SELARGS> - SomeClass - - invoke function -- somefunc(@INVOKEARGS) - somefunc(p1, p2) - - I also provide @NUM which is the number of arguments. - The case where @NUM is zero is a special case: for template declarations, - the entire template<> bit needs to disappear. When other arguments are - involved, either at the beginning or end of the list, there a commas - which might need to be removed. - - I've used .hxx as the extension for these files. This enables C++ - I wanted to use an unusual file extension (.HOH) for these files, because they - aren't real header files. But I also like to use the C++ syntax highlighting - in Visual Studio. I chose .hxx because MSVC treats it as C++, but it - seems to very rarely used. - - Installation (for VC6, if you want to use .HOH as the extension instead): - Go into the registry and change - HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Text Editor\Tabs/Language Settings\C/C++\FileExtensions from cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2 - to cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2;hoh by adding “;hoh” to the end. - Then add this as a custom build step to the main file of your project: - hopter $(InputDir)\*.hoh $(InputDir)\*.h - -*/ - -#include -#include -#include - -// This is a quick-n-dirty implementation of a CString replacement. -// It promises nothing more than to provide enough functionality to get -// this program to run. -// Note that I have really never used CString, so the information to -// implement the members that are used in this program come from -// online documentation at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cstring.asp -// Also, I have only used VC++ a few times, a long time ago, so -// I really do not know what all their alphabet soup is suppoed to -// mean, so I just made a guess... - - -class CString -{ -public: - enum { MAX_FORMAT_STRING_SIZE = 8 * 1044 }; - CString() - : str_() - { - } - - CString( - CString const & rhs) - : str_(rhs.str_) - { - } - - CString( - char ch, - int repeat = 1) - : str_(repeat, ch) - { - } - - CString( - char const * s) - : str_(s) - { - } - - CString & operator=( - CString const & rhs) - { - str_ = rhs.str_; - return *this; - } - - CString & operator=( - char const * s) - { - str_ = s; - return *this; - } - - CString & operator=( - char ch) - { - str_ = ch; - return *this; - } - - void Format( - char const * fmt, - ...) - { - char buffer[ MAX_FORMAT_STRING_SIZE ]; - va_list ap; - va_start(ap, fmt); - vsprintf(buffer, fmt, ap); - va_end(ap); - str_ = buffer; - } - - char operator[]( - int x) const - { - return str_[x]; - } - - CString & operator+=( - CString const & x) - { - str_ += x.str_; return *this; - } - - int Replace( - CString const & lhs, - CString const & rhs) - { - int rval = 0; - std::string::size_type pos = 0; - while (pos < str_.length()) - { - pos = str_.find(lhs.str_, pos); - if (pos != std::string::npos) - { - str_.replace(pos, lhs.GetLength(), rhs.str_); - pos += rhs.GetLength(); - ++rval; - } - } - return rval; - } - - int GetLength() const - { - return str_.length(); - } - - operator char const * () const - { - return str_.c_str(); - } - -private: - std::string str_; -}; - - -CString operator+( - CString const & x, - CString const & y) -{ - CString result(x); - result += y; - return result; -} - - -/* Example: This is an excerpt from boost::function_template.hpp - -#define BOOST_FUNCTION_FUNCTION_INVOKER \ - BOOST_JOIN(function_invoker,BOOST_FUNCTION_NUM_ARGS) -#define BOOST_FUNCTION_VOID_FUNCTION_INVOKER \ - BOOST_JOIN(void_function_invoker,BOOST_FUNCTION_NUM_ARGS) - - template< - typename FunctionPtr, - typename R BOOST_FUNCTION_COMMA - BOOST_FUNCTION_TEMPLATE_PARMS - > - struct BOOST_FUNCTION_GET_FUNCTION_INVOKER - { - typedef typename ct_if<(is_void::value), - BOOST_FUNCTION_VOID_FUNCTION_INVOKER< - FunctionPtr, - R BOOST_FUNCTION_COMMA - BOOST_FUNCTION_TEMPLATE_ARGS - >, - BOOST_FUNCTION_FUNCTION_INVOKER< - FunctionPtr, - R BOOST_FUNCTION_COMMA - BOOST_FUNCTION_TEMPLATE_ARGS - > - >::type type; - }; - -Using HOPTER, this can be written as: - - template< typename FunctionPtr, typename R, @CLASSARGS> - struct get_function_invoker@NUM - { - typedef typename ct_if<(is_void::value), - void_function_invoker@NUM, - function_invoker@NUM - >::type type; - }; -*/ - -int MaxNumArgs; - -/// Makes the necessary subsititutions in 'bigblock', and writes to fout. -void PrintVarArgs(FILE *fout, CString bigblock, int num) { - CString numstr; - CString invokelist; - CString funclist; - CString selectlist; - CString classlist; - CString commastr; - numstr.Format("%d", num); - if (num==0) { - invokelist=""; - funclist=""; - selectlist=""; - commastr=""; - classlist=""; - }else { - invokelist="p1"; - funclist="Param1 p1"; - selectlist = "Param1"; - classlist = "class Param1"; - commastr=", "; - CString str; - for (int k=2; k<=num; k++) { - str.Format(", p%d", k); - invokelist+=str; - str.Format(", Param%d p%d", k, k); - funclist+=str; - str.Format(", Param%d", k); - selectlist += str; - str.Format(", class Param%d", k); - classlist += str; - } - } - - // Simple replacement of number of arguments - bigblock.Replace("@NUM", numstr); - - // Template declarations - if (num==0) bigblock.Replace("template<@CLASSARGS>", ""); - else bigblock.Replace("template<@CLASSARGS>", - (CString)"template<" + classlist+">"); - if (num==0) bigblock.Replace("template <@CLASSARGS>", ""); - else bigblock.Replace("template <@CLASSARGS>", - (CString)"template<" + classlist+">"); - bigblock.Replace(",@CLASSARGS", commastr + classlist); - bigblock.Replace(", @CLASSARGS", commastr + classlist); - bigblock.Replace("@CLASSARGS, ", classlist + commastr); - bigblock.Replace("@CLASSARGS,", classlist + commastr); - bigblock.Replace("@CLASSARGS", classlist); - - // Template selections - CString selargstr; - if (num==0) selargstr = ""; - else selargstr = (CString)"<"+selectlist+">"; - - bigblock.Replace("<@SELARGS>", selargstr); - bigblock.Replace("< @SELARGS >", selargstr); - bigblock.Replace(",@SELARGS", commastr + selectlist); - bigblock.Replace(", @SELARGS", commastr + selectlist); - bigblock.Replace("@SELARGS, ", selectlist + commastr); - bigblock.Replace("@SELARGS,", selectlist + commastr); - bigblock.Replace("@SELARGS", selectlist); - - // Function declarations - bigblock.Replace(",@FUNCARGS", commastr + funclist); - bigblock.Replace(", @FUNCARGS", commastr + funclist); - bigblock.Replace("@FUNCARGS, ", funclist + commastr); - bigblock.Replace("@FUNCARGS,", funclist + commastr); - bigblock.Replace("@FUNCARGS", funclist); - - // Function invocation - bigblock.Replace(",@INVOKEARGS", commastr + invokelist); - bigblock.Replace(", @INVOKEARGS", commastr + invokelist); - bigblock.Replace("@INVOKEARGS, ", invokelist + commastr); - bigblock.Replace("@INVOKEARGS,", invokelist + commastr); - bigblock.Replace("@INVOKEARGS", invokelist); - - fprintf(fout, bigblock); -} - -int action_hopter(int numargs, const char *filenamein, const char *filenameout) -{ - - MaxNumArgs = numargs; - - FILE * fin; - FILE *fout; - - fin =fopen(filenamein,"rt"); - if (!fin) { printf("Error, can't open %s\n", filenamein); return 1; }; - fout = fopen (filenameout, "wt"); - if (!fout) { printf("Error, can't open %s\n", filenameout); return 1; }; - char buf[5000]; - for (;;) { - if (!fgets(buf, 5000, fin)) break; - if (!strncmp(buf, "@VARARGS", 8)) { - // found a match... - CString bigblock; - for (;;) { - if (feof(fin)) { printf("No matching @ENDVAR !!??\n"); return 1; }; - fgets(buf, 5000, fin); - if (!strncmp(buf, "@ENDVAR", 7)) break; - bigblock+=buf; - } -// fprintf(fout, "// Auto-generated code [[[\n"); - for (int k=0; k<=MaxNumArgs; k++) { - fprintf(fout, "//N=%d\n", k); - PrintVarArgs(fout, bigblock, k); - } -// fprintf(fout, "// ]]] End auto-generated code\n"); - } else { - fprintf(fout, "%s", buf); - } - } - fclose(fin); - fclose(fout); - return 0; -} diff --git a/sourcehook/generate/shworker/msvc7/shworker.vcproj b/sourcehook/generate/shworker/msvc7/shworker.vcproj deleted file mode 100644 index 159bd19..0000000 --- a/sourcehook/generate/shworker/msvc7/shworker.vcproj +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcehook/generate/shworker/msvc8/shworker.vcproj b/sourcehook/generate/shworker/msvc8/shworker.vcproj deleted file mode 100644 index 997949d..0000000 --- a/sourcehook/generate/shworker/msvc8/shworker.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcehook/generate/shworker/shworker.cpp b/sourcehook/generate/shworker/shworker.cpp deleted file mode 100644 index 5e0047c..0000000 --- a/sourcehook/generate/shworker/shworker.cpp +++ /dev/null @@ -1,767 +0,0 @@ -// SHWorker -// Inspired by "Hopter" that comes with FastDelegate (http://www.codeproject.com/cpp/FastDelegate.asp) -// Much more powerful (and ugly) though - -/* - - INPUT FILE DIRECTIVES - - $a is the first additional argument, $b the second, ... - - --- - ITERATION - - @[variable,min,max:code|separator@] - - variable: this will be replaced in code by its current value. - vars are always $ and a number. - min: first value to be used for variable - max: last value to be used for variable - code: the code that will be inserted on each iteration. - separator: optional. this will be inserted between iterations. - If you don't use a separator, you may leave out the | - IMPORTANT: iterations will only be performed if max >= min - - --- ARITHMETIC EXPRESSION - - @(expr) - - expr may contain: - variables - constants - operators (currently only + and * are supported) - - --- CONDITION - - @[expr operator expr:code@] - - Example: @[$1!=0:hello@] - - Currently only != and == are supported operators. - - - Yes, error handling in here is weird, some stuff uses return values, other code uses exceptions. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include "stdio.h" - -#ifdef __linux__ -# define stricmp strcasecmp -#endif - -// Ensure that the template version is being used! -#ifdef min -#undef min -#endif - -using namespace std; - -extern int action_hopter(int numargs, const char *filenamein, const char *filenameout); - -typedef map varmap; - -struct MyError -{ - const char *m_desc; - - MyError(const char *desc) : m_desc(desc) - { - } - - void Print() - { - cout << m_desc << endl; - } -}; - -struct SyntaxError : MyError -{ - SyntaxError() : MyError("Syntax error in expression") - { - } -}; -struct OtherError : MyError -{ - OtherError() : MyError("WTF") - { - } -}; - -void trim_string(std::string &str) -{ - size_t first = str.find_first_not_of(" \t\v\n\r"); - if (first == std::string::npos) - { - str.clear(); - return; - } - - size_t last = str.length(); - for (std::string::reverse_iterator riter = str.rbegin(); riter != str.rend(); ++riter) - { - char ch = *riter; - if (ch != ' ' && - ch != '\t' && - ch != '\v' && - ch != '\n' && - ch != '\r') - break; - --last; - } - str = str.substr(first, last - first); -} - -// unused -bool ExtractToken(std::string &strin, std::string &strout) -{ - trim_string(strin); - if (strin.begin() == strin.end()) - { - strout.clear(); - return false; - } - size_t first = strin.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFHIJKLMNOPQRSTUVWXYZ_0123456789"); - if (first == 0) - { - if (strin.size() > 1 && strin.at(0) == '/' && strin.at(1) == '/') - { - // One-line comment, find its end - first = strin.find('\n') + 1; - } - else if (strin.size() > 1 && strin.at(0) == '/' && strin.at(1) == '*') - { - // Multi-line comment, find its end - first = strin.find("*/") + 2; - } - strin = strin.substr(1); - strout.clear(); - return true; - } - strout = strin.substr(0, first); - strin = strin.substr(first); - return true; -} - -// Returns the number of occurencies replaced -int DoReplace(string &str, const string &what, const string &with) -{ - int cnt=0; - size_t where = str.find(what); - - while (where != string::npos) - { - str.replace(where, what.size(), with); - ++cnt; - where = str.find(what, where); - } - return cnt; -} - -int DoReplace(string &str, const char *what, const char *with) -{ - int cnt=0; - size_t where = str.find(what); - size_t whatsize = strlen(what); - while (where != string::npos) - { - str.replace(where, whatsize, with); - ++cnt; - where = str.find(what, where); - } - return cnt; -} - - -class ExprParser -{ - // grammar: - /* - expr -> expr + term { do_add } - | expr - term { do_sub } - | term - - term -> term * factor { do_mul } - | term / factor { do_div } - | term % factor { do_mod } - - factor -> (expr) - | numeric constant { push } - - - equivalent to: - - expr -> term moreterms - moreterms -> + term { do_add } moreterms - moreterms -> - term { do_sub } moreterms - moreterms -> epsilon - - term -> factor morefactors - morefactors -> * factor { do_mul } morefactors - morefactors -> / factor { do_div } morefactors - morefactors -> % factor { do_mod } morefactors - morefactors -> epsilon - - factor -> (expr) - factor -> numeric constant { push } - - */ - - string::const_iterator m_begin; - string::const_iterator m_end; - string::const_iterator m_iter; - - int m_lookahead; - int m_tokenval; - - stack m_stack; - static const int DONE = 256; - static const int NUM = 257; - - int lexan() - { - while (1) - { - if (m_iter == m_end) - return DONE; - - int t = *m_iter++; - - if (t == ' ' || t == '\t') - ; // Remove whitespace - else if (isdigit(t)) - { - --m_iter; - - m_tokenval = 0; - while (m_iter != m_end && isdigit(*m_iter)) - { - m_tokenval *= 10; - m_tokenval += *m_iter - '0'; - ++m_iter; - } - return NUM; - } - else - return t; - } - } - - void match(int t) - { - if (m_lookahead == t) - m_lookahead = lexan(); - else - throw SyntaxError(); - } - void factor() - { - switch (m_lookahead) - { - case '(': - match('('); expr(); match(')'); - break; - case NUM: - m_stack.push(m_tokenval); match(NUM); - break; - default: - throw SyntaxError(); - } - } - void term() - { - factor(); - while (1) - { - switch (m_lookahead) - { - case '*': - match('*'); factor(); do_mul(); - continue; - case '/': - match('/'); factor(); do_div(); - continue; - case '%': - match('%'); factor(); do_mod(); - continue; - default: - return; - } - - } - } - - void expr() - { - term(); - while (1) - { - switch (m_lookahead) - { - case '+': - match('+'); term(); do_add(); - continue; - case '-': - match('-'); term(); do_sub(); - continue; - default: - return; - } - } - } - - void do_add() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 + a2); - } - - void do_sub() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 - a2); - } - - void do_mul() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 * a2); - } - - void do_div() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 / a2); - } - - void do_mod() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 % a2); - } - -public: - ExprParser(string::const_iterator begin, string::const_iterator end) : - m_begin(begin), m_end(end), m_iter(begin) - { - m_lookahead = lexan(); - expr(); - } - - operator int() - { - if (m_stack.size() != 1) - throw OtherError(); - - return m_stack.top(); - } -}; - -int parse_expr(string::const_iterator begin, string::const_iterator end) -{ - return ExprParser(begin, end); -} - -size_t find_first_directive(const string &buf, size_t begin=0) -{ - for (;;) - { - if (begin >= buf.size()) - return string::npos; - - size_t firstdirpos = buf.find('@', begin); - if (firstdirpos == string::npos) - return firstdirpos; - - if (buf.size() > firstdirpos+1) - { - if (buf[firstdirpos+1] == '[' || buf[firstdirpos+1] == '(') - return firstdirpos; - } - begin = firstdirpos+1; - } -} - -// buf begins with a section. Find its end! -size_t find_section_end(const string &buf) -{ - int starttype = buf[1]; - int endtype = (buf[1] == '(') ? ')' : ']'; - - int nestlevel = 0; - - if (starttype == '(') - { - for (string::const_iterator iter = buf.begin(); iter != buf.end(); ++iter) - { - if (*iter == starttype) - ++nestlevel; - if (*iter == endtype) - { - if (--nestlevel == 0) - return iter - buf.begin() + 1; - } - } - return string::npos; - } - else if (starttype == '[') - { - int lastchar = 0; - for (string::const_iterator iter = buf.begin(); iter != buf.end(); ++iter) - { - if (lastchar == '@' && *iter == starttype) - ++nestlevel; - if (lastchar == '@' && *iter == endtype) - { - if (--nestlevel == 0) - return iter - buf.begin() + 1; - } - lastchar = *iter; - } - return string::npos; - } - - return string::npos; -} - -// replaces variables and additional arguments -void replace_vars(string &buf, int argc, int *argv, const varmap &vars) -{ - char varname[] = "$ "; - char value[32]; - - for (int i = 0; i < argc; ++i) - { - varname[1] = 'a' + i; - sprintf(value, "%d", argv[i]); - DoReplace(buf, varname, value); - } - - for (varmap::const_iterator iter = vars.begin(); iter != vars.end(); ++iter) - { - varname[1] = '0' + iter->first; - sprintf(value, "%d", iter->second); - DoReplace(buf, varname, value); - } -} - -// do_input -// params: -// argc: number of additional arguments -// argv: additional arguments -// outfile: output file -// buf: string to be processed. IMPORTANT: buf is modified! -// curvars: variables buffer. -// retval: -// 0 on success, non-zero on error - -int do_input(int argc, int *argv, ofstream &outfile, string &buf, varmap &curvars) -{ - for (;;) - { - // Find the next directive. - size_t firstdirpos = find_first_directive(buf); - - // Output everything that came before, and remove it from buf - outfile << buf.substr(0, firstdirpos); - if (firstdirpos == string::npos) - return 0; - buf = buf.substr(firstdirpos); - - // Now find the matching end. - size_t sectionend = find_section_end(buf); - if (sectionend == string::npos) - { - cout << "ERROR: Section not closed!" << endl; - return 1; - } - - // Place the section in its own buffer and remove it from the input string. - string sect(buf.begin(), buf.begin() + sectionend); - buf = buf.substr(sectionend); - - // CASE1: Arithmetic expression - if (sect[1] == '(') - { - replace_vars(sect, argc, argv, curvars); - outfile << parse_expr(sect.begin()+1, sect.end()); - } - else if (sect[1] == '[') - { - int is_iter = 0; // 0 -> no; 1 -> maybe (only used in check); 2 -> yes - char lastchar = 0; - // This could be an iteration OR a conditional thing. - // Pretty braindead check: iterations begin with a variable, then a comma. - for (string::iterator iter = sect.begin() + 2; iter != sect.end(); ++iter) - { - if (*iter == ' ' || *iter == '\t') - ; - else if (is_iter == 0 && lastchar == '$' && isdigit(*iter)) - is_iter = 1; - else if (is_iter == 1 && *iter == ',') - { - is_iter = 2; - break; - } - else if (*iter == '$') - ; - else - break; - lastchar = *iter; - } - if (is_iter == 2) - { - // CASE2: iteration - // Looks like: @[var,min,max:code|sep@] - // Replace known variables / additional arguments - replace_vars(sect, argc, argv, curvars); - - // get the parts! - string varname; - int varnum; - int expr_min; - int expr_max; - - // varname - size_t comma = sect.find(','); - if (comma == string::npos) - { - cout << "Invalid iteration syntax" << endl; - return 1; - } - varname.assign(sect.begin() + 2, sect.begin() + comma); - trim_string(varname); - if (varname.size() != 2 || varname[0] != '$' || !isdigit(varname[1])) - { - cout << "Invalid variable name" << endl; - return 1; - } - varnum = varname[1] - '0'; - - // min - ++comma; - size_t nextcomma = sect.find(',', comma); - if (nextcomma == string::npos) - { - cout << "Invalid iteration syntax" << endl; - return 1; - } - expr_min = parse_expr(sect.begin() + comma, sect.begin() + nextcomma); - - // max - comma = nextcomma + 1; - nextcomma = sect.find(':', comma); - if (nextcomma == string::npos) - { - cout << "Invalid iteration syntax" << endl; - return 1; - } - - expr_max = parse_expr(sect.begin() + comma, sect.begin() + nextcomma); - - // separator - size_t sepbegin = sect.find('|'); - size_t sepend = string::npos; - if (sepbegin != string::npos && sepbegin < nextcomma) - { - // There's a separator! - ++sepbegin; - sepend = nextcomma; - } - else - sepbegin = string::npos; - - - ++nextcomma; // nextcomma is now where code begins! - - size_t codeend = sect.size() - 2; - - // Check whether the var is already taken - if (curvars.find(varnum) != curvars.end()) - { - cout << "Variable $" << varnum << "already taken!" << endl; - return 1; - } - - // Do iterations!! - for (int i = expr_min; i <= expr_max; ++i) - { - curvars[varnum] = i; - - string code(sect.begin() + nextcomma, sect.begin() + codeend); - replace_vars(code, argc, argv, curvars); - - // Feed it through the input routine (RECURSE!!!!!! YEAH!) - do_input(argc, argv, outfile, code, curvars); - - // Add separator if required - if (sepbegin != string::npos && i != expr_max) - { - string tmp(sect.begin() + sepbegin, sect.begin() + sepend); - do_input(argc, argv, outfile, tmp, curvars); - } - } - // Remove the var! - curvars.erase(varnum); - } - else - { - // CASE3: conditional thing. - // Looks like: @[expr1 operator expr2:code@] - - // Find the operator position - - enum OP_TYPE - { - OP_EQ, - OP_NEQ - }; - - OP_TYPE op; - size_t oppos = sect.find("=="); - if (oppos != string::npos) - op = OP_EQ; - else - { - oppos = sect.find("!="); - if (oppos != string::npos) - op = OP_NEQ; - else - { - cout << "Conditional expression without operator!?" << endl; - return 1; - } - } - size_t colon = sect.find(':'); - - // Now we've got everything. Parse first expr: - int expr1 = parse_expr(sect.begin() + 2, sect.begin() + oppos); - int expr2 = parse_expr(sect.begin() + oppos + 2, sect.begin() + colon); - if ((op == OP_EQ && expr1 == expr2) || - (op == OP_NEQ && expr1 != expr2)) - { - // Condition is true, process it! - // The text may still contain arithmetic exprs or other cond. exprs - // so send it through do_input - string tmp(sect.substr(colon+1, sect.size() - colon - 3)); - do_input(argc, argv, outfile, tmp, curvars); - } - } - } - else - { - cout << "WTF" << endl; - return 1; - } - } - - return 0; -} - - - -// action_iter -// params: -// filenamein: input file name -// filenameout: output file name -// argc: number of additional arguments -// argv: additional arguments -// retval: 0 on success, non-zero on error - -// Convert additional arguments -// Read whole input file to memory and open output file -// Pass to do_input() -int action_iter(const char *filenamein, const char *filenameout, int argc, const char *argv[]) -{ - // Convert additional arguments - const int MAX_ARGC = 10; - int converted_argv[MAX_ARGC]; - - int i; - for (i = 0; i < argc && i < MAX_ARGC; ++i) - converted_argv[i] = atoi(argv[i]); - - if (argc != i) - cout << "WARNING: Not all additional arguments processed!" << endl; - - - // Read whole input file to memory and open output file - ifstream fin(filenamein); - ofstream fout(filenameout); - - if (!fin) - { - cout << "Could not open file \"" << filenamein << "\"." << endl; - return 1; - } - if (!fout) - { - cout << "Could not open file \"" << filenameout << "\"." << endl; - return 1; - } - string input_str( - istreambuf_iterator (fin.rdbuf()), - istreambuf_iterator ()); - - - // Begin processing input - varmap vars; - try - { - return do_input(argc, converted_argv, fout, input_str, vars); - } - catch (MyError err) - { - err.Print(); - return 1; - } -} - -// MAIN -// Prints usage if required -// Calls action_hopter OR action_iter -int main(int argc, const char **argv) -{ - if (argc < 4) - { - cout << "Usage:" << endl << " shworker [iter/hopter] ..." << endl; - cout << " shworker iter filename.in filename.out [param1, param2, ...]" << endl; - cout << " shworker hopter filename.in filename.out [num-of-args]" << endl; - return 1; - } - - const char *action = argv[1]; - - if (stricmp(action, "hopter") == 0) - { - const char *filenamein = argv[2]; - const char *filenameout = argv[3]; - int argsnum = atoi(argv[4]); - - return action_hopter(argsnum, filenamein, filenameout); - } - else if (stricmp(action, "iter") == 0) - { - const char *filenamein = argv[2]; - const char *filenameout = argv[3]; - int additional_argc = argc - 4; - const char ** additional_argv = argv + 4; - return action_iter(filenamein, filenameout, additional_argc, additional_argv); - } - else - { - cout << "Unrecognized action: " << argv[1] << endl; - return 1; - } -} diff --git a/sourcehook/generate/sourcehook.h b/sourcehook/generate/sourcehook.h deleted file mode 100644 index a75e271..0000000 --- a/sourcehook/generate/sourcehook.h +++ /dev/null @@ -1,6537 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** -* @file sourcehook.h -* @brief Contains the public SourceHook API -*/ - -#ifndef __SOURCEHOOK_H__ -#define __SOURCEHOOK_H__ - -// Interface revisions: -// 1 - Initial revision -// 2 - Changed to virtual functions for iterators and all queries -// 3 - Added "hook loop status variable" -// 4 - Reentrant -#define SH_IFACE_VERSION 4 - -// Impl versions: -// ??? -// 4 - addition of hook ids and vp hooks (with them, AddHookNew and RemoveHookNew) -// This is not a SH_IFACE_VERSION change so that old plugins continue working! -// 5 - addition of direct vp hooks (new hook mode; from now on AddHookNew checks for -// invalid hookmode -> impl version won't have to change because of things like this) -#define SH_IMPL_VERSION 5 - -// Hookman version: -// 1 - Support for recalls, performance optimisations -#define SH_HOOKMAN_VERSION 1 - -// The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook -// It's used in various macros -#ifndef SH_GLOB_SHPTR -#define SH_GLOB_SHPTR g_SHPtr -#endif - -// Used to identify the current plugin -#ifndef SH_GLOB_PLUGPTR -#define SH_GLOB_PLUGPTR g_PLID -#endif - -#ifdef SH_DEBUG -# include -# include - -# define SH_ASSERT(x, info) \ - do { \ - if (!(x)) \ - { \ - printf("SOURCEHOOK DEBUG ASSERTION FAILED: %s:%u(%s): %s: ", __FILE__, __LINE__, __FUNCTION__, #x); \ - printf info; \ - putchar('\n'); \ - abort(); \ - } \ - } while(0) - -#else -# define SH_ASSERT(x, info) -#endif - -// System -#define SH_SYS_WIN32 1 -#define SH_SYS_LINUX 2 - -#ifdef _WIN32 -# define SH_SYS SH_SYS_WIN32 -#elif defined __linux__ -# define SH_SYS SH_SYS_LINUX -#else -# error Unsupported system -#endif - -// Compiler -#define SH_COMP_GCC 1 -#define SH_COMP_MSVC 2 - -#ifdef _MSC_VER -# define SH_COMP SH_COMP_MSVC -#elif defined __GNUC__ -# define SH_COMP SH_COMP_GCC -#else -# error Unsupported compiler -#endif - -#if SH_COMP==SH_COMP_MSVC -# define vsnprintf _vsnprintf -#endif - -#if SH_SYS != SH_SYS_WIN32 -# include -#endif - -#define SH_PTRSIZE sizeof(void*) - -#include "FastDelegate.h" -#include "sh_memfuncinfo.h" - -// Good old metamod! - -// Flags returned by a plugin's api function. -// NOTE: order is crucial, as greater/less comparisons are made. -enum META_RES -{ - MRES_IGNORED=0, // plugin didn't take any action - MRES_HANDLED, // plugin did something, but real function should still be called - MRES_OVERRIDE, // call real function, but use my return value - MRES_SUPERCEDE // skip real function; use my return value -}; - - -namespace SourceHook -{ - /** - * @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers - */ - const int STRBUF_LEN=4096; - - /** - * @brief An empty class. No inheritance used. Used for original-function-call hacks - */ - class EmptyClass - { - }; - - /** - * @brief Implicit cast. - */ - template - inline Out implicit_cast(In input) - { - return input; - } - - /** - * @brief A plugin typedef - * - * SourceHook doesn't really care what this is. As long as the ==, != and = operators work on it and every - * plugin has a unique identifier, everything is ok. - * It should also be possible to set it to 0. - */ - typedef int Plugin; - - struct ProtoInfo - { - ProtoInfo(int rtsz, int nop, const int *p) : beginningNull(0), retTypeSize(rtsz), numOfParams(nop), params(p) - { - } - int beginningNull; //!< To distinguish from old protos (which never begin with 0) - int retTypeSize; //!< 0 if void - int numOfParams; //!< number of parameters - const int *params; //!< params[0]=0 (or -1 for vararg), params[1]=size of first param, ... - }; - - /** - * @brief Specifies the actions for hook managers - */ - enum HookManagerAction - { - HA_GetInfo = 0, //!< Store info about the hook manager - HA_Register, //!< Save the IHookManagerInfo pointer for future reference - HA_Unregister //!< Clear the saved pointer - }; - - struct IHookManagerInfo; - - /** - * @brief Pointer to hook manager interface function - * - * A "hook manager" is a the only thing that knows the actual protoype of the function at compile time. - * - * @param ha What the hook manager should do - * @param hi A pointer to IHookManagerInfo - */ - typedef int (*HookManagerPubFunc)(HookManagerAction ha, IHookManagerInfo *hi); - - class ISHDelegate - { - public: - virtual void DeleteThis() = 0; // Ugly, I know - virtual bool IsEqual(ISHDelegate *other) = 0; - }; - - template class CSHDelegate : public ISHDelegate - { - T m_Deleg; - public: - CSHDelegate(T deleg) : m_Deleg(deleg) - { - } - - CSHDelegate(const CSHDelegate &other) : m_Deleg(other.m_Deleg) - { - } - - void DeleteThis() - { - delete this; - } - - bool IsEqual(ISHDelegate *other) - { - return static_cast* >(other)->GetDeleg() == GetDeleg(); - } - - T &GetDeleg() - { - return m_Deleg; - } - }; - - struct IHookList - { - struct IIter - { - virtual bool End() = 0; - virtual void Next() = 0; - virtual ISHDelegate *Handler() = 0; - virtual int ThisPtrOffs() = 0; - }; - virtual IIter *GetIter() = 0; - virtual void ReleaseIter(IIter *pIter) = 0; - }; - - struct IIface - { - virtual void *GetPtr() = 0; - virtual IHookList *GetPreHooks() = 0; - virtual IHookList *GetPostHooks() = 0; - }; - - struct IVfnPtr - { - virtual void *GetVfnPtr() = 0; - virtual void *GetOrigEntry() = 0; - - virtual IIface *FindIface(void *ptr) = 0; - }; - - struct IHookManagerInfo - { - virtual IVfnPtr *FindVfnPtr(void *vfnptr) = 0; - - virtual void SetInfo(int vtbloffs, int vtblidx, const char *proto) = 0; - virtual void SetHookfuncVfnptr(void *hookfunc_vfnptr) = 0; - - // Added 23.12.2005 (yup! I'm coding RIGHT BEFORE CHRISTMAS!) - // If the hookman doesn't set this, it defaults 0 - // SourceHook prefers hookmans with higher version numbers - virtual void SetVersion(int version) = 0; - }; - - class AutoHookIter - { - IHookList *m_pList; - IHookList::IIter *m_pIter; - public: - AutoHookIter(IHookList *pList) - : m_pList(pList), m_pIter(pList->GetIter()) - { - } - - ~AutoHookIter() - { - if (m_pList) - m_pList->ReleaseIter(m_pIter); - } - - bool End() - { - return m_pIter->End(); - } - - void Next() - { - m_pIter->Next(); - } - - ISHDelegate *Handler() - { - return m_pIter->Handler(); - } - - int ThisPtrOffs() - { - return m_pIter->ThisPtrOffs(); - } - - void SetToZero() - { - m_pList = 0; - } - }; - - template struct DeprecatedCallClass - { - virtual B *GetThisPtr() = 0; - virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; - }; - - // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) - // - Today is an important day. - // I'm adding support for functions which return references. - - // How it works: - // SH_SETUPCALLS doesn't use plain rettype to store the temporary return values (plugin ret, orig ret, - // override ret) anymore; instead, it uses SourceHook::ReferenceCarrier::type - // this is typedefed to the original rettype normally, but if the rettype is a reference, it's a special class - // which stores the reference as a pointer, and implements constructors, operator= and a conversion operator. - // special cases were needed for getoverrideret / getorigret; these are implemented through the - // SourceHook::MacroRefHelpers structs. - // Furthermore, SetOverrideRet had to be changed a bit; see SourceHook::OverrideFunctor somewhere down in this file. - template struct ReferenceCarrier - { - typedef T type; - }; - - template struct ReferenceCarrier - { - class type - { - T *m_StoredRef; - public: - type() : m_StoredRef(NULL) - { - } - type(T& ref) : m_StoredRef(&ref) - { - } - - T& operator= (T& ref) - { - m_StoredRef = &ref; - return ref; - } - - operator T& () const - { - return *m_StoredRef; - } - }; - }; - - /** - * @brief The main SourceHook interface - */ - class ISourceHook - { - public: - /** - * @brief Return interface version - */ - virtual int GetIfaceVersion() = 0; - - /** - * @brief Return implementation version - */ - virtual int GetImplVersion() = 0; - - /** - * @brief Add a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Removes a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins - * - * @param plug The unique identifier of the plugin in question - */ - virtual bool IsPluginInUse(Plugin plug) = 0; - - /** - * @brief Return a pointer to a callclass. Generate a new one if required. - * - * @param iface The interface pointer - * @param size Size of the class instance - */ - virtual DeprecatedCallClass *GetCallClass(void *iface, size_t size) = 0; - - /** - * @brief Release a callclass - * - * @param ptr Pointer to the callclass - */ - virtual void ReleaseCallClass(DeprecatedCallClass *ptr) = 0; - - virtual void SetRes(META_RES res) = 0; //!< Sets the meta result - virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the - //!< previously calledhandler - virtual META_RES GetStatus() = 0; //!< Gets the highest meta result - virtual const void *GetOrigRet() = 0; //!< Gets the original result. - //!< If not in post function, undefined - virtual const void *GetOverrideRet() = 0; //!< Gets the override result. - //!< If none is specified, NULL - virtual void *GetIfacePtr() = 0; //!< Gets the interface pointer - ////////////////////////////////////////////////////////////////////////// - // For hook managers - virtual void HookLoopBegin(IIface *pIface) = 0; //!< Should be called when a hook loop begins - virtual void HookLoopEnd() = 0; //!< Should be called when a hook loop exits - virtual void SetCurResPtr(META_RES *mres) = 0; //!< Sets pointer to the current meta result - virtual void SetPrevResPtr(META_RES *mres) = 0; //!< Sets pointer to previous meta result - virtual void SetStatusPtr(META_RES *mres) = 0; //!< Sets pointer to the status variable - virtual void SetIfacePtrPtr(void **pp) = 0; //!< Sets pointer to the interface this pointer - virtual void SetOrigRetPtr(const void *ptr) = 0; //!< Sets the original return pointer - virtual void SetOverrideRetPtr(void *ptr) = 0; //!< Sets the override result pointer - virtual bool ShouldContinue() = 0; //!< Returns false if the hook loop should exit - - /** - * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. - * - * @param plug The owner of the hook manager - * @param pubFunc The hook manager's info function - */ - virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) = 0; - - virtual void DoRecall() = 0; //!< Initiates a recall sequence - /* - HOW RECALLS WORK: - - The problem: - Users want the ability to change parameters of the called function - from inside their handler. - The solution: - 1) Mark as "recall" - 2) Recall the function - 3) => SH's hook func gets called: - 4) The first iterator points at the first hook the last hookfunc didn't execute yet - 5) does all iteration and returns normally - 6) The user's handler returns immediately - 7) The hook func returns immediately as well - - Also note that the recalled hookfunc starts with the status the recalling hookfunc - ended with. The last handler (doing the recall) is also able to specify its own - META_RES. - */ - - virtual void *GetOverrideRetPtr() = 0; //!< Returns the pointer set by SetOverrideRetPtr - - /** - * @brief Set up the hook loop. Equivalent to calling: - * SetStatusPtr, SetPrevResPtr, SetCurResPtr, SetIfacePtrPtr, SetOrigRetPtr, Get/SetOverrideRetPtr - * - * @param statusPtr pointer to status variable - * @param prevResPtr pointer to previous result variable - * @param curResPtr pointer to current result variable - * @param ifacePtrPtr pointer to interface this pointer variable - * @param origRetPr pointer to original return value variable. NULL for void funcs - * @param overrideRetPtr pointer to override return value variable. NULL for void funcs - * - * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr - * when the hook func is being called as part of a recall - */ - virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; - - /** - * @brief Modes for the new AddHook - */ - enum AddHookMode - { - Hook_Normal, - Hook_VP, - Hook_DVP - }; - - /** - * @brief Add a (VP) hook. - * - * @return non-zero hook id on success, 0 otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param mode Can be either Hook_Normal or Hook_VP (vtable-wide hook) - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual int AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Remove a VP hook by ID. - * - * @return true on success, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param hookid The hook id (returned by AddHookNew) - */ - virtual bool RemoveHookByID(Plugin plug, int hookid) = 0; - - /** - * @brief Makes sure that hooks are going to be ignored on the next call of vfnptr - * - * @param plug The unique identifier of the plugin that calls this function - * @param vfnptr The virtual function pointer of the function in question - */ - virtual void SetIgnoreHooks(Plugin plug, void *vfnptr) = 0; - - /** - * @brief Reverses SetIgnoreHooks' effect - * - * @param plug The unique identifier of the plugin that calls this function - * @param vfnptr The virtual function pointer of the function in question - */ - virtual void ResetIgnoreHooks(Plugin plug, void *vfnptr) = 0; - - /** - * @brief Finds the original entry of a virtual function pointer - * - * @param vfnptr The virtual function pointer - * @return The original entry if the virtual function pointer has been patched; NULL otherwise. - */ - virtual void *GetOrigVfnPtrEntry(void *vfnptr) = 0; - }; - - // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: - // These have to be able to return references. If T is a reference, the pointers returned - // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. - template struct MacroRefHelpers - { - inline static const T* GetOrigRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOrigRet()); - } - inline static const T* GetOverrideRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOverrideRet()); - } - }; - - template struct MacroRefHelpers - { - inline static T* GetOrigRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOrigRet()); - return &ref; - } - inline static T* GetOverrideRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOverrideRet()); - return &ref; - } - }; - - // For source-level compatibility - template struct CallClass - { - T *ptr; - - CallClass(T *p) : ptr(p) - { - } - - operator T*() - { - return ptr; - } - }; - - typedef CallClass GenericCallClass; - typedef CallClass ManualCallClass; - - template - CallClass *GetCallClass(T *p) - { - return new CallClass(p); - } - - template - void ReleaseCallClass(CallClass *p) - { - delete p; - } - - template - void *GetOrigVfnPtrEntry(X *pInstance, MFP mfp, ISourceHook *pSH) - { - SourceHook::MemFuncInfo info = {true, -1, 0, 0}; - SourceHook::GetFuncInfo(pInstance, mfp, info); - - void *vfnptr = reinterpret_cast( - *reinterpret_cast(reinterpret_cast(pInstance) + info.thisptroffs + info.vtbloffs) + info.vtblindex); - - void *origentry = pSH->GetOrigVfnPtrEntry(vfnptr); - - return origentry ? origentry : *reinterpret_cast(vfnptr); - } -} - -/************************************************************************/ -/* High level interface */ -/************************************************************************/ -#define META_RESULT_STATUS SH_GLOB_SHPTR->GetStatus() -#define META_RESULT_PREVIOUS SH_GLOB_SHPTR->GetPrevRes() -#define META_RESULT_ORIG_RET(type) *SourceHook::MacroRefHelpers::GetOrigRet(SH_GLOB_SHPTR) -#define META_RESULT_OVERRIDE_RET(type) *SourceHook::MacroRefHelpers::GetOverrideRet(SH_GLOB_SHPTR) -#define META_IFACEPTR(type) reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()) - -#define SET_META_RESULT(result) SH_GLOB_SHPTR->SetRes(result) -#define RETURN_META(result) do { SET_META_RESULT(result); return; } while(0) -#define RETURN_META_VALUE(result, value) do { SET_META_RESULT(result); return (value); } while(0) - -// If a hook on a function which returns a reference does not want to specify a return value, -// it can use this macro. -// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! -#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) - -// only call these from the hook handlers directly! -// :TODO: enforce it ? - -// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? -// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE - -// SourceHook::SetOverrideRet is defined later. -#define RETURN_META_NEWPARAMS(result, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_NEWPARAMS(result, value, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* meh, set the override result here because we don't get a chance to return */ \ - /* before continuing the hook loop through the recall */ \ - SourceHook::SetOverrideResult(memfuncptr)(SH_GLOB_SHPTR, value); \ - } \ - RETURN_META_VALUE(MRES_SUPERCEDE, \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams); \ - } while (0) - -// :TODO: thisptroffs in MNEWPARAMS ?? - -#if SH_COMP == SH_COMP_MSVC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - void *addr; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; - -#elif SH_COMP == SH_COMP_GCC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.s.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; \ - u.s.adjustor = 0; - -#endif - -#define RETURN_META_MNEWPARAMS(result, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - (thisptr->*(u.mfp)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_MNEWPARAMS(result, value, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* see RETURN_META_VALUE_NEWPARAMS */ \ - SourceHook::SetOverrideResult(SH_GLOB_SHPTR, value); \ - } \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ - } while (0) - -#define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ - do { \ - SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ - SH_MFHCls(hookname)::ms_MFI.thisptroffs = pthisptroffs; \ - SH_MFHCls(hookname)::ms_MFI.vtblindex = pvtblindex; \ - SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ - } while (0) - - -#define SH_GET_ORIG_VFNPTR_ENTRY(inst, mfp) (SourceHook::GetOrigVfnPtrEntry(inst, mfp, SH_GLOB_SHPTR)) - -// For source-level compatibility - -#define SH_GET_CALLCLASS(ptr) SourceHook::GetCallClass(ptr) -#define SH_GET_MCALLCLASS(ptr, size) SourceHook::GetCallClass(reinterpret_cast(ptr)) -#define SH_RELEASE_CALLCLASS(ptr) SourceHook::ReleaseCallClass(ptr) - -// New ADD / REMOVE macros. -#define SH_STATIC(func) fastdelegate::MakeDelegate(func) -#define SH_MEMBER(inst, func) fastdelegate::MakeDelegate(inst, func) - -#define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) - -#define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) - -#define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) - -#define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) - -#define SH_ADD_VPHOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHVPAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler, false) - -#define SH_ADD_DVPHOOK(ifacetype, ifacefunc, vtableptr, handler, post) \ - __SourceHook_FHVPAdd##ifacetype##ifacefunc(reinterpret_cast(vtableptr), \ - post, handler, true) - -#define SH_ADD_MANUALVPHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMVPAdd##hookname(reinterpret_cast(ifaceptr), post, handler, false) - -#define SH_ADD_MANUALDVPHOOK(hookname, vtableptr, handler, post) \ - __SourceHook_FHMVPAdd##hookname(reinterpret_cast(vtableptr), post, handler, true) - -#define SH_REMOVE_HOOK_ID(hookid) \ - (SH_GLOB_SHPTR->RemoveHookByID(SH_GLOB_PLUGPTR, hookid)) - -// Old macros -// !! These are now deprecated. Instead, use one of these: -// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -#define SH_NOATTRIB - - - - -#if SH_COMP == SH_COMP_MSVC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; -#elif SH_COMP == SH_COMP_GCC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; \ - reinterpret_cast(&mfp)[1] = 0; -#else -# error Not supported yet. -#endif - -////////////////////////////////////////////////////////////////////////// -#define SH_FHCls(ift, iff, ov) __SourceHook_FHCls_##ift##iff##ov -#define SH_MFHCls(hookname) __SourceHook_MFHCls_##hookname - -#define SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) \ - SH_FHCls(ifacetype,ifacefunc,overload)() \ - { \ - GetFuncInfo(funcptr, ms_MFI); \ - } \ - \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - GetFuncInfo(funcptr, ms_MFI); \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_FHCls(ifacetype,ifacefunc,overload)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -// It has to be possible to use the macros in namespaces -// -> So we need to access and extend the global SourceHook namespace -// We use a namespace alias for this -#define SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, funcptr) \ - struct SH_FHCls(ifacetype,ifacefunc,overload) \ - { \ - static SH_FHCls(ifacetype,ifacefunc,overload) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) - -#define SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, funcptr) \ - }; \ - SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ - int __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ - return false; /* No non-virtual functions / virtual inheritance supported */ \ - \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ - new CSHDelegate(handler), post); \ - } \ - int __SourceHook_FHVPAdd##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler, bool direct) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ - return false; /* No non-virtual functions / virtual inheritance supported */ \ - \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ - direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ - iface, mfi.thisptroffs, SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ - new CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0) \ - return false; /* No virtual inheritance supported */ \ - \ - CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, &tmp, post); \ - } \ - -#define SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - struct SH_MFHCls(hookname) \ - { \ - static SH_MFHCls(hookname) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - \ - SH_MFHCls(hookname)() \ - { \ - ms_MFI.isVirtual = true; \ - ms_MFI.thisptroffs = pthisptroffs; \ - ms_MFI.vtblindex = pvtblidx; \ - ms_MFI.vtbloffs = pvtbloffs; \ - } \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - /* we don't set ms_MFI here because manual hookmans can be reconfigured */ \ - /* :FIXME: possible problem: someone adding a hook from a constructor of a global entity */ \ - /* which is construced before SH_MFHCls(hookname)() gets called? */ \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_MFHCls(hookname)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -#define SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - }; \ - SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ - int __SourceHook_FHMAdd##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, \ - new ::SourceHook::CSHDelegate(handler), post); \ - } \ - int __SourceHook_FHMVPAdd##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler, bool direct) \ - { \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ - direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ - iface, pthisptroffs, SH_MFHCls(hookname)::HookManPubFunc, \ - new ::SourceHook::CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - ::SourceHook::CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, &tmp, post); \ - } \ - - -#define SH_SETUPCALLS(rettype, paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - return (reinterpret_cast(this)->*mfp)params; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - typedef ReferenceCarrier::type my_rettype; \ - my_rettype orig_ret; \ - my_rettype override_ret; \ - my_rettype plugin_ret; \ - void* ifptr; \ - my_rettype *pOverrideRet = reinterpret_cast(SH_GLOB_SHPTR->SetupHookLoop( \ - &status, &prev_res, &cur_res, &ifptr, &orig_ret, &override_ret)); - -#define SH_CALL_HOOKS(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - plugin_ret = reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (cur_res >= MRES_OVERRIDE) \ - *pOverrideRet = plugin_ret; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG(rettype, paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - orig_ret = (reinterpret_cast(this)->*mfp)params; \ - } \ - else \ - orig_ret = override_ret; \ - -#define SH_RETURN() \ - SH_GLOB_SHPTR->HookLoopEnd(); \ - return status >= MRES_OVERRIDE ? *pOverrideRet : orig_ret; - -#define SH_HANDLEFUNC(paramtypes, params, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params) \ - SH_CALL_HOOKS(pre, params) \ - SH_CALL_ORIG(rettype, paramtypes, params) \ - SH_CALL_HOOKS(post, params) \ - SH_RETURN() - -////////////////////////////////////////////////////////////////////////// -#define SH_SETUPCALLS_void(paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - return; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - void* ifptr; \ - SH_GLOB_SHPTR->SetupHookLoop(&status, &prev_res, &cur_res, &ifptr, NULL, NULL); \ - -#define SH_CALL_HOOKS_void(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG_void(paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - } - -#define SH_RETURN_void() \ - SH_GLOB_SHPTR->HookLoopEnd(); - -#define SH_HANDLEFUNC_void(paramtypes, params) \ - SH_SETUPCALLS_void(paramtypes, params) \ - SH_CALL_HOOKS_void(pre, params) \ - SH_CALL_ORIG_void(paramtypes, params) \ - SH_CALL_HOOKS_void(post, params) \ - SH_RETURN_void() - - -// Special vafmt handlers -// :TODO: what -#define SH_HANDLEFUNC_vafmt(paramtypes, params_orig, params_plug, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(pre, params_plug) \ - SH_CALL_ORIG(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(post, params_plug) \ - SH_RETURN() - -#define SH_HANDLEFUNC_void_vafmt(paramtypes, params_orig, params_plug) \ - SH_SETUPCALLS_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(pre, params_plug) \ - SH_CALL_ORIG_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(post, params_plug) \ - SH_RETURN_void() - -////////////////////////////////////////////////////////////////////////// - -// :FIXME: -// sizeof on references returns the size of the datatype, NOT the pointer size or something -// -> one should probably flag references in __SourceHook_ParamSizes_* ! -// or simply assume that their size is sizeof(void*)=SH_PTRSIZE... could be doable through a simple template - - -// ********* Support for 0 arguments ********* -#define SH_DECL_HOOK0(ifacetype, ifacefunc, attr, overload, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate0 FD; \ - virtual rettype Func() \ - { SH_HANDLEFUNC((), (), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_void(ifacetype, ifacefunc, attr, overload) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate0<> FD; \ - virtual void Func() \ - { SH_HANDLEFUNC_void((), ()); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_vafmt(ifacetype, ifacefunc, attr, overload, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((...), ("%s", buf), (buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_void_vafmt(ifacetype, ifacefunc, attr, overload) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((...), ("%s", buf), (buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK0(hookname, vtblidx, vtbloffs, thisptroffs, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate0 FD; \ - virtual rettype Func() \ - { SH_HANDLEFUNC((), (), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK0_void(hookname, vtblidx, vtbloffs, thisptroffs) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate0<> FD; \ - virtual void Func() \ - { SH_HANDLEFUNC_void((), ()); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 0, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 1 arguments ********* -#define SH_DECL_HOOK1(ifacetype, ifacefunc, attr, overload, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(param1 p1) \ - { SH_HANDLEFUNC((param1), (p1), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_void(ifacetype, ifacefunc, attr, overload, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(param1 p1) \ - { SH_HANDLEFUNC_void((param1), (p1)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, ...), (p1, "%s", buf), (p1, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_void_vafmt(ifacetype, ifacefunc, attr, overload, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, ...), (p1, "%s", buf), (p1, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK1(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(param1 p1) \ - { SH_HANDLEFUNC((param1), (p1), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK1_void(hookname, vtblidx, vtbloffs, thisptroffs, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(param1 p1) \ - { SH_HANDLEFUNC_void((param1), (p1)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 1, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 2 arguments ********* -#define SH_DECL_HOOK2(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_void(ifacetype, ifacefunc, attr, overload, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK2(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK2_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 2, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 3 arguments ********* -#define SH_DECL_HOOK3(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK3(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK3_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 3, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 4 arguments ********* -#define SH_DECL_HOOK4(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK4(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK4_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 4, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 5 arguments ********* -#define SH_DECL_HOOK5(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK5(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK5_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 5, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 6 arguments ********* -#define SH_DECL_HOOK6(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK6(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK6_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 6, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 7 arguments ********* -#define SH_DECL_HOOK7(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK7(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK7_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 7, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 8 arguments ********* -#define SH_DECL_HOOK8(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK8(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK8_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 8, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 9 arguments ********* -#define SH_DECL_HOOK9(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK9(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK9_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 9, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 10 arguments ********* -#define SH_DECL_HOOK10(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK10(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK10_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 10, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 11 arguments ********* -#define SH_DECL_HOOK11(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK11(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK11_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 11, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 12 arguments ********* -#define SH_DECL_HOOK12(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK12(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK12_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 12, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 13 arguments ********* -#define SH_DECL_HOOK13(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK13(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK13_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 13, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 14 arguments ********* -#define SH_DECL_HOOK14(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK14(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK14_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 14, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 15 arguments ********* -#define SH_DECL_HOOK15(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK15(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK15_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 15, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 16 arguments ********* -#define SH_DECL_HOOK16(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK16(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK16_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 16, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 17 arguments ********* -#define SH_DECL_HOOK17(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK17(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK17_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 17, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 18 arguments ********* -#define SH_DECL_HOOK18(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK18(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK18_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 18, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 19 arguments ********* -#define SH_DECL_HOOK19(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK19(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK19_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 19, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 20 arguments ********* -#define SH_DECL_HOOK20(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate21 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate21 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK20(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK20_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 20, __SourceHook_ParamSizesM_##hookname); \ - - - - -////////////////////////////////////////////////////////////////////////// -// SH_CALL - -#define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - \ - m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ - RetType tmpret = (m_ThisPtr->*m_MFP)call; \ - m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ - return tmpret; \ -} - -#define SH_MAKE_EXECUTABLECLASS_OB_void(call, prms) \ -{ \ - using namespace ::SourceHook; \ - \ - m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ - (m_ThisPtr->*m_MFP)call; \ - m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ -} - -namespace SourceHook -{ - // Call Class Wrapper! - template struct CCW - { - typedef T type; - - // Get Real Pointer! - static inline T *GRP(T *p) - { - return p; - } - }; - - template struct CCW< CallClass > - { - typedef T type; - - // Get Real Pointer! - static inline T *GRP(CallClass *p) - { - return p->ptr; - } - }; - - - // Support for 0 arguments - template class ExecutableClass0 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass0(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()() const - SH_MAKE_EXECUTABLECLASS_OB((), ()) - - - template RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass0 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass0(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()() const - SH_MAKE_EXECUTABLECLASS_OB_void((), ()) - - - template void operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1), (Param1)) - - template void operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 1 arguments - template class ExecutableClass1 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass1 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1), (Param1)) - - - template void operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 2 arguments - template class ExecutableClass2 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass2(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass2 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass2(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 3 arguments - template class ExecutableClass3 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass3(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass3 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass3(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 4 arguments - template class ExecutableClass4 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass4(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass4 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass4(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 5 arguments - template class ExecutableClass5 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass5(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass5 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass5(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 6 arguments - template class ExecutableClass6 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass6(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass6 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass6(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 7 arguments - template class ExecutableClass7 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass7(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass7 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass7(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 8 arguments - template class ExecutableClass8 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass8(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass8 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass8(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 9 arguments - template class ExecutableClass9 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass9(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass9 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass9(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 10 arguments - template class ExecutableClass10 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass10(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass10 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass10(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 11 arguments - template class ExecutableClass11 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass11(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass11 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass11(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 12 arguments - template class ExecutableClass12 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass12(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass12 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass12(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 13 arguments - template class ExecutableClass13 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass13(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass13 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass13(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 14 arguments - template class ExecutableClass14 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass14(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass14 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass14(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 15 arguments - template class ExecutableClass15 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass15(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass15 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass15(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 16 arguments - template class ExecutableClass16 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass16(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass16 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass16(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 17 arguments - template class ExecutableClass17 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass17(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass17 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass17(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 18 arguments - template class ExecutableClass18 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass18(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass18 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass18(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 19 arguments - template class ExecutableClass19 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass19(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass19 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass19(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 20 arguments - template class ExecutableClass20 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass20(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - - }; - - template class ExecutableClass20 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass20(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - - }; - - -} - -#define SH__CALL_GET_VFNPTR_NORMAL \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(CCW::GRP(ptr), mfp, mfi); \ - void *vfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(ptr) + mfi.thisptroffs + mfi.vtbloffs) + mfi.vtblindex); - -#define SH__CALL_GET_VFNPTR_MANUAL \ - using namespace ::SourceHook; \ - void *vfnptr = reinterpret_cast( \ - *reinterpret_cast( (reinterpret_cast(CCW::GRP(ptr)) + thisptroffs + vtbloffs) ) + vtblidx); \ - /* patch mfp */ \ - *reinterpret_cast(&mfp) = *reinterpret_cast(vfnptr); - -// SH_CALL needs to deduce the return type -> it uses templates and function overloading -// That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP -// The only purpose of the mfp2 parameter is to extract the return type - - -// Support for 0 arguments -template -SourceHook::ExecutableClass0::type, MFP, RetType> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass0::type, MFP, RetType> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)()const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass0 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass0( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 1 arguments -template -SourceHook::ExecutableClass1::type, MFP, RetType, Param1> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass1::type, MFP, RetType, Param1> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass1 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass1( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 2 arguments -template -SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass2 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass2( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 3 arguments -template -SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass3 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass3( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 4 arguments -template -SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass4 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass4( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 5 arguments -template -SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass5 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass5( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 6 arguments -template -SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass6 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass6( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 7 arguments -template -SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass7 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass7( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 8 arguments -template -SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass8 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass8( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 9 arguments -template -SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass9 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass9( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 10 arguments -template -SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass10 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass10( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 11 arguments -template -SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass11 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass11( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 12 arguments -template -SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass12 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass12( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 13 arguments -template -SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass13 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass13( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 14 arguments -template -SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass14 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass14( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 15 arguments -template -SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass15 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass15( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 16 arguments -template -SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass16 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass16( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 17 arguments -template -SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass17 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass17( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 18 arguments -template -SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass18 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass18( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 19 arguments -template -SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass19 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass19( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 20 arguments -template -SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass20 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass20( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - - -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 -// GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it - - -// Support for 0 arguments -template -SourceHook::ExecutableClass0::type, MFP, RetType> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass0::type, MFP, RetType> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 1 arguments -template -SourceHook::ExecutableClass1::type, MFP, RetType, Param1> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass1::type, MFP, RetType, Param1> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 2 arguments -template -SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 3 arguments -template -SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 4 arguments -template -SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 5 arguments -template -SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 6 arguments -template -SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 7 arguments -template -SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 8 arguments -template -SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 9 arguments -template -SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 10 arguments -template -SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 11 arguments -template -SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 12 arguments -template -SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 13 arguments -template -SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 14 arguments -template -SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 15 arguments -template -SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 16 arguments -template -SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 17 arguments -template -SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 18 arguments -template -SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 19 arguments -template -SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 20 arguments -template -SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - - -#endif - -#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) -#define SH_MCALL2(ptr, mfp, vtblidx, vtbloffs, thisptroffs) SH_MCALL3((ptr), (mfp), (mfp), (vtblidx), (vtbloffs), (thisptroffs), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) -#define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ - SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) - -#undef SH_MAKE_EXECUTABLECLASS_OB - -////////////////////////////////////////////////////////////////////////// -// SetOverrideRet and RecallGetIface for recalls -// These take a ISourceHook pointer instead of using SH_GLOB_SHPTR directly -// The reason is that the user may want to redefine SH_GLOB_SHPTR - then the macros -// (META_RETURN_VALUE_NEWPARAMS) should obey the new pointer. - -namespace SourceHook -{ - template - void SetOverrideResult(ISourceHook *shptr, const RetType res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - - // SetOverrideResult used to be implemented like this: - // SetOverrideResult(shptr, memfuncptr, return); - // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference - // (it thought it was ambigous - the ref and non-ref type) - // so now SetOverrideResult(memfuncptr) deduces the ret type, and returns a functor which does the work - // new syntax: SetOverrideResult(memfuncptr)(shptr, return) - // This also allows us to create a special version for references which respects ReferenceCarrier. - - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - }; - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T &res) - { - // overrideretptr points to ReferenceCarrier - *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; - } - }; - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)()) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)()) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - -} - -#endif - // The pope is dead. -> :( diff --git a/sourcehook/generate/sourcehook.hxx b/sourcehook/generate/sourcehook.hxx deleted file mode 100755 index e2566e8..0000000 --- a/sourcehook/generate/sourcehook.hxx +++ /dev/null @@ -1,1503 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** -* @file sourcehook.h -* @brief Contains the public SourceHook API -*/ - -#ifndef __SOURCEHOOK_H__ -#define __SOURCEHOOK_H__ - -// Interface revisions: -// 1 - Initial revision -// 2 - Changed to virtual functions for iterators and all queries -// 3 - Added "hook loop status variable" -// 4 - Reentrant -#define SH_IFACE_VERSION 4 - -// Impl versions: -// ??? -// 4 - addition of hook ids and vp hooks (with them, AddHookNew and RemoveHookNew) -// This is not a SH_IFACE_VERSION change so that old plugins continue working! -// 5 - addition of direct vp hooks (new hook mode; from now on AddHookNew checks for -// invalid hookmode -> impl version won't have to change because of things like this) -#define SH_IMPL_VERSION 5 - -// Hookman version: -// 1 - Support for recalls, performance optimisations -#define SH_HOOKMAN_VERSION 1 - -// The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook -// It's used in various macros -#ifndef SH_GLOB_SHPTR -#define SH_GLOB_SHPTR g_SHPtr -#endif - -// Used to identify the current plugin -#ifndef SH_GLOB_PLUGPTR -#define SH_GLOB_PLUGPTR g_PLID -#endif - -#ifdef SH_DEBUG -# include -# include - -# define SH_ASSERT(x, info) \ - do { \ - if (!(x)) \ - { \ - printf("SOURCEHOOK DEBUG ASSERTION FAILED: %s:%u(%s): %s: ", __FILE__, __LINE__, __FUNCTION__, #x); \ - printf info; \ - putchar('\n'); \ - abort(); \ - } \ - } while(0) - -#else -# define SH_ASSERT(x, info) -#endif - -// System -#define SH_SYS_WIN32 1 -#define SH_SYS_LINUX 2 - -#ifdef _WIN32 -# define SH_SYS SH_SYS_WIN32 -#elif defined __linux__ -# define SH_SYS SH_SYS_LINUX -#else -# error Unsupported system -#endif - -// Compiler -#define SH_COMP_GCC 1 -#define SH_COMP_MSVC 2 - -#ifdef _MSC_VER -# define SH_COMP SH_COMP_MSVC -#elif defined __GNUC__ -# define SH_COMP SH_COMP_GCC -#else -# error Unsupported compiler -#endif - -#if SH_COMP==SH_COMP_MSVC -# define vsnprintf _vsnprintf -#endif - -#if SH_SYS != SH_SYS_WIN32 -# include -#endif - -#define SH_PTRSIZE sizeof(void*) - -#include "FastDelegate.h" -#include "sh_memfuncinfo.h" - -// Good old metamod! - -// Flags returned by a plugin's api function. -// NOTE: order is crucial, as greater/less comparisons are made. -enum META_RES -{ - MRES_IGNORED=0, // plugin didn't take any action - MRES_HANDLED, // plugin did something, but real function should still be called - MRES_OVERRIDE, // call real function, but use my return value - MRES_SUPERCEDE // skip real function; use my return value -}; - - -namespace SourceHook -{ - /** - * @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers - */ - const int STRBUF_LEN=4096; - - /** - * @brief An empty class. No inheritance used. Used for original-function-call hacks - */ - class EmptyClass - { - }; - - /** - * @brief Implicit cast. - */ - template - inline Out implicit_cast(In input) - { - return input; - } - - /** - * @brief A plugin typedef - * - * SourceHook doesn't really care what this is. As long as the ==, != and = operators work on it and every - * plugin has a unique identifier, everything is ok. - * It should also be possible to set it to 0. - */ - typedef int Plugin; - - struct ProtoInfo - { - ProtoInfo(int rtsz, int nop, const int *p) : beginningNull(0), retTypeSize(rtsz), numOfParams(nop), params(p) - { - } - int beginningNull; //!< To distinguish from old protos (which never begin with 0) - int retTypeSize; //!< 0 if void - int numOfParams; //!< number of parameters - const int *params; //!< params[0]=0 (or -1 for vararg), params[1]=size of first param, ... - }; - - /** - * @brief Specifies the actions for hook managers - */ - enum HookManagerAction - { - HA_GetInfo = 0, //!< Store info about the hook manager - HA_Register, //!< Save the IHookManagerInfo pointer for future reference - HA_Unregister //!< Clear the saved pointer - }; - - struct IHookManagerInfo; - - /** - * @brief Pointer to hook manager interface function - * - * A "hook manager" is a the only thing that knows the actual protoype of the function at compile time. - * - * @param ha What the hook manager should do - * @param hi A pointer to IHookManagerInfo - */ - typedef int (*HookManagerPubFunc)(HookManagerAction ha, IHookManagerInfo *hi); - - class ISHDelegate - { - public: - virtual void DeleteThis() = 0; // Ugly, I know - virtual bool IsEqual(ISHDelegate *other) = 0; - }; - - template class CSHDelegate : public ISHDelegate - { - T m_Deleg; - public: - CSHDelegate(T deleg) : m_Deleg(deleg) - { - } - - CSHDelegate(const CSHDelegate &other) : m_Deleg(other.m_Deleg) - { - } - - void DeleteThis() - { - delete this; - } - - bool IsEqual(ISHDelegate *other) - { - return static_cast* >(other)->GetDeleg() == GetDeleg(); - } - - T &GetDeleg() - { - return m_Deleg; - } - }; - - struct IHookList - { - struct IIter - { - virtual bool End() = 0; - virtual void Next() = 0; - virtual ISHDelegate *Handler() = 0; - virtual int ThisPtrOffs() = 0; - }; - virtual IIter *GetIter() = 0; - virtual void ReleaseIter(IIter *pIter) = 0; - }; - - struct IIface - { - virtual void *GetPtr() = 0; - virtual IHookList *GetPreHooks() = 0; - virtual IHookList *GetPostHooks() = 0; - }; - - struct IVfnPtr - { - virtual void *GetVfnPtr() = 0; - virtual void *GetOrigEntry() = 0; - - virtual IIface *FindIface(void *ptr) = 0; - }; - - struct IHookManagerInfo - { - virtual IVfnPtr *FindVfnPtr(void *vfnptr) = 0; - - virtual void SetInfo(int vtbloffs, int vtblidx, const char *proto) = 0; - virtual void SetHookfuncVfnptr(void *hookfunc_vfnptr) = 0; - - // Added 23.12.2005 (yup! I'm coding RIGHT BEFORE CHRISTMAS!) - // If the hookman doesn't set this, it defaults 0 - // SourceHook prefers hookmans with higher version numbers - virtual void SetVersion(int version) = 0; - }; - - class AutoHookIter - { - IHookList *m_pList; - IHookList::IIter *m_pIter; - public: - AutoHookIter(IHookList *pList) - : m_pList(pList), m_pIter(pList->GetIter()) - { - } - - ~AutoHookIter() - { - if (m_pList) - m_pList->ReleaseIter(m_pIter); - } - - bool End() - { - return m_pIter->End(); - } - - void Next() - { - m_pIter->Next(); - } - - ISHDelegate *Handler() - { - return m_pIter->Handler(); - } - - int ThisPtrOffs() - { - return m_pIter->ThisPtrOffs(); - } - - void SetToZero() - { - m_pList = 0; - } - }; - - template struct DeprecatedCallClass - { - virtual B *GetThisPtr() = 0; - virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; - }; - - // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) - // - Today is an important day. - // I'm adding support for functions which return references. - - // How it works: - // SH_SETUPCALLS doesn't use plain rettype to store the temporary return values (plugin ret, orig ret, - // override ret) anymore; instead, it uses SourceHook::ReferenceCarrier::type - // this is typedefed to the original rettype normally, but if the rettype is a reference, it's a special class - // which stores the reference as a pointer, and implements constructors, operator= and a conversion operator. - // special cases were needed for getoverrideret / getorigret; these are implemented through the - // SourceHook::MacroRefHelpers structs. - // Furthermore, SetOverrideRet had to be changed a bit; see SourceHook::OverrideFunctor somewhere down in this file. - template struct ReferenceCarrier - { - typedef T type; - }; - - template struct ReferenceCarrier - { - class type - { - T *m_StoredRef; - public: - type() : m_StoredRef(NULL) - { - } - type(T& ref) : m_StoredRef(&ref) - { - } - - T& operator= (T& ref) - { - m_StoredRef = &ref; - return ref; - } - - operator T& () const - { - return *m_StoredRef; - } - }; - }; - - /** - * @brief The main SourceHook interface - */ - class ISourceHook - { - public: - /** - * @brief Return interface version - */ - virtual int GetIfaceVersion() = 0; - - /** - * @brief Return implementation version - */ - virtual int GetImplVersion() = 0; - - /** - * @brief Add a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Removes a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins - * - * @param plug The unique identifier of the plugin in question - */ - virtual bool IsPluginInUse(Plugin plug) = 0; - - /** - * @brief Return a pointer to a callclass. Generate a new one if required. - * - * @param iface The interface pointer - * @param size Size of the class instance - */ - virtual DeprecatedCallClass *GetCallClass(void *iface, size_t size) = 0; - - /** - * @brief Release a callclass - * - * @param ptr Pointer to the callclass - */ - virtual void ReleaseCallClass(DeprecatedCallClass *ptr) = 0; - - virtual void SetRes(META_RES res) = 0; //!< Sets the meta result - virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the - //!< previously calledhandler - virtual META_RES GetStatus() = 0; //!< Gets the highest meta result - virtual const void *GetOrigRet() = 0; //!< Gets the original result. - //!< If not in post function, undefined - virtual const void *GetOverrideRet() = 0; //!< Gets the override result. - //!< If none is specified, NULL - virtual void *GetIfacePtr() = 0; //!< Gets the interface pointer - ////////////////////////////////////////////////////////////////////////// - // For hook managers - virtual void HookLoopBegin(IIface *pIface) = 0; //!< Should be called when a hook loop begins - virtual void HookLoopEnd() = 0; //!< Should be called when a hook loop exits - virtual void SetCurResPtr(META_RES *mres) = 0; //!< Sets pointer to the current meta result - virtual void SetPrevResPtr(META_RES *mres) = 0; //!< Sets pointer to previous meta result - virtual void SetStatusPtr(META_RES *mres) = 0; //!< Sets pointer to the status variable - virtual void SetIfacePtrPtr(void **pp) = 0; //!< Sets pointer to the interface this pointer - virtual void SetOrigRetPtr(const void *ptr) = 0; //!< Sets the original return pointer - virtual void SetOverrideRetPtr(void *ptr) = 0; //!< Sets the override result pointer - virtual bool ShouldContinue() = 0; //!< Returns false if the hook loop should exit - - /** - * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. - * - * @param plug The owner of the hook manager - * @param pubFunc The hook manager's info function - */ - virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) = 0; - - virtual void DoRecall() = 0; //!< Initiates a recall sequence - /* - HOW RECALLS WORK: - - The problem: - Users want the ability to change parameters of the called function - from inside their handler. - The solution: - 1) Mark as "recall" - 2) Recall the function - 3) => SH's hook func gets called: - 4) The first iterator points at the first hook the last hookfunc didn't execute yet - 5) does all iteration and returns normally - 6) The user's handler returns immediately - 7) The hook func returns immediately as well - - Also note that the recalled hookfunc starts with the status the recalling hookfunc - ended with. The last handler (doing the recall) is also able to specify its own - META_RES. - */ - - virtual void *GetOverrideRetPtr() = 0; //!< Returns the pointer set by SetOverrideRetPtr - - /** - * @brief Set up the hook loop. Equivalent to calling: - * SetStatusPtr, SetPrevResPtr, SetCurResPtr, SetIfacePtrPtr, SetOrigRetPtr, Get/SetOverrideRetPtr - * - * @param statusPtr pointer to status variable - * @param prevResPtr pointer to previous result variable - * @param curResPtr pointer to current result variable - * @param ifacePtrPtr pointer to interface this pointer variable - * @param origRetPr pointer to original return value variable. NULL for void funcs - * @param overrideRetPtr pointer to override return value variable. NULL for void funcs - * - * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr - * when the hook func is being called as part of a recall - */ - virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; - - /** - * @brief Modes for the new AddHook - */ - enum AddHookMode - { - Hook_Normal, - Hook_VP, - Hook_DVP - }; - - /** - * @brief Add a (VP) hook. - * - * @return non-zero hook id on success, 0 otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param mode Can be either Hook_Normal or Hook_VP (vtable-wide hook) - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual int AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Remove a VP hook by ID. - * - * @return true on success, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param hookid The hook id (returned by AddHookNew) - */ - virtual bool RemoveHookByID(Plugin plug, int hookid) = 0; - - /** - * @brief Makes sure that hooks are going to be ignored on the next call of vfnptr - * - * @param plug The unique identifier of the plugin that calls this function - * @param vfnptr The virtual function pointer of the function in question - */ - virtual void SetIgnoreHooks(Plugin plug, void *vfnptr) = 0; - - /** - * @brief Reverses SetIgnoreHooks' effect - * - * @param plug The unique identifier of the plugin that calls this function - * @param vfnptr The virtual function pointer of the function in question - */ - virtual void ResetIgnoreHooks(Plugin plug, void *vfnptr) = 0; - - /** - * @brief Finds the original entry of a virtual function pointer - * - * @param vfnptr The virtual function pointer - * @return The original entry if the virtual function pointer has been patched; NULL otherwise. - */ - virtual void *GetOrigVfnPtrEntry(void *vfnptr) = 0; - }; - - // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: - // These have to be able to return references. If T is a reference, the pointers returned - // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. - template struct MacroRefHelpers - { - inline static const T* GetOrigRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOrigRet()); - } - inline static const T* GetOverrideRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOverrideRet()); - } - }; - - template struct MacroRefHelpers - { - inline static T* GetOrigRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOrigRet()); - return &ref; - } - inline static T* GetOverrideRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOverrideRet()); - return &ref; - } - }; - - // For source-level compatibility - template struct CallClass - { - T *ptr; - - CallClass(T *p) : ptr(p) - { - } - - operator T*() - { - return ptr; - } - }; - - typedef CallClass GenericCallClass; - typedef CallClass ManualCallClass; - - template - CallClass *GetCallClass(T *p) - { - return new CallClass(p); - } - - template - void ReleaseCallClass(CallClass *p) - { - delete p; - } - - template - void *GetOrigVfnPtrEntry(X *pInstance, MFP mfp, ISourceHook *pSH) - { - SourceHook::MemFuncInfo info = {true, -1, 0, 0}; - SourceHook::GetFuncInfo(pInstance, mfp, info); - - void *vfnptr = reinterpret_cast( - *reinterpret_cast(reinterpret_cast(pInstance) + info.thisptroffs + info.vtbloffs) + info.vtblindex); - - void *origentry = pSH->GetOrigVfnPtrEntry(vfnptr); - - return origentry ? origentry : *reinterpret_cast(vfnptr); - } -} - -/************************************************************************/ -/* High level interface */ -/************************************************************************/ -#define META_RESULT_STATUS SH_GLOB_SHPTR->GetStatus() -#define META_RESULT_PREVIOUS SH_GLOB_SHPTR->GetPrevRes() -#define META_RESULT_ORIG_RET(type) *SourceHook::MacroRefHelpers::GetOrigRet(SH_GLOB_SHPTR) -#define META_RESULT_OVERRIDE_RET(type) *SourceHook::MacroRefHelpers::GetOverrideRet(SH_GLOB_SHPTR) -#define META_IFACEPTR(type) reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()) - -#define SET_META_RESULT(result) SH_GLOB_SHPTR->SetRes(result) -#define RETURN_META(result) do { SET_META_RESULT(result); return; } while(0) -#define RETURN_META_VALUE(result, value) do { SET_META_RESULT(result); return (value); } while(0) - -// If a hook on a function which returns a reference does not want to specify a return value, -// it can use this macro. -// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! -#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) - -// only call these from the hook handlers directly! -// :TODO: enforce it ? - -// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? -// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE - -// SourceHook::SetOverrideRet is defined later. -#define RETURN_META_NEWPARAMS(result, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_NEWPARAMS(result, value, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* meh, set the override result here because we don't get a chance to return */ \ - /* before continuing the hook loop through the recall */ \ - SourceHook::SetOverrideResult(memfuncptr)(SH_GLOB_SHPTR, value); \ - } \ - RETURN_META_VALUE(MRES_SUPERCEDE, \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams); \ - } while (0) - -// :TODO: thisptroffs in MNEWPARAMS ?? - -#if SH_COMP == SH_COMP_MSVC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - void *addr; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; - -#elif SH_COMP == SH_COMP_GCC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.s.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; \ - u.s.adjustor = 0; - -#endif - -#define RETURN_META_MNEWPARAMS(result, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - (thisptr->*(u.mfp)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_MNEWPARAMS(result, value, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* see RETURN_META_VALUE_NEWPARAMS */ \ - SourceHook::SetOverrideResult(SH_GLOB_SHPTR, value); \ - } \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ - } while (0) - -#define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ - do { \ - SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ - SH_MFHCls(hookname)::ms_MFI.thisptroffs = pthisptroffs; \ - SH_MFHCls(hookname)::ms_MFI.vtblindex = pvtblindex; \ - SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ - } while (0) - - -#define SH_GET_ORIG_VFNPTR_ENTRY(inst, mfp) (SourceHook::GetOrigVfnPtrEntry(inst, mfp, SH_GLOB_SHPTR)) - -// For source-level compatibility - -#define SH_GET_CALLCLASS(ptr) SourceHook::GetCallClass(ptr) -#define SH_GET_MCALLCLASS(ptr, size) SourceHook::GetCallClass(reinterpret_cast(ptr)) -#define SH_RELEASE_CALLCLASS(ptr) SourceHook::ReleaseCallClass(ptr) - -// New ADD / REMOVE macros. -#define SH_STATIC(func) fastdelegate::MakeDelegate(func) -#define SH_MEMBER(inst, func) fastdelegate::MakeDelegate(inst, func) - -#define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) - -#define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) - -#define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) - -#define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) - -#define SH_ADD_VPHOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHVPAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler, false) - -#define SH_ADD_DVPHOOK(ifacetype, ifacefunc, vtableptr, handler, post) \ - __SourceHook_FHVPAdd##ifacetype##ifacefunc(reinterpret_cast(vtableptr), \ - post, handler, true) - -#define SH_ADD_MANUALVPHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMVPAdd##hookname(reinterpret_cast(ifaceptr), post, handler, false) - -#define SH_ADD_MANUALDVPHOOK(hookname, vtableptr, handler, post) \ - __SourceHook_FHMVPAdd##hookname(reinterpret_cast(vtableptr), post, handler, true) - -#define SH_REMOVE_HOOK_ID(hookid) \ - (SH_GLOB_SHPTR->RemoveHookByID(SH_GLOB_PLUGPTR, hookid)) - -// Old macros -// !! These are now deprecated. Instead, use one of these: -// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -#define SH_NOATTRIB - - - - -#if SH_COMP == SH_COMP_MSVC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; -#elif SH_COMP == SH_COMP_GCC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; \ - reinterpret_cast(&mfp)[1] = 0; -#else -# error Not supported yet. -#endif - -////////////////////////////////////////////////////////////////////////// -#define SH_FHCls(ift, iff, ov) __SourceHook_FHCls_##ift##iff##ov -#define SH_MFHCls(hookname) __SourceHook_MFHCls_##hookname - -#define SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) \ - SH_FHCls(ifacetype,ifacefunc,overload)() \ - { \ - GetFuncInfo(funcptr, ms_MFI); \ - } \ - \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - GetFuncInfo(funcptr, ms_MFI); \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_FHCls(ifacetype,ifacefunc,overload)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -// It has to be possible to use the macros in namespaces -// -> So we need to access and extend the global SourceHook namespace -// We use a namespace alias for this -#define SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, funcptr) \ - struct SH_FHCls(ifacetype,ifacefunc,overload) \ - { \ - static SH_FHCls(ifacetype,ifacefunc,overload) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) - -#define SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, funcptr) \ - }; \ - SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ - int __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ - return false; /* No non-virtual functions / virtual inheritance supported */ \ - \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ - new CSHDelegate(handler), post); \ - } \ - int __SourceHook_FHVPAdd##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler, bool direct) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ - return false; /* No non-virtual functions / virtual inheritance supported */ \ - \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ - direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ - iface, mfi.thisptroffs, SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ - new CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0) \ - return false; /* No virtual inheritance supported */ \ - \ - CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, &tmp, post); \ - } \ - -#define SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - struct SH_MFHCls(hookname) \ - { \ - static SH_MFHCls(hookname) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - \ - SH_MFHCls(hookname)() \ - { \ - ms_MFI.isVirtual = true; \ - ms_MFI.thisptroffs = pthisptroffs; \ - ms_MFI.vtblindex = pvtblidx; \ - ms_MFI.vtbloffs = pvtbloffs; \ - } \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - /* we don't set ms_MFI here because manual hookmans can be reconfigured */ \ - /* :FIXME: possible problem: someone adding a hook from a constructor of a global entity */ \ - /* which is construced before SH_MFHCls(hookname)() gets called? */ \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_MFHCls(hookname)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -#define SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - }; \ - SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ - int __SourceHook_FHMAdd##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, \ - new ::SourceHook::CSHDelegate(handler), post); \ - } \ - int __SourceHook_FHMVPAdd##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler, bool direct) \ - { \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ - direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ - iface, pthisptroffs, SH_MFHCls(hookname)::HookManPubFunc, \ - new ::SourceHook::CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - ::SourceHook::CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, &tmp, post); \ - } \ - - -#define SH_SETUPCALLS(rettype, paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - return (reinterpret_cast(this)->*mfp)params; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - typedef ReferenceCarrier::type my_rettype; \ - my_rettype orig_ret; \ - my_rettype override_ret; \ - my_rettype plugin_ret; \ - void* ifptr; \ - my_rettype *pOverrideRet = reinterpret_cast(SH_GLOB_SHPTR->SetupHookLoop( \ - &status, &prev_res, &cur_res, &ifptr, &orig_ret, &override_ret)); - -#define SH_CALL_HOOKS(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - plugin_ret = reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (cur_res >= MRES_OVERRIDE) \ - *pOverrideRet = plugin_ret; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG(rettype, paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - orig_ret = (reinterpret_cast(this)->*mfp)params; \ - } \ - else \ - orig_ret = override_ret; \ - -#define SH_RETURN() \ - SH_GLOB_SHPTR->HookLoopEnd(); \ - return status >= MRES_OVERRIDE ? *pOverrideRet : orig_ret; - -#define SH_HANDLEFUNC(paramtypes, params, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params) \ - SH_CALL_HOOKS(pre, params) \ - SH_CALL_ORIG(rettype, paramtypes, params) \ - SH_CALL_HOOKS(post, params) \ - SH_RETURN() - -////////////////////////////////////////////////////////////////////////// -#define SH_SETUPCALLS_void(paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - return; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - void* ifptr; \ - SH_GLOB_SHPTR->SetupHookLoop(&status, &prev_res, &cur_res, &ifptr, NULL, NULL); \ - -#define SH_CALL_HOOKS_void(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG_void(paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - } - -#define SH_RETURN_void() \ - SH_GLOB_SHPTR->HookLoopEnd(); - -#define SH_HANDLEFUNC_void(paramtypes, params) \ - SH_SETUPCALLS_void(paramtypes, params) \ - SH_CALL_HOOKS_void(pre, params) \ - SH_CALL_ORIG_void(paramtypes, params) \ - SH_CALL_HOOKS_void(post, params) \ - SH_RETURN_void() - - -// Special vafmt handlers -// :TODO: what -#define SH_HANDLEFUNC_vafmt(paramtypes, params_orig, params_plug, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(pre, params_plug) \ - SH_CALL_ORIG(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(post, params_plug) \ - SH_RETURN() - -#define SH_HANDLEFUNC_void_vafmt(paramtypes, params_orig, params_plug) \ - SH_SETUPCALLS_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(pre, params_plug) \ - SH_CALL_ORIG_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(post, params_plug) \ - SH_RETURN_void() - -////////////////////////////////////////////////////////////////////////// - -// :FIXME: -// sizeof on references returns the size of the datatype, NOT the pointer size or something -// -> one should probably flag references in __SourceHook_ParamSizes_* ! -// or simply assume that their size is sizeof(void*)=SH_PTRSIZE... could be doable through a simple template - -@[$1,0,$a: -// ********* Support for $1 arguments ********* -#define SH_DECL_HOOK$1(ifacetype, ifacefunc, attr, overload, rettype@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]@[$1!=0:, @]rettype> FD; \ - virtual rettype Func(@[$2,1,$1|, :param$2 p$2@]) \ - { SH_HANDLEFUNC((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@]), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK$1_void(ifacetype, ifacefunc, attr, overload@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]> FD; \ - virtual void Func(@[$2,1,$1|, :param$2 p$2@]) \ - { SH_HANDLEFUNC_void((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@])); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK$1_vafmt(ifacetype, ifacefunc, attr, overload, rettype@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate@($1+1)<@[$2,1,$1|, :param$2@]@[$1!=0:, @]const char *, rettype> FD; \ - virtual rettype Func(@[$2,1,$1|, :param$2 p$2@]@[$1!=0:, @]const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((@[$2,1,$1|, :param$2@]@[$1!=0:, @]...), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]"%s", buf), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK$1_void_vafmt(ifacetype, ifacefunc, attr, overload@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate@($1+1)<@[$2,1,$1|, :param$2@]@[$1!=0:, @]const char *> FD; \ - virtual void Func(@[$2,1,$1|, :param$2 p$2@]@[$1!=0:, @]const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((@[$2,1,$1|, :param$2@]@[$1!=0:, @]...), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]"%s", buf), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK$1(hookname, vtblidx, vtbloffs, thisptroffs, rettype@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]@[$1!=0:, @]rettype> FD; \ - virtual rettype Func(@[$2,1,$1|, :param$2 p$2@]) \ - { SH_HANDLEFUNC((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@]), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(@[$2,1,$1|, :param$2@]); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - $1, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK$1_void(hookname, vtblidx, vtbloffs, thisptroffs@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]> FD; \ - virtual void Func(@[$2,1,$1|, :param$2 p$2@]) \ - { SH_HANDLEFUNC_void((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@])); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(@[$2,1,$1|, :param$2@]); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - $1, __SourceHook_ParamSizesM_##hookname); \ - -@] - - -////////////////////////////////////////////////////////////////////////// -// SH_CALL - -#define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - \ - m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ - RetType tmpret = (m_ThisPtr->*m_MFP)call; \ - m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ - return tmpret; \ -} - -#define SH_MAKE_EXECUTABLECLASS_OB_void(call, prms) \ -{ \ - using namespace ::SourceHook; \ - \ - m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ - (m_ThisPtr->*m_MFP)call; \ - m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ -} - -namespace SourceHook -{ - // Call Class Wrapper! - template struct CCW - { - typedef T type; - - // Get Real Pointer! - static inline T *GRP(T *p) - { - return p; - } - }; - - template struct CCW< CallClass > - { - typedef T type; - - // Get Real Pointer! - static inline T *GRP(CallClass *p) - { - return p->ptr; - } - }; - -@[$1,0,$a: - // Support for $1 arguments - template class ExecutableClass$1 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass$1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(@[$2,1,$1|, :Param$2 p$2@]) const - SH_MAKE_EXECUTABLECLASS_OB((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) - - @[$2,$1+1,$a: - template <@[$3,$1+1,$2|, :class Param$3@]> RetType operator()(@[$3,1,$2|, :Param$3 p$3@]) const - SH_MAKE_EXECUTABLECLASS_OB((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) - @] - }; - - template class ExecutableClass$1 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass$1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(@[$2,1,$1|, :Param$2 p$2@]) const - SH_MAKE_EXECUTABLECLASS_OB_void((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) - - @[$2,$1+1,$a: - template <@[$3,$1+1,$2|, :class Param$3@]> void operator()(@[$3,1,$2|, :Param$3 p$3@]) const - SH_MAKE_EXECUTABLECLASS_OB_void((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) - @] - }; -@] - -} - -#define SH__CALL_GET_VFNPTR_NORMAL \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(CCW::GRP(ptr), mfp, mfi); \ - void *vfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(ptr) + mfi.thisptroffs + mfi.vtbloffs) + mfi.vtblindex); - -#define SH__CALL_GET_VFNPTR_MANUAL \ - using namespace ::SourceHook; \ - void *vfnptr = reinterpret_cast( \ - *reinterpret_cast( (reinterpret_cast(CCW::GRP(ptr)) + thisptroffs + vtbloffs) ) + vtblidx); \ - /* patch mfp */ \ - *reinterpret_cast(&mfp) = *reinterpret_cast(vfnptr); - -// SH_CALL needs to deduce the return type -> it uses templates and function overloading -// That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP -// The only purpose of the mfp2 parameter is to extract the return type - -@[$1,0,$a: -// Support for $1 arguments -template -SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@])const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass$1 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass$1( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} -@] - -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 -// GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it - -@[$1,0,$a: -// Support for $1 arguments -template -SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass$1::type, MFP, RetType@[$2,1,$1:, Param$2@]>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -@] - -#endif - -#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) -#define SH_MCALL2(ptr, mfp, vtblidx, vtbloffs, thisptroffs) SH_MCALL3((ptr), (mfp), (mfp), (vtblidx), (vtbloffs), (thisptroffs), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) -#define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ - SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) - -#undef SH_MAKE_EXECUTABLECLASS_OB - -////////////////////////////////////////////////////////////////////////// -// SetOverrideRet and RecallGetIface for recalls -// These take a ISourceHook pointer instead of using SH_GLOB_SHPTR directly -// The reason is that the user may want to redefine SH_GLOB_SHPTR - then the macros -// (META_RETURN_VALUE_NEWPARAMS) should obey the new pointer. - -namespace SourceHook -{ - template - void SetOverrideResult(ISourceHook *shptr, const RetType res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - - // SetOverrideResult used to be implemented like this: - // SetOverrideResult(shptr, memfuncptr, return); - // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference - // (it thought it was ambigous - the ref and non-ref type) - // so now SetOverrideResult(memfuncptr) deduces the ret type, and returns a functor which does the work - // new syntax: SetOverrideResult(memfuncptr)(shptr, return) - // This also allows us to create a special version for references which respects ReferenceCarrier. - - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - }; - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T &res) - { - // overrideretptr points to ReferenceCarrier - *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; - } - }; -@[$1,0,$a: - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(@[$2,1,$1|, :Param$2@])) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(@[$2,1,$1|, :Param$2@])) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } -@] -} - -#endif - // The pope is dead. -> :( diff --git a/sourcehook/sh_list.h b/sourcehook/sh_list.h deleted file mode 100644 index 12a56f2..0000000 --- a/sourcehook/sh_list.h +++ /dev/null @@ -1,291 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -#ifndef _INCLUDE_SMM_LIST_H -#define _INCLUDE_SMM_LIST_H - -#include -#include - -namespace SourceHook -{ - - //This class is from CSDM for AMX Mod X - /* - A circular, doubly-linked list with one sentinel node - - Empty: - m_Head = sentinel - m_Head->next = m_Head; - m_Head->prev = m_Head; - One element: - m_Head = sentinel - m_Head->next = node1 - m_Head->prev = node1 - node1->next = m_Head - node1->prev = m_Head - Two elements: - m_Head = sentinel - m_Head->next = node1 - m_Head->prev = node2 - node1->next = node2 - node1->prev = m_Head - node2->next = m_Head - node2->prev = node1 - */ - template - class List - { - public: - class iterator; - friend class iterator; - class ListNode - { - public: - ListNode(const T & o) : obj(o) { }; - ListNode() { }; - T obj; - ListNode *next; - ListNode *prev; - }; - private: - // Initializes the sentinel node. - // BAIL used malloc instead of new in order to bypass the need for a constructor. - ListNode *_Initialize() - { - ListNode *n = (ListNode *)malloc(sizeof(ListNode)); - n->next = n; - n->prev = n; - return n; - } - public: - List() : m_Head(_Initialize()), m_Size(0) - { - } - List(const List &src) : m_Head(_Initialize()), m_Size(0) - { - iterator iter; - for (iter=src.begin(); iter!=src.end(); iter++) - push_back( (*iter) ); - } - ~List() - { - clear(); - - // Don't forget to free the sentinel - if (m_Head) - { - free(m_Head); - m_Head = NULL; - } - } - void push_back(const T &obj) - { - ListNode *node = new ListNode(obj); - - node->prev = m_Head->prev; - node->next = m_Head; - m_Head->prev->next = node; - m_Head->prev = node; - - m_Size++; - } - size_t size() const - { - return m_Size; - } - - void clear() - { - ListNode *node = m_Head->next; - ListNode *temp; - m_Head->next = m_Head; - m_Head->prev = m_Head; - - // Iterate through the nodes until we find g_Head (the sentinel) again - while (node != m_Head) - { - temp = node->next; - delete node; - node = temp; - } - m_Size = 0; - } - bool empty() const - { - return (m_Size == 0); - } - T & back() - { - return m_Head->prev->obj; - } - private: - ListNode *m_Head; - size_t m_Size; - public: - class iterator - { - friend class List; - public: - iterator() - { - m_This = NULL; - } - iterator(const List &src) - { - m_This = src.m_Head; - } - iterator(ListNode *n) : m_This(n) - { - } - iterator(const iterator &where) - { - m_This = where.m_This; - } - //pre decrement - iterator & operator--() - { - if (m_This) - m_This = m_This->prev; - return *this; - } - //post decrement - iterator operator--(int) - { - iterator old(*this); - if (m_This) - m_This = m_This->prev; - return old; - } - - //pre increment - iterator & operator++() - { - if (m_This) - m_This = m_This->next; - return *this; - } - //post increment - iterator operator++(int) - { - iterator old(*this); - if (m_This) - m_This = m_This->next; - return old; - } - - const T & operator * () const - { - return m_This->obj; - } - T & operator * () - { - return m_This->obj; - } - - T * operator -> () - { - return &(m_This->obj); - } - const T * operator -> () const - { - return &(m_This->obj); - } - - bool operator != (const iterator &where) const - { - return (m_This != where.m_This); - } - bool operator ==(const iterator &where) const - { - return (m_This == where.m_This); - } - private: - ListNode *m_This; - }; - public: - iterator begin() const - { - return iterator(m_Head->next); - } - iterator end() const - { - return iterator(m_Head); - } - iterator erase(iterator &where) - { - ListNode *pNode = where.m_This; - iterator iter(where); - iter++; - - - // Works for all cases: empty list, erasing first element, erasing tail, erasing in the middle... - pNode->prev->next = pNode->next; - pNode->next->prev = pNode->prev; - - delete pNode; - m_Size--; - - return iter; - } - - iterator insert(iterator where, const T &obj) - { - // Insert obj right before where - - ListNode *node = new ListNode(obj); - ListNode *pWhereNode = where.m_This; - - pWhereNode->prev->next = node; - node->prev = pWhereNode->prev; - pWhereNode->prev = node; - node->next = pWhereNode; - - m_Size++; - - return iterator(node); - } - - public: - void remove(const T & obj) - { - iterator b; - for (b=begin(); b!=end(); b++) - { - if ( (*b) == obj ) - { - erase( b ); - break; - } - } - } - template - iterator find(const U & equ) const - { - iterator iter; - for (iter=begin(); iter!=end(); iter++) - { - if ( (*iter) == equ ) - return iter; - } - return end(); - } - List & operator =(const List &src) - { - clear(); - iterator iter; - for (iter=src.begin(); iter!=src.end(); iter++) - push_back( (*iter) ); - return *this; - } - }; -}; //NAMESPACE - -#endif //_INCLUDE_CSDM_LIST_H diff --git a/sourcehook/sh_listcat.h b/sourcehook/sh_listcat.h deleted file mode 100644 index 8eb74ca..0000000 --- a/sourcehook/sh_listcat.h +++ /dev/null @@ -1,147 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -// Used for VP-Hooks - -#ifndef _INCLUDE_SMM_LISTCAT_H -#define _INCLUDE_SMM_LISTCAT_H - -#include "sh_list.h" - -namespace SourceHook -{ - - // Only a very special-case forward iterator! - template - class ListCatIterator - { - List *m_pListLeft; - List *m_pListRight; - typename List::iterator m_Iter; - - void CheckLeftEmptyOnBegin() - { - // If the left list is empty and right is valid, GoToBegin sets m_Iter to m_Left - // End() checks for equality to m_Right.end() so it returns false - // then Next() corrupts by incrementing! - - // To avoid this, we skip left if it's empty. - if (m_pListLeft && m_pListLeft->empty() && m_pListRight) - { - m_Iter = m_pListRight->begin(); - } - } - public: - // At least one list has to be non-null! - ListCatIterator(List *pListLeft, List *pListRight) : m_pListLeft(pListLeft), m_pListRight(pListRight), - m_Iter(pListLeft ? pListLeft->begin() : pListRight->begin()) - { - CheckLeftEmptyOnBegin(); - } - - void GoToBegin() - { - m_Iter = m_pListLeft ? m_pListLeft->begin() : m_pListRight->begin(); - CheckLeftEmptyOnBegin(); - } - - bool End() - { - return m_pListRight ? (m_Iter == m_pListRight->end()) - : (m_Iter == m_pListLeft->end()); - } - - //pre increment - ListCatIterator & operator++() - { - ++m_Iter; - if (m_pListLeft && m_Iter == m_pListLeft->end()) - { - if (m_pListRight) - m_Iter = m_pListRight->begin(); - } - return *this; - } - //post increment - ListCatIterator operator++(int) - { - ListCatIterator old(*this); - - ++m_Iter; - if (m_pListLeft && m_Iter == m_pListLeft->end()) - { - if (m_pListRight) - m_Iter = m_pListRight->begin(); - } - - return old; - } - - const T & operator * () const - { - return *m_Iter; - } - T & operator * () - { - return *m_Iter; - } - - T * operator -> () - { - return &(*m_Iter); - } - const T * operator -> () const - { - return &(*m_Iter); - } - - bool operator != (const typename List::iterator &where) const - { - return (m_Iter != where); - } - bool operator ==(const typename List::iterator &where) const - { - return (m_Iter == where); - } - - ListCatIterator & operator = (const typename List::iterator &where) - { - m_Iter = where; - - if (m_pListLeft && m_Iter == m_pListLeft->end()) - { - if (m_pListRight) - m_Iter = m_pListRight->begin(); - - // :HACK HACK: RemoveHookById is not aware of ListCatIterator (yet? :TODO: Change it!) - // So we have to do this here... (look for the "Move all iterators pointing at this" section) - --m_Iter; - } - - return *this; - } - - ListCatIterator & operator = (const ListCatIterator &other) - { - m_Iter = other.m_Iter; - m_pListLeft = other.m_pListLeft; - m_pListRight = other.m_pListRight; - return *this; - } - - void SetListLeft(List *pList) - { - m_pListLeft = pList; - } - }; -} - -#endif - diff --git a/sourcehook/sh_memfuncinfo.h b/sourcehook/sh_memfuncinfo.h deleted file mode 100644 index fbfddab..0000000 --- a/sourcehook/sh_memfuncinfo.h +++ /dev/null @@ -1,912 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** - * @brief This file provides a way for getting information about a member function. - * @file sh_memfuncinfo.h - */ - -#ifndef __SHINT_MEMFUNC_INFO_H__ -#define __SHINT_MEMFUNC_INFO_H__ - -namespace SourceHook -{ - - // Don Clugston: - // implicit_cast< > - // I believe this was originally going to be in the C++ standard but - // was left out by accident. It's even milder than static_cast. - // I use it instead of static_cast<> to emphasize that I'm not doing - // anything nasty. - // Usage is identical to static_cast<> - template - inline OutputClass implicit_cast(InputClass input){ - return input; - } - - - struct MemFuncInfo - { - bool isVirtual; // Is the function virtual? - int thisptroffs; // The this pointer the function expects to be called with - // If -1, you need to call the GetFuncInfo_GetThisPtr function - int vtblindex; // The function's index in the vtable (0-based, 1=second entry, 2=third entry, ...) - int vtbloffs; // The vtable pointer - }; - - // Ideas by Don Clugston. - // Check out his excellent paper: http://www.codeproject.com/cpp/FastDelegate.asp - - template struct MFI_Impl - { - template static inline void GetFuncInfo(MFP *mfp, MemFuncInfo &out) - { - static char weird_memfunc_pointer_exclamation_mark_arrow_error[N-1000]; - } - }; - -# if SH_COMP == SH_COMP_GCC - - template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16 - { - struct GCC_MemFunPtr - { - union - { - void *funcadr; // always even - intptr_t vtable_index_plus1; // = vindex+1, always odd - }; - intptr_t delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - GCC_MemFunPtr *mfp_detail = (GCC_MemFunPtr*)&mfp; - out.thisptroffs = mfp_detail->delta; - if (mfp_detail->vtable_index_plus1 & 1) - { - out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE; - out.vtbloffs = 0; - out.isVirtual = true; - } - else - out.isVirtual = false; - } - }; - -# elif SH_COMP == SH_COMP_MSVC - - namespace - { - int MFI_GetVtblOffset(void *mfp) - { - unsigned char *addr = (unsigned char*)mfp; - if (*addr == 0xE9) // Jmp - { - // May or may not be! - // Check where it'd jump - addr += 5 /*size of the instruction*/ + *(unsigned long*)(addr + 1); - } - - // Check whether it's a virtual function call - // They look like this: - // 004125A0 8B 01 mov eax,dword ptr [ecx] - // 004125A2 FF 60 04 jmp dword ptr [eax+4] - // ==OR== - // 00411B80 8B 01 mov eax,dword ptr [ecx] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // However, for vararg functions, they look like this: - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] - // ==OR== - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // With varargs, the this pointer is passed as if it was the first argument - - bool ok = false; - if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && - addr[4] == 0x8B && addr[5] == 0x00) - { - addr += 6; - ok = true; - } - else if (addr[0] == 0x8B && addr[1] == 0x01) - { - addr += 2; - ok = true; - } - if (!ok) - return -1; - - if (*addr++ == 0xFF) - { - if (*addr == 0x60) - { - return *++addr / 4; - } - else if (*addr == 0xA0) - { - return *((unsigned int*)++addr) / 4; - } - else if (*addr == 0x20) - return 0; - else - return -1; - } - return -1; - } - } - - template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = 0; - out.vtbloffs = 0; - } - }; - - template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones! - { - struct MSVC_MemFunPtr2 - { - void *funcadr; - int delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = reinterpret_cast(&mfp)->delta; - out.vtbloffs = 0; - } - }; - - // By Don Clugston, adapted - template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG - { - class __single_inheritance GenericClass; - class GenericClass {}; - - struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance - }; - - struct GenericVirtualClass : virtual public GenericClass - { - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } - }; - - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - // This pointer - /* - union { - MFP func; - GenericClass* (T::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = mfp; - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(mfp)==sizeof(u.s) - && sizeof(mfp)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - out.thisptroffs = (reinterpret_cast(NULL)->*u.ProbeFunc)(); - */ - out.thisptroffs = -1; - out.vtbloffs = 0; - } - }; - - // Don: Nasty hack for Microsoft and Intel (IA32 and Itanium) - // unknown_inheritance classes go here - // This is probably the ugliest bit of code I've ever written. Look at the casts! - // There is a compiler bug in MSVC6 which prevents it from using this code. - template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - MFP func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - void *m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(u.func)==sizeof(u.s)? 1 : -1]; - u.func = mfp; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - /* - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - int * vtable = *reinterpret_cast( - reinterpret_cast(thisptr) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - out.thisptr = reinterpret_cast( - reinterpret_cast(thisptr) + u.s.delta + virtual_delta); - */ - out.vtbloffs = u.s.vtordisp; - out.thisptroffs = -1; - } - else - { - out.vtbloffs = out.vtblindex < 0 ? 0 : u.s.delta; - out.thisptroffs = u.s.delta; - } - }; - }; -# else -# error Unsupported compiler -# endif - - // This version does not take a this pointer - // Useful for hookdecls, as they ensure that mfp is correct through a static_cast - template inline void GetFuncInfo(X mfp, MemFuncInfo &out) - { - MFI_Impl::GetFuncInfo(mfp, out); - } - - // Versions which do take a this - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(), MemFuncInfo &out) - { - RetType(Y::*mfp2)() = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)() const, MemFuncInfo &out) - { - RetType(Y::*mfp2)() const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - // GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - -#endif - -} - -#endif diff --git a/sourcehook/sh_memory.h b/sourcehook/sh_memory.h deleted file mode 100644 index d626bb9..0000000 --- a/sourcehook/sh_memory.h +++ /dev/null @@ -1,186 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko, Scott "Damaged Soul" Ehlert -* Contributors: lancevorgin, XAD, theqizmo -* ============================ -*/ - -#ifndef __SHINT_MEMORY_H__ -#define __SHINT_MEMORY_H__ - -// Feb 17 / 2005: -// Unprotect now sets to readwrite -// The vtable doesn't need to be executable anyway - -# if /********/ defined _WIN32 -# include -# define SH_MEM_READ 1 -# define SH_MEM_WRITE 2 -# define SH_MEM_EXEC 4 -# elif /******/ defined __linux__ -# include -# include -# include -# include -// http://www.die.net/doc/linux/man/man2/mprotect.2.html -# include -# ifndef PAGESIZE -# define PAGESIZE 4096 -# endif -# define SH_MEM_READ PROT_READ -# define SH_MEM_WRITE PROT_WRITE -# define SH_MEM_EXEC PROT_EXEC - -// We need to align addr down to pagesize on linux -// We assume PAGESIZE is a power of two -# define SH_LALIGN(x) (void*)((intptr_t)(x) & ~(PAGESIZE-1)) -# define SH_LALDIF(x) ((intptr_t)(x) & (PAGESIZE-1)) -# else -# error Unsupported OS/Compiler -# endif - - -namespace SourceHook -{ - inline bool SetMemAccess(void *addr, size_t len, int access) - { -# ifdef __linux__ - return mprotect(SH_LALIGN(addr), len + SH_LALDIF(addr), access)==0 ? true : false; -# else - DWORD tmp; - DWORD prot; - switch (access) - { - case SH_MEM_READ: - prot = PAGE_READONLY; break; - case SH_MEM_READ | SH_MEM_WRITE: - prot = PAGE_READWRITE; break; - case SH_MEM_READ | SH_MEM_EXEC: - prot = PAGE_EXECUTE_READ; break; - default: - case SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC: - prot = PAGE_EXECUTE_READWRITE; break; - } - return VirtualProtect(addr, len, prot, &tmp) ? true : false; -# endif - } - -#ifdef __linux__ - namespace - { - bool g_BadReadCalled; - jmp_buf g_BadReadJmpBuf; - - static void BadReadHandler(int sig) - { - if (g_BadReadCalled) - longjmp(g_BadReadJmpBuf, 1); - } - } -#endif - - /** - * @brief Checks whether the specified memory region is (still) accessible - * - * @param addr The lower boundary - * @param len Length of the region to be checked - */ - namespace - { - bool ModuleInMemory(char *addr, size_t len) - { -#ifdef __linux__ - // On linux, first check /proc/self/maps - long lower = reinterpret_cast(addr); - long upper = lower + len; - - FILE *pF = fopen("/proc/self/maps", "r"); - if (pF) - { - // Linux /proc/self/maps -> parse - // Format: - // lower upper prot stuff path - // 08048000-0804c000 r-xp 00000000 03:03 1010107 /bin/cat - long rlower, rupper; - while (fscanf(pF, "%lx-%lx", &rlower, &rupper) != EOF) - { - // Check whether we're IN THERE! - if (lower >= rlower && upper <= rupper) - { - fclose(pF); - return true; - } - // Read to end of line - int c; - while ((c = fgetc(pF)) != '\n') - { - if (c == EOF) - break; - } - if (c == EOF) - break; - } - fclose(pF); - return false; - } - pF = fopen("/proc/curproc/map", "r"); - if (pF) - { - // FreeBSD /proc/curproc/map -> parse - // 0x804800 0x805500 13 15 0xc6e18960 r-x 21 0x0 COW NC vnode - long rlower, rupper; - while (fscanf(pF, "0x%lx 0x%lx", &rlower, &rupper) != EOF) - { - // Check whether we're IN THERE! - if (lower >= rlower && upper <= rupper) - { - fclose(pF); - return true; - } - // Read to end of line - int c; - while ((c = fgetc(pF)) != '\n') - { - if (c == EOF) - break; - } - if (c == EOF) - break; - } - fclose(pF); - return false; - } - - // Both of the above failed, try to actually read and trap sigsegv (implemented by Damaged Soul) - void(*prevHandler)(int sig); - g_BadReadCalled = true; - - if (setjmp(g_BadReadJmpBuf)) - return true; - - prevHandler = signal(SIGSEGV, BadReadHandler); - - volatile const char *p = reinterpret_cast(addr); - char dummy; - - for (size_t i = 0; i < len; i++) - dummy = p[i]; - - g_BadReadCalled = false; - - signal(SIGSEGV, prevHandler); - - return false; -#else - // On Win32, simply use IsBadReadPtr - return !IsBadReadPtr(addr, len); -#endif - } - } -} - -#endif diff --git a/sourcehook/sh_stack.h b/sourcehook/sh_stack.h deleted file mode 100644 index ffbeecf..0000000 --- a/sourcehook/sh_stack.h +++ /dev/null @@ -1,237 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -#ifndef __SH_STACK_H__ -#define __SH_STACK_H__ - -#include - -#define SH_STACK_DEFAULT_SIZE 4 - -namespace SourceHook -{ - // Vector - template class CStack - { - T *m_Elements; - size_t m_AllocatedSize; - size_t m_UsedSize; - public: - friend class iterator; - class iterator - { - CStack *m_pParent; - size_t m_Index; - public: - iterator(CStack *pParent, size_t id) : m_pParent(pParent), m_Index(id) - { - } - - iterator(CStack *pParent) : m_pParent(pParent), m_Index(0) - { - } - - iterator() : m_pParent(NULL), m_Index(0) - { - } - - T &operator *() - { - return m_pParent->m_Elements[m_Index]; - } - const T &operator *() const - { - return m_pParent->m_Elements[m_Index]; - } - - T * operator->() - { - return m_pParent->m_Elements + m_Index; - } - - const T * operator->() const - { - return m_pParent->m_Elements + m_Index; - } - - iterator & operator++() // preincrement - { - ++m_Index; - return (*this); - } - - iterator operator++(int) // postincrement - { - iterator tmp = *this; - ++m_Index; - return tmp; - } - - iterator & operator--() // predecrement - { - --m_Index; - return (*this); - } - - iterator operator--(int) // postdecrememnt - { - iterator tmp = *this; - --m_Index; - return tmp; - } - - bool operator==(const iterator & right) const - { - return (m_pParent == right.m_pParent && m_Index == right.m_Index); - } - - bool operator!=(const iterator & right) const - { - return !(*this == right); - } - }; - CStack() : m_Elements(new T[SH_STACK_DEFAULT_SIZE]), - m_AllocatedSize(SH_STACK_DEFAULT_SIZE), - m_UsedSize(0) - { - } - CStack(size_t size) : m_Elements(new T[size]), - m_AllocatedSize(size), - m_UsedSize(0) - { - } - - CStack(const CStack &other) : m_Elements(NULL), - m_AllocatedSize(0), - m_UsedSize(0) - { - reserve(other.m_AllocatedSize); - m_UsedSize = other.m_UsedSize; - for (size_t i = 0; i < m_UsedSize; ++i) - m_Elements[i] = other.m_Elements[i]; - } - - ~CStack() - { - if (m_Elements) - delete [] m_Elements; - } - - void operator=(const CStack &other) - { - if (m_AllocatedSize < other.m_AllocatedSize) - { - if (m_Elements) - delete [] m_Elements; - m_Elements = new T[other.m_AllocatedSize]; - m_AllocatedSize = other.m_AllocatedSize; - } - m_UsedSize = other.m_UsedSize; - for (size_t i = 0; i < m_UsedSize; ++i) - m_Elements[i] = other.m_Elements[i]; - } - - bool push(const T &val) - { - if (m_UsedSize + 1 == m_AllocatedSize) - { - // zOHNOES! REALLOCATE! - m_AllocatedSize *= 2; - T *newElements = new T[m_AllocatedSize]; - if (!newElements) - { - m_AllocatedSize /= 2; - return false; - } - if (m_Elements) - { - for (size_t i = 0; i < m_UsedSize; ++i) - newElements[i] = m_Elements[i]; - delete [] m_Elements; - } - m_Elements = newElements; - } - m_Elements[m_UsedSize++] = val; - return true; - } - - void pop() - { - --m_UsedSize; - } - - void popall() - { - m_UsedSize = 0; - } - - T &front() - { - return m_Elements[m_UsedSize - 1]; - } - - const T &front() const - { - return m_Elements[m_UsedSize - 1]; - } - - T &second() - { - return m_Elements[m_UsedSize - 2]; - } - - const T &second() const - { - return m_Elements[m_UsedSize - 2]; - } - - iterator begin() - { - return iterator(this, 0); - } - iterator end() - { - return iterator(this, m_UsedSize); - } - - size_t size() - { - return m_UsedSize; - } - size_t capacity() - { - return m_AllocatedSize; - } - bool empty() - { - return m_UsedSize == 0 ? true : false; - } - bool reserve(size_t size) - { - if (size > m_AllocatedSize) - { - T *newElements = new T[size]; - if (!newElements) - return false; - if (m_Elements) - { - for (size_t i = 0; i < m_UsedSize; ++i) - newElements[i] = m_Elements[i]; - delete [] m_Elements; - } - m_Elements = newElements; - m_AllocatedSize = size; - } - return true; - } - }; -}; //namespace SourceHook - -#endif diff --git a/sourcehook/sh_string.h b/sourcehook/sh_string.h deleted file mode 100755 index 220b4ee..0000000 --- a/sourcehook/sh_string.h +++ /dev/null @@ -1,401 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -/* AMX Mod X - * - * by the AMX Mod X Development Team - */ - -#ifndef _INCLUDE_CSTRING_H -#define _INCLUDE_CSTRING_H - -#include -#include - -namespace SourceHook -{ -class String -{ -public: - String() - { - v = NULL; - a_size = 0; - //assign(""); - } - - ~String() - { - if (v) - delete [] v; - } - - String(const char *src) - { - v = NULL; - a_size = 0; - assign(src); - } - - String(const String &src) - { - v = NULL; - a_size = 0; - assign(src.c_str()); - } - - bool operator ==(const String &other) - { - return (compare(other.c_str()) == 0); - } - - bool operator ==(const char *other) - { - return (compare(other) == 0); - } - - const char *c_str() { return v?v:""; } - - const char *c_str() const { return v?v:""; } - - void append(const char *t) - { - Grow(size() + strlen(t) + 1); - strcat(v, t); - } - - void append(const char c) - { - size_t len = size(); - Grow(len + 2); - v[len] = c; - v[len + 1] = '\0'; - } - - void append(String &d) - { - append(d.c_str()); - } - - void assign(const String &src) - { - assign(src.c_str()); - } - - void assign(const char *d) - { - if (!d) - { - clear(); - } else { - Grow(strlen(d) + 1, false); - strcpy(v, d); - } - } - - void clear() - { - if (v) - v[0] = '\0'; - } - - int compare (const char *d) const - { - if (!v) - return strcmp("", d); - else - return strcmp(v, d); - } - - //Added this for amxx inclusion - bool empty() const - { - if (!v) - return true; - - if (v[0] == '\0') - return true; - - return false; - } - - size_t size() const - { - if (v) - return strlen(v); - else - return 0; - } - - int find(const char c, int index = 0) const - { - int len = static_cast(size()); - if (len < 1) - return npos; - if (index >= len || index < 0) - return npos; - int i = 0; - for (i=index; i(size()); - if (len < 1) - return npos; - if (index >= len || index < npos) - return npos; - int i; - if (index == npos) - i = len - 1; - else - i = index; - - for (; i>=0; i--) - { - if (v[i] == c) - { - return i; - } - } - - return npos; - } - - bool is_space(int c) const - { - if (c == '\f' || c == '\n' || - c == '\t' || c == '\r' || - c == '\v' || c == ' ') - { - return true; - } - - return false; - } - - void trim() - { - if (!v) - return; - - unsigned int i = 0; - unsigned int j = 0; - size_t len = strlen(v); - - if (len == 1) - { - if (is_space(v[i])) - { - clear(); - return; - } - } - - unsigned char c0 = v[0]; - - if (is_space(c0)) - { - for (i=0; i=0; i--) - { - if (!is_space(v[i]) - || (is_space(v[i]) && i==0)) - { - erase(i+1, j); - break; - } - j++; - } - } - - if (len == 1) - { - if (is_space(v[0])) - { - clear(); - return; - } - } - } - - void erase(unsigned int start, int num = npos) - { - if (!v) - return; - unsigned int i = 0; - size_t len = size(); - //check for bounds - if (num == npos || start+num > len-start) - num = len - start; - //do the erasing - bool copyflag = false; - for (i=0; i=start && i= len || !v) - return ns; - - if (num == npos) - { - num = len - index; - } else if (index+num >= len) { - num = len - index; - } - - unsigned int i = 0; - unsigned int nslen = num + 2; - - ns.Grow(nslen); - - for (i=index; i= 65 && v[i] <= 90) - v[i] &= ~(1<<5); - } - } - - String & operator = (const String &src) - { - assign(src); - return *this; - } - - String & operator = (const char *src) - { - assign(src); - return *this; - - } - - char operator [] (unsigned int index) const - { - if (index > size() || !v) - { - return -1; - } else { - return v[index]; - } - } - - int at(int a) const - { - if (a < 0 || a >= (int)size() || !v) - return -1; - - return v[a]; - } - - bool at(int at, char c) - { - if (at < 0 || at >= (int)size() || !v) - return false; - - v[at] = c; - - return true; - } - -private: - void Grow(unsigned int d, bool copy=true) - { - if (d <= a_size) - return; - char *n = new char[d + 1]; - if (copy && v) - strcpy(n, v); - if (v) - delete [] v; - else - strcpy(n, ""); - v = n; - a_size = d + 1; - } - - char *v; - unsigned int a_size; -public: - static const int npos = -1; -}; - -}; //NAMESPACE - -#endif //_INCLUDE_CSTRING_H diff --git a/sourcehook/sh_tinyhash.h b/sourcehook/sh_tinyhash.h deleted file mode 100644 index 634b253..0000000 --- a/sourcehook/sh_tinyhash.h +++ /dev/null @@ -1,534 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -#ifndef _INCLUDE_SH_TINYHASH_H_ -#define _INCLUDE_SH_TINYHASH_H_ - -#include "sh_list.h" - -#define _T_INIT_HASH_SIZE 32 - -namespace SourceHook -{ - template - int HashFunction(const K & k); - - template - int HashAlt(const U &u); - - template - int CompareAlt(const U &k1, const K &k2); - - template - int Compare(const K & k1, const K & k2); - - /** - * This is a tiny, growable hash class. - * Meant for quick and dirty dictionaries only! - */ - template - class THash - { - public: - struct THashNode - { - THashNode(const K & k, const V & v) : - key(k), val(v) - { - }; - THashNode & operator =(const THashNode &other) - { - key = other.key; - val = other.val; - } - K key; - V val; - }; - typedef List * NodePtr; - public: - class const_iterator; - THash() : m_Buckets(NULL), m_numBuckets(0), m_percentUsed(0.0f) - { - _Refactor(); - } - THash(const THash &other) : m_Buckets(new NodePtr[other.m_numBuckets]), - m_numBuckets(other.m_numBuckets), m_percentUsed(other.m_percentUsed) - { - for (size_t i=0; ikey)->val = iter->val; - } - void operator=(const THash &other) - { - clear(); - for (const_iterator iter = other.begin(); iter != other.end(); ++iter) - _FindOrInsert(iter->key)->val = iter->val; - } - - ~THash() - { - _Clear(); - } - void clear() - { - _Clear(); - _Refactor(); - } - size_t GetBuckets() - { - return m_numBuckets; - } - float PercentUsed() - { - return m_percentUsed; - } - V & operator [](const K & key) - { - THashNode *pNode = _FindOrInsert(key); - return pNode->val; - } - private: - void _Clear() - { - typename List::iterator iter, end; - for (size_t i=0; iend(); - iter = m_Buckets[i]->begin(); - while (iter != end) - { - delete (*iter); - iter++; - } - delete m_Buckets[i]; - m_Buckets[i] = NULL; - } - } - if (m_Buckets) - delete [] m_Buckets; - m_Buckets = NULL; - m_numBuckets = 0; - } - public: - template - V & AltFindOrInsert(const U & ukey) - { - size_t place = HashAlt(ukey) % m_numBuckets; - THashNode *pNode = NULL; - if (!m_Buckets[place]) - { - m_Buckets[place] = new List; - pNode = new THashNode(ukey, V()); - m_Buckets[place]->push_back(pNode); - m_percentUsed += (1.0f / (float)m_numBuckets); - } else { - typename List::iterator iter; - for (iter=m_Buckets[place]->begin(); iter!=m_Buckets[place]->end(); iter++) - { - if (CompareAlt(ukey, (*iter)->key) == 0) - { - return (*iter)->val; - } - } - //node does not exist - pNode = new THashNode(ukey, V()); - m_Buckets[place]->push_back(pNode); - } - if (PercentUsed() > 0.75f) - { - _Refactor(); - } - return pNode->val; - } - private: - THashNode *_FindOrInsert(const K & key) - { - size_t place = HashFunction(key) % m_numBuckets; - THashNode *pNode = NULL; - if (!m_Buckets[place]) - { - m_Buckets[place] = new List; - pNode = new THashNode(key, V()); - m_Buckets[place]->push_back(pNode); - m_percentUsed += (1.0f / (float)m_numBuckets); - } else { - typename List::iterator iter; - for (iter=m_Buckets[place]->begin(); iter!=m_Buckets[place]->end(); iter++) - { - if (Compare((*iter)->key, key) == 0) - return (*iter); - } - //node does not exist - pNode = new THashNode(key, V()); - m_Buckets[place]->push_back(pNode); - } - if (PercentUsed() > 0.75f) - { - _Refactor(); - } - return pNode; - } - void _Refactor() - { - m_percentUsed = 0.0f; - if (!m_numBuckets) - { - m_numBuckets = _T_INIT_HASH_SIZE; - m_Buckets = new NodePtr[m_numBuckets]; - for (size_t i=0; i::iterator iter; - size_t place; - THashNode *pHashNode; - NodePtr *temp = new NodePtr[m_numBuckets]; - for (size_t i=0; ibegin(); iter != m_Buckets[i]->end(); iter++) - { - pHashNode = (*iter); - //rehash it with the new bucket filter - place = HashFunction(pHashNode->key) % m_numBuckets; - //add it to the new hash table - if (!temp[place]) - { - temp[place] = new List; - m_percentUsed += (1.0f / (float)m_numBuckets); - } - temp[place]->push_back(pHashNode); - } - //delete that bucket! - delete m_Buckets[i]; - m_Buckets[i] = NULL; - } - } - //reassign bucket table - delete [] m_Buckets; - m_Buckets = temp; - } - } - public: - friend class iterator; - friend class const_iterator; - class iterator - { - friend class THash; - public: - iterator() : curbucket(-1), hash(NULL), end(true) - { - }; - iterator(THash *h) : curbucket(-1), hash(h), end(false) - { - if (!h->m_Buckets) - end = true; - else - _Inc(); - }; - //pre increment - iterator & operator++() - { - _Inc(); - return *this; - } - //post increment - iterator operator++(int) - { - iterator old(*this); - _Inc(); - return old; - } - const THashNode & operator * () const - { - return *(*iter); - } - THashNode & operator * () - { - return *(*iter); - } - const THashNode * operator ->() const - { - return (*iter); - } - THashNode * operator ->() - { - return (*iter); - } - bool operator ==(const iterator &where) const - { - if (where.hash == this->hash - && where.end == this->end - && - (this->end || - ((where.curbucket == this->curbucket) - && (where.iter == iter)) - )) - return true; - return false; - } - bool operator !=(const iterator &where) const - { - return !( (*this) == where ); - } - - void erase() - { - if (end || !hash || curbucket < 0 || curbucket >= static_cast(hash->m_numBuckets)) - return; - - // Remove this element and move to the next one - iterator tmp = *this; - ++tmp; - delete (*iter); - hash->m_Buckets[curbucket]->erase(iter); - *this = tmp; - - // :TODO: Maybe refactor to a lower size if required - } - private: - void _Inc() - { - if (end || !hash || curbucket >= static_cast(hash->m_numBuckets)) - return; - if (curbucket < 0) - { - for (int i=0; i<(int)hash->m_numBuckets; i++) - { - if (hash->m_Buckets[i]) - { - iter = hash->m_Buckets[i]->begin(); - if (iter == hash->m_Buckets[i]->end()) - continue; - curbucket = i; - break; - } - } - if (curbucket < 0) - end = true; - } else { - if (iter != hash->m_Buckets[curbucket]->end()) - iter++; - if (iter == hash->m_Buckets[curbucket]->end()) - { - int oldbucket = curbucket; - for (int i=curbucket+1; i<(int)hash->m_numBuckets; i++) - { - if (hash->m_Buckets[i]) - { - iter = hash->m_Buckets[i]->begin(); - if (iter == hash->m_Buckets[i]->end()) - continue; - curbucket = i; - break; - } - } - if (curbucket == oldbucket) - end = true; - } - } - } - private: - int curbucket; - typename SourceHook::List::iterator iter; - THash *hash; - bool end; - }; - class const_iterator - { - friend class THash; - public: - const_iterator() : curbucket(-1), hash(NULL), end(true) - { - }; - const_iterator(const THash *h) : curbucket(-1), hash(h), end(false) - { - if (!h->m_Buckets) - end = true; - else - _Inc(); - }; - //pre increment - const_iterator & operator++() - { - _Inc(); - return *this; - } - //post increment - const_iterator operator++(int) - { - iterator old(*this); - _Inc(); - return old; - } - const THashNode & operator * () const - { - return *(*iter); - } - const THashNode * operator ->() const - { - return (*iter); - } - bool operator ==(const const_iterator &where) const - { - if (where.hash == this->hash - && where.end == this->end - && - (this->end || - ((where.curbucket == this->curbucket) - && (where.iter == iter)) - )) - return true; - return false; - } - bool operator !=(const const_iterator &where) const - { - return !( (*this) == where ); - } - private: - void _Inc() - { - if (end || !hash || curbucket >= static_cast(hash->m_numBuckets)) - return; - if (curbucket < 0) - { - for (int i=0; i<(int)hash->m_numBuckets; i++) - { - if (hash->m_Buckets[i]) - { - iter = hash->m_Buckets[i]->begin(); - if (iter == hash->m_Buckets[i]->end()) - continue; - curbucket = i; - break; - } - } - if (curbucket < 0) - end = true; - } else { - if (iter != hash->m_Buckets[curbucket]->end()) - iter++; - if (iter == hash->m_Buckets[curbucket]->end()) - { - int oldbucket = curbucket; - for (int i=curbucket+1; i<(int)hash->m_numBuckets; i++) - { - if (hash->m_Buckets[i]) - { - iter = hash->m_Buckets[i]->begin(); - if (iter == hash->m_Buckets[i]->end()) - continue; - curbucket = i; - break; - } - } - if (curbucket == oldbucket) - end = true; - } - } - } - private: - int curbucket; - typename SourceHook::List::iterator iter; - const THash *hash; - bool end; - }; - public: - iterator begin() - { - return iterator(this); - } - iterator end() - { - iterator iter; - iter.hash = this; - return iter; - } - - const_iterator begin() const - { - return const_iterator(this); - } - const_iterator end() const - { - const_iterator iter; - iter.hash = this; - return iter; - } - - template - iterator find(const U & u) const - { - iterator b = begin(); - iterator e = end(); - for (iterator iter = b; iter != e; iter++) - { - if ( (*iter).key == u ) - return iter; - } - return end(); - } - template - iterator find(const U & u) - { - iterator b = begin(); - iterator e = end(); - for (iterator iter = b; iter != e; iter++) - { - if ( (*iter).key == u ) - return iter; - } - return end(); - } - template - iterator FindAlt(const U & u) - { - iterator b = begin(); - iterator e = end(); - for (iterator iter = b; iter != e; iter++) - { - if (CompareAlt(u, (*iter).key) == 0) - { - return iter; - } - } - return e; - } - iterator erase(iterator where) - { - where.erase(); - return where; - } - template - void erase(const U & u) - { - iterator iter = find(u); - if (iter == end()) - return; - iter.erase(); - } - private: - NodePtr *m_Buckets; - size_t m_numBuckets; - float m_percentUsed; - }; -}; - -#endif //_INCLUDE_SH_TINYHASH_H_ diff --git a/sourcehook/sh_vector.h b/sourcehook/sh_vector.h deleted file mode 100755 index 45f4ed6..0000000 --- a/sourcehook/sh_vector.h +++ /dev/null @@ -1,490 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -#ifndef __CVECTOR_H__ -#define __CVECTOR_H__ - -#include - -//This file originally from AMX Mod X -namespace SourceHook -{ -// Vector -template class CVector -{ - bool Grow() - { - // automatic grow - size_t newSize = m_Size * 2; - if (newSize == 0) - newSize = 8; // a good init value - T *newData = new T[newSize]; - if (!newData) - return false; - if (m_Data) - { - for (size_t i=0; i= m_Size) - return Grow(); - else - return true; - } - - bool ChangeSize(size_t size) - { - // change size - if (size == m_Size) - return true; - - if (!size) - { - if (m_Data) - { - delete [] m_Data; - m_Data = NULL; - m_Size = 0; - } - return true; - } - - T *newData = new T[size]; - if (!newData) - return false; - if (m_Data) - { - size_t end = (m_CurrentUsedSize < size) ? (m_CurrentUsedSize) : size; - for (size_t i=0; i m_Size) - m_CurrentUsedSize = m_Size; - - return true; - } - - void FreeMemIfPossible() - { - if (!m_Data) - return; - - if (!m_CurrentUsedSize) - { - ChangeSize(0); - return; - } - - size_t newSize = m_Size; - while (m_CurrentUsedSize <= newSize / 2) - newSize /= 2; - - if (newSize != m_Size) - ChangeSize(newSize); - } -protected: - T *m_Data; - size_t m_Size; - size_t m_CurrentUsedSize; -public: - class iterator - { - protected: - T *m_Ptr; - public: - // constructors / destructors - iterator() - { - m_Ptr = NULL; - } - - iterator(T * ptr) - { - m_Ptr = ptr; - } - - // member functions - T * base() - { - return m_Ptr; - } - - const T * base() const - { - return m_Ptr; - } - - // operators - T & operator*() - { - return *m_Ptr; - } - - T * operator->() - { - return m_Ptr; - } - - iterator & operator++() // preincrement - { - ++m_Ptr; - return (*this); - } - - iterator operator++(int) // postincrement - { - iterator tmp = *this; - ++m_Ptr; - return tmp; - } - - iterator & operator--() // predecrement - { - --m_Ptr; - return (*this); - } - - iterator operator--(int) // postdecrememnt - { - iterator tmp = *this; - --m_Ptr; - return tmp; - } - - bool operator==(T * right) const - { - return (m_Ptr == right); - } - - bool operator==(const iterator & right) const - { - return (m_Ptr == right.m_Ptr); - } - - bool operator!=(T * right) const - { - return (m_Ptr != right); - } - - bool operator!=(const iterator & right) const - { - return (m_Ptr != right.m_Ptr); - } - - iterator & operator+=(size_t offset) - { - m_Ptr += offset; - return (*this); - } - - iterator & operator-=(size_t offset) - { - m_Ptr -= offset; - return (*this); - } - - iterator operator+(size_t offset) const - { - iterator tmp(*this); - tmp.m_Ptr += offset; - return tmp; - } - - iterator operator-(size_t offset) const - { - iterator tmp(*this); - tmp.m_Ptr -= offset; - return tmp; - } - - T & operator[](size_t offset) - { - return (*(*this + offset)); - } - - const T & operator[](size_t offset) const - { - return (*(*this + offset)); - } - - bool operator<(const iterator & right) const - { - return m_Ptr < right.m_Ptr; - } - - bool operator>(const iterator & right) const - { - return m_Ptr > right.m_Ptr; - } - - bool operator<=(const iterator & right) const - { - return m_Ptr <= right.m_Ptr; - } - - bool operator>=(const iterator & right) const - { - return m_Ptr >= right.m_Ptr; - } - - size_t operator-(const iterator & right) const - { - return m_Ptr - right.m_Ptr; - } - }; - - // constructors / destructors - CVector() - { - m_Size = 0; - m_CurrentUsedSize = 0; - m_Data = NULL; - } - - CVector(const CVector & other) - { - // copy data - m_Data = new T [other.m_CurrentUsedSize]; - m_Size = other.m_CurrentUsedSize; - m_CurrentUsedSize = other.m_CurrentUsedSize; - for (size_t i=0; i() - { - clear(); - } - - CVector & operator =(const CVector & other) - { - clear(); - ChangeSize(other.size()); - m_CurrentUsedSize = other.size(); - for (size_t i=0; i m_CurrentUsedSize) - assert(0); - return iterator(m_Data + pos); - } - - bool reserve(size_t newSize) - { - if (newSize > m_Size) - return ChangeSize(newSize); - return true; - } - - bool push_back(const T & elem) - { - ++m_CurrentUsedSize; - if (!GrowIfNeeded()) - { - --m_CurrentUsedSize; - return false; - } - - m_Data[m_CurrentUsedSize - 1] = elem; - return true; - } - - void pop_back() - { - --m_CurrentUsedSize; - if (m_CurrentUsedSize < 0) - m_CurrentUsedSize = 0; - - FreeMemIfPossible(); - } - - bool resize(size_t newSize) - { - return resize(newSize, T()); - } - - bool resize(size_t newSize, T defval) - { - if (!ChangeSize(newSize)) - return false; - for (size_t i = m_CurrentUsedSize; i < newSize; ++i) - m_Data[i] = defval; - m_CurrentUsedSize = newSize; - return true; - } - - bool empty() const - { - return (m_CurrentUsedSize == 0); - } - - T & at(size_t pos) - { - if (pos > m_CurrentUsedSize) - { - assert(0); - } - return m_Data[pos]; - } - - const T & at(size_t pos) const - { - if (pos > m_CurrentUsedSize) - { - assert(0); - } - return m_Data[pos]; - } - - T & operator[](size_t pos) - { - return at(pos); - } - - const T & operator[](size_t pos) const - { - return at(pos); - } - - T & front() - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[0]; - } - - const T & front() const - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[0]; - } - - T & back() - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[m_CurrentUsedSize - 1]; - } - - const T & back() const - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[m_CurrentUsedSize - 1]; - } - - iterator insert(iterator where, const T & value) - { - // validate iter - if (where < m_Data || where > (m_Data + m_CurrentUsedSize)) - return iterator(0); - - size_t ofs = where - begin(); - - ++m_CurrentUsedSize; - if (!GrowIfNeeded()) - { - --m_CurrentUsedSize; - return false; - } - - where = begin() + ofs; - - // Move subsequent entries - for (T *ptr = m_Data + m_CurrentUsedSize - 2; ptr >= where.base(); --ptr) - *(ptr + 1) = *ptr; - - *where.base() = value; - - return where; - } - - iterator erase(iterator where) - { - // validate iter - if (where < m_Data || where >= (m_Data + m_CurrentUsedSize)) - return iterator(0); - - size_t ofs = where - begin(); - - if (m_CurrentUsedSize > 1) - { - // move - T *theend = m_Data + m_CurrentUsedSize; - for (T *ptr = where.base() + 1; ptr < theend; ++ptr) - *(ptr - 1) = *ptr; - } - - --m_CurrentUsedSize; - - FreeMemIfPossible(); - - return begin() + ofs; - } - - void clear() - { - m_Size = 0; - m_CurrentUsedSize = 0; - if (m_Data) - { - delete [] m_Data; - m_Data = NULL; - } - } -}; -}; //namespace SourceHook - -#endif // __CVECTOR_H__ diff --git a/sourcehook/sourcehook.cpp b/sourcehook/sourcehook.cpp deleted file mode 100644 index e2fc8b0..0000000 --- a/sourcehook/sourcehook.cpp +++ /dev/null @@ -1,1463 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* Contributors: Scott "Damaged Soul" Ehlert -* ============================ -*/ - -/** - * @file sourcehook.cpp - * @brief Contains the implementation of the SourceHook API -*/ - -#if defined __GNUC__ -#include -#endif - -#include "sourcehook_impl.h" -#include "sh_memory.h" - -namespace SourceHook -{ - template<> - int HashFunction(const int & k) - { - return k; - } - template<> - int Compare(const int & k1, const int & k2) - { - if (k1 == k2) - return 0; - if (k1 > k2) - return 1; - if (k1 < k2) - return -1; - return 0; - } - CSourceHookImpl::CSourceHookImpl() : m_OneIgnore(NULL), m_IgnoreActive(false) - { - } - CSourceHookImpl::~CSourceHookImpl() - { - } - - int CSourceHookImpl::GetIfaceVersion() - { - return SH_IFACE_VERSION; - } - - int CSourceHookImpl::GetImplVersion() - { - return SH_IMPL_VERSION; - } - - bool CSourceHookImpl::IsPluginInUse(Plugin plug) - { - // Iterate through all hook managers which are in this plugin - // Iterate through their vfnptrs, ifaces, hooks - // If a hook from an other plugin is found, return true - // Return false otherwise -#define TMP_CHECK_LIST(name) \ - for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ - if (hook_iter->plug == plug) \ - return true; - - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hmil_iter = hmcl_iter->begin(); - hmil_iter != hmcl_iter->end(); ++hmil_iter) - { - if (hmil_iter->m_Plug != plug) - continue; - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - List::iterator hook_iter; - TMP_CHECK_LIST(m_PreHooks); - TMP_CHECK_LIST(m_PostHooks); - } - } - } - } - -#undef TMP_CHECK_LIST - return false; - } - - void CSourceHookImpl::UnloadPlugin(Plugin plug) - { - // 1) Manually remove all hooks by this plugin - // 2) Manually remove all hook mans by this plugin - - List hookstoremove; - List hookmanstoremove; - HookManInfoList::iterator hmil_iter; - -#define TMP_CHECK_LIST(name, ispost) \ - for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ - if (hook_iter->plug == plug) \ - hookstoremove.push_back(RemoveHookInfo(hook_iter->plug, iface_iter->m_Ptr, \ - hook_iter->thisptr_offs, hmil_iter->m_Func, hook_iter->handler, ispost)); \ - - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hmil_iter = hmcl_iter->begin(); - hmil_iter != hmcl_iter->end(); ++hmil_iter) - { - if (hmil_iter->m_Plug == plug) - hookmanstoremove.push_back(RemoveHookManInfo(plug, hmil_iter->m_Func)); - - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - List::iterator hook_iter; - TMP_CHECK_LIST(m_PreHooks, false); - TMP_CHECK_LIST(m_PostHooks, true); - } - } - } - } -#undef TMP_CHECK_LIST - - for (List::iterator rmiter = hookstoremove.begin(); rmiter != hookstoremove.end(); ++rmiter) - RemoveHook(*rmiter); - - for (List::iterator rmiter = hookmanstoremove.begin(); rmiter != hookmanstoremove.end(); ++rmiter) - RemoveHookManager(*rmiter); - } - - void CSourceHookImpl::RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) - { - // Moo! - - CHookManagerInfo tmp; - if (pubFunc(HA_GetInfo, &tmp) != 0) - return; - - - HookManContList::iterator hmcl_iter = m_HookMans.find( - CHookManagerContainer::HMCI(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx)); - - if (hmcl_iter == m_HookMans.end()) - { - // Moo? - return; - } - - CHookManagerContainer::iterator hmil_iter = hmcl_iter->find( - CHookManagerInfo::Descriptor(plug, pubFunc)); - - if (hmil_iter == hmcl_iter->end()) - { - // Moo? - return; - } - - bool stillInUse = false; - List hookstoremove; - - // Iterate through all of the hook manager's hooks. Remove all hooks from the hookman's plugin. -#define TMP_CHECK_LIST(name, ispost) \ - for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ - if (hook_iter->plug == plug) \ - hookstoremove.push_back(RemoveHookInfo(hook_iter->plug, iface_iter->m_Ptr, \ - hook_iter->thisptr_offs, hmil_iter->m_Func, hook_iter->handler, ispost)); \ - else \ - stillInUse = true; \ - - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - List::iterator hook_iter; - TMP_CHECK_LIST(m_PreHooks, false); - TMP_CHECK_LIST(m_PostHooks, true); - } - } -#undef TMP_CHECK_LIST - - for (List::iterator rmiter = hookstoremove.begin(); rmiter != hookstoremove.end(); ++rmiter) - RemoveHook(*rmiter); - - CHookManagerInfo info = *hmil_iter; - - // Unlink the hook manager from the list - hmcl_iter->erase(hmil_iter); - - // If there were any hooks from other plugins, find a new suitable hook manager. - if (stillInUse) - { - // Find a suitable hook manager in an other plugin - hmil_iter = hmcl_iter->begin(); - - // This should _never_ happen. - // If there is a hook from an other plugin, the plugin must have provided a hook manager as well. - SH_ASSERT(hmil_iter != hmcl_iter->end(), - ("Could not find a suitable hook manager in an other plugin!")); - - // AddHook should make sure that every plugin only has _one_ hook manager for _one_ proto/vi/vo - SH_ASSERT(hmil_iter->m_Plug != plug, ("New hook manager from same plugin!")); - - // The first hook manager should be always used - so the new hook manager has to be empty - SH_ASSERT(hmil_iter->m_VfnPtrs.empty(), ("New hook manager not empty!")); - - // Move the vfnptrs from the old hook manager to the new one - hmil_iter->m_VfnPtrs = info.m_VfnPtrs; - - // Unregister the old one, register the new one - info.m_Func(HA_Unregister, NULL); - hmil_iter->m_Func(HA_Register, &(*hmil_iter)); - - // Go through all vfnptrs in this hookman and patch them to point to the new manager's handler! - // or whatever - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - // And DEREFERENCE newHookMan->m_HookfuncVfnptr! - // otherwise it will be executing the vtable... had to find out the hard way - *reinterpret_cast(vfnptr_iter->m_Ptr) = *reinterpret_cast(hmil_iter->m_HookfuncVfnptr); - } - } - } - - void CSourceHookImpl::RemoveHookManager(RemoveHookManInfo info) - { - RemoveHookManager(info.plug, info.hookman); - } - - void CSourceHookImpl::CompleteShutdown() - { - // Remove all hooks - - List hookstoremove; - -#define TMP_CHECK_LIST(name, ispost) \ - for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ - hookstoremove.push_back(RemoveHookInfo(hook_iter->plug, iface_iter->m_Ptr, \ - hook_iter->thisptr_offs, hmil_iter->m_Func, hook_iter->handler, ispost)) - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hmil_iter = hmcl_iter->begin(); - hmil_iter != hmcl_iter->end(); ++hmil_iter) - { - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - List::iterator hook_iter; - TMP_CHECK_LIST(m_PreHooks, false); - TMP_CHECK_LIST(m_PostHooks, true); - } - } - } - } -#undef TMP_CHECK_LIST - - for (List::iterator rmiter = hookstoremove.begin(); rmiter != hookstoremove.end(); ++rmiter) - RemoveHook(*rmiter); - - m_HookMans.clear(); - } - - - bool CSourceHookImpl::AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post) - { - return AddHookNew(plug, Hook_Normal, iface, thisptr_offs, myHookMan, handler, post) != 0 ? true : false; - } - - int CSourceHookImpl::AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) - { - void *adjustediface = NULL; - void **cur_vtptr = NULL; - void *cur_vfnptr = NULL; - - if (mode != Hook_Normal && mode != Hook_VP && mode != Hook_DVP) - return 0; - - // 1) Get info about the hook manager - CHookManagerInfo tmp; - if (myHookMan(HA_GetInfo, &tmp) != 0) - return 0; - - tmp.m_Func = myHookMan; - tmp.m_Plug = plug; - - CHookManagerContainer::HMCI hmci(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx); - - // Add the container if not already added - HookManContList::iterator hmcl_iter = m_HookMans.find(hmci); - if (hmcl_iter == m_HookMans.end()) - { - m_HookMans.push_back(CHookManagerContainer(hmci)); - hmcl_iter = m_HookMans.end(); - --hmcl_iter; - } - - hmcl_iter->AddHookManager(plug, tmp); - - CHookManagerContainer::iterator hookman = hmcl_iter->begin(); - SH_ASSERT(hookman != hmcl_iter->end(), ("No hookman found - but we've just added one!")); - - // Check whether any other container holds a hook manager which holds this vfnptr - // If yes, it means that the two are incompatible, so return false. - for (HookManContList::iterator hmcl_iter2 = m_HookMans.begin(); - hmcl_iter2 != m_HookMans.end(); ++hmcl_iter2) - { - if (hmcl_iter2 != hmcl_iter) - { - for (CHookManagerContainer::iterator hmil_iter = hmcl_iter2->begin(); - hmil_iter != hmcl_iter2->end(); ++hmil_iter) - { - if (hmil_iter->m_VfnPtrs.find(cur_vfnptr) != hmil_iter->m_VfnPtrs.end()) - return 0; - } - } - } - - // Tell it to store the pointer if it's not already active - if (hookman->m_VfnPtrs.empty()) - hookman->m_Func(HA_Register, &(*hookman)); - - - // find vfnptr - if (mode == Hook_Normal || mode == Hook_VP) - { - adjustediface = reinterpret_cast(reinterpret_cast(iface) + thisptr_offs); - - cur_vtptr = *reinterpret_cast( - reinterpret_cast(adjustediface) + tmp.m_VtblOffs); - cur_vfnptr = reinterpret_cast(cur_vtptr + tmp.m_VtblIdx); - - // For Hook_VP, adjustediface will be set to NULL later - // because we first have to patch callclasses (callclasses are deprecated but left in for backwards compat) - } - else if (mode == Hook_DVP) - { - adjustediface = NULL; - - cur_vtptr = reinterpret_cast(iface); - cur_vfnptr = cur_vtptr + tmp.m_VtblIdx; - } - - CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.find(cur_vfnptr); - - if (vfnptr_iter == hookman->m_VfnPtrs.end()) - { - // Add a new one - CVfnPtr vfp(cur_vfnptr, &m_OneIgnore); - - // Alter vtable entry - if (!SetMemAccess(cur_vtptr, sizeof(void*) * (tmp.m_VtblIdx + 1), SH_MEM_READ | SH_MEM_WRITE)) - return 0; - - *reinterpret_cast(cur_vfnptr) = *reinterpret_cast(hookman->m_HookfuncVfnptr); - - hookman->m_VfnPtrs.push_back(vfp); - - // Make vfnptr_iter point to the new element - vfnptr_iter = hookman->m_VfnPtrs.end(); - --vfnptr_iter; - - // Now that it is done, check whether we have to update any callclasses - ApplyCallClassPatches(adjustediface, tmp.m_VtblOffs, tmp.m_VtblIdx, vfp.m_OrigEntry); - } - - // If it's a VP hook, set adjustediface to NULL now ( see the comments at the beginning of sourcehook_impl.h ) - if (mode == Hook_VP) - adjustediface = NULL; - - CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.find(adjustediface); - if (iface_iter == vfnptr_iter->m_Ifaces.end()) - { - // Add a new one - vfnptr_iter->m_Ifaces.push_back(CIface(adjustediface)); - - // Make iface_iter point to the new element - iface_iter = vfnptr_iter->m_Ifaces.end(); - --iface_iter; - - // If this is a VP-Hook-NULL interface, go through all other interfaces of this vfnptr and tell them! - if (adjustediface == NULL) - { - for (CVfnPtr::IfaceListIter iface_iter2 = vfnptr_iter->m_Ifaces.begin(); - iface_iter2 != vfnptr_iter->m_Ifaces.end(); ++iface_iter2) - { - if (*iface_iter2 != NULL) - { - iface_iter2->m_PreHooks.SetVPList(&iface_iter->m_PreHooks.m_List); - iface_iter2->m_PostHooks.SetVPList(&iface_iter->m_PostHooks.m_List); - } - } - } - else - { - // If this is a new non-VP-Hook-NULL interface, look for a non-VP-Hook-NULL interface! - for (CVfnPtr::IfaceListIter iface_iter2 = vfnptr_iter->m_Ifaces.begin(); - iface_iter2 != vfnptr_iter->m_Ifaces.end(); ++iface_iter2) - { - if (*iface_iter2 == NULL) - { - iface_iter->m_PreHooks.SetVPList(&iface_iter2->m_PreHooks.m_List); - iface_iter->m_PostHooks.SetVPList(&iface_iter2->m_PostHooks.m_List); - break; // There can only be one! - } - } - } - } - - // Add the hook - HookInfo hookinfo; - hookinfo.handler = handler; - hookinfo.plug = plug; - hookinfo.paused = false; - hookinfo.thisptr_offs = thisptr_offs; - hookinfo.hookid = m_HookIDMan.New(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx, cur_vfnptr, - adjustediface, plug, thisptr_offs, handler, post); - - if (post) - iface_iter->m_PostHooks.m_List.push_back(hookinfo); - else - iface_iter->m_PreHooks.m_List.push_back(hookinfo); - - return hookinfo.hookid; - } - - bool CSourceHookImpl::RemoveHookByID(Plugin plug, int hookid) - { - const CHookIDManager::Entry *hentry; - - hentry = m_HookIDMan.QueryHook(hookid); - if (!hentry) - { - // hookid doesn't exist ! - return false; - } - - HookManContList::iterator hmcl_iter = m_HookMans.find( - CHookManagerContainer::HMCI(hentry->proto.GetProto(), hentry->vtbl_offs, hentry->vtbl_idx)); - if (hmcl_iter == m_HookMans.end() || hmcl_iter->empty()) - return false; - CHookManagerContainer::iterator hookman = hmcl_iter->begin(); - - // Find vfnptr - CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.find(hentry->vfnptr); - if (vfnptr_iter == hookman->m_VfnPtrs.end()) - return false; - - // Find iface - CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.find(hentry->adjustediface); - if (iface_iter == vfnptr_iter->m_Ifaces.end()) - return false; - - // Find hook - List &hooks = hentry->post ? iface_iter->m_PostHooks.m_List : iface_iter->m_PreHooks.m_List; - - List::iterator hookiter = hooks.find(hookid); - if (hookiter == hooks.end()) - return false; - - hookiter->handler->DeleteThis(); - - // Move all iterators pointing at this - List::iterator oldhookiter = hookiter; - hookiter = hooks.erase(hookiter); - List::iterator newhookiter = hookiter; - --newhookiter; // The hook loop will ++ it then - CHookList::CIter *pItIter; - - for (pItIter = iface_iter->m_PreHooks.m_UsedIters; pItIter; pItIter = pItIter->m_pNext) - if (pItIter->m_Iter == oldhookiter) - pItIter->m_Iter = newhookiter; - - // If this is VP-Hook-NULL interface, also check all other interfaces of this vfnptr - if (*iface_iter == NULL) - { - for (CVfnPtr::IfaceListIter iface_iter2 = vfnptr_iter->m_Ifaces.begin(); - iface_iter2 != vfnptr_iter->m_Ifaces.end(); ++iface_iter2) - { - if (*iface_iter2 != NULL) - { - for (pItIter = iface_iter2->m_PreHooks.m_UsedIters; pItIter; pItIter = pItIter->m_pNext) - if (pItIter->m_Iter == oldhookiter) - pItIter->m_Iter = newhookiter; - } - } - } - - if (iface_iter->m_PostHooks.m_List.empty() && iface_iter->m_PreHooks.m_List.empty()) - { - // If this is a VP-Hook-NULL interface, go through all other interfaces of this vfnptr and tell them! - if (*iface_iter == NULL) - { - for (CVfnPtr::IfaceListIter iface_iter2 = vfnptr_iter->m_Ifaces.begin(); - iface_iter2 != vfnptr_iter->m_Ifaces.end(); ++iface_iter2) - { - if (iface_iter2->m_Ptr != NULL) - { - iface_iter2->m_PreHooks.ClearVPList(); - iface_iter2->m_PostHooks.ClearVPList(); - } - } - } - - - // There are no hooks on this iface anymore... - for (HookLoopInfoStack::iterator hli_iter = m_HLIStack.begin(); - hli_iter != m_HLIStack.end(); ++hli_iter) - { - if (hli_iter->pCurIface == static_cast(&(*iface_iter))) - hli_iter->shouldContinue = false; - } - - iface_iter = vfnptr_iter->m_Ifaces.erase(iface_iter); - if (vfnptr_iter->m_Ifaces.empty()) - { - // No ifaces at all -> Deactivate the hook - - // Only patch the vfnptr back if the module is still in memory - // If it's not, do not remove stuff like we did before - // First off we did it wrong (shutdown the whole hookman, uh..) and secondly applications may be - // confused by RemoveHook returning false then (yeah, I know, I made this one up, no one checks for RemoveHook error) - if (ModuleInMemory(reinterpret_cast(vfnptr_iter->m_Ptr), SH_PTRSIZE)) - { - *reinterpret_cast(vfnptr_iter->m_Ptr) = vfnptr_iter->m_OrigEntry; - } - - hookman->m_VfnPtrs.erase(vfnptr_iter); - - // Remove callclass patch - for (Impl_CallClassList::iterator cciter = m_CallClasses.begin(); cciter != m_CallClasses.end(); ++cciter) - if (cciter->m_Ptr == hentry->adjustediface) - cciter->RemoveCallClassPatch(hentry->vtbl_offs, hentry->vtbl_idx); - - if (hookman->m_VfnPtrs.empty()) - { - // Unregister the hook manager - hookman->m_Func(HA_Unregister, NULL); - } - } - } - - // Don't forget to remove the hookid from m_HookIDMan - m_HookIDMan.Remove(hookid); - - return true; - } - - bool CSourceHookImpl::RemoveHook(RemoveHookInfo info) - { - return RemoveHook(info.plug, info.iface, info.thisptr_offs, info.hookman, info.handler, info.post); - } - - bool CSourceHookImpl::RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post) - { - // Get info about hook manager and compute adjustediface - CHookManagerInfo tmp; - if (myHookMan(HA_GetInfo, &tmp) != 0) - return false; - - void *adjustediface = reinterpret_cast(reinterpret_cast(iface)+thisptr_offs); - - // Loop through all hooks and remove those which match: - // hookman, vfnptr, iface, plug, adjusted iface, this ptr offs, handler, post - CVector removehooks; - m_HookIDMan.FindAllHooks(removehooks, tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx, adjustediface, plug, thisptr_offs, handler, post); - - if (removehooks.empty()) - return false; - - bool status = false; - - for (CVector::iterator iter = removehooks.begin(); iter != removehooks.end(); ++iter) - { - if (RemoveHookByID(plug, *iter)) - status = true; - } - return status; - } - - DeprecatedCallClass *CSourceHookImpl::GetCallClass(void *iface, size_t size) - { - for (Impl_CallClassList::iterator cciter = m_CallClasses.begin(); cciter != m_CallClasses.end(); ++cciter) - { - if (cciter->m_Ptr == iface && cciter->m_ObjSize == size) - { - ++cciter->m_RefCounter; - return &(*cciter); - } - } - - // Make a new one - - CCallClassImpl tmp(iface, size); - ApplyCallClassPatches(tmp); - m_CallClasses.push_back(tmp); - return &m_CallClasses.back(); - } - - void CSourceHookImpl::ReleaseCallClass(DeprecatedCallClass *ptr) - { - Impl_CallClassList::iterator iter = m_CallClasses.find(ptr); - if (iter == m_CallClasses.end()) - return; - --iter->m_RefCounter; - if (iter->m_RefCounter < 1) - m_CallClasses.erase(iter); - } - - void CSourceHookImpl::ApplyCallClassPatches(CCallClassImpl &cc) - { - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hookman = hmcl_iter->begin(); - hookman != hmcl_iter->end(); ++hookman) - { - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.begin(); - vfnptr_iter != hookman->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - if (iface_iter->m_Ptr >= cc.m_Ptr && - iface_iter->m_Ptr < (reinterpret_cast(cc.m_Ptr) + cc.m_ObjSize)) - { - cc.ApplyCallClassPatch(static_cast(reinterpret_cast(iface_iter->m_Ptr) - - reinterpret_cast(cc.m_Ptr)) + hookman->m_VtblOffs, - hookman->m_VtblIdx, vfnptr_iter->m_OrigEntry); - } - } - } - } - } - } - - void CSourceHookImpl::ApplyCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx, void *orig_entry) - { - for (Impl_CallClassList::iterator cc_iter = m_CallClasses.begin(); cc_iter != m_CallClasses.end(); - ++cc_iter) - { - if (ifaceptr >= cc_iter->m_Ptr && - ifaceptr < (reinterpret_cast(cc_iter->m_Ptr) + cc_iter->m_ObjSize)) - { - cc_iter->ApplyCallClassPatch(static_cast(reinterpret_cast(ifaceptr) - - reinterpret_cast(cc_iter->m_Ptr)) + vtbl_offs, vtbl_idx, orig_entry); - } - } - } - - void CSourceHookImpl::RemoveCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx) - { - for (Impl_CallClassList::iterator cc_iter = m_CallClasses.begin(); cc_iter != m_CallClasses.end(); - ++cc_iter) - { - if (ifaceptr >= cc_iter->m_Ptr && - ifaceptr < (reinterpret_cast(cc_iter->m_Ptr) + cc_iter->m_ObjSize)) - { - cc_iter->RemoveCallClassPatch(vtbl_offs, vtbl_idx); - } - } - } - - void CSourceHookImpl::SetPluginPaused(Plugin plug, bool paused) - { - // Go through all hook managers, all interfaces, and set the status of all hooks of this plugin to paused - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hookmaniter = hmcl_iter->begin(); - hookmaniter != hmcl_iter->end(); ++hookmaniter) - { - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookmaniter->m_VfnPtrs.begin(); - vfnptr_iter != hookmaniter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter ifaceiter = vfnptr_iter->m_Ifaces.begin(); - ifaceiter != vfnptr_iter->m_Ifaces.end(); ++ifaceiter) - { - for (List::iterator hookiter = ifaceiter->m_PreHooks.m_List.begin(); - hookiter != ifaceiter->m_PreHooks.m_List.end(); ++hookiter) - if (plug == hookiter->plug) - hookiter->paused = paused; - - for (List::iterator hookiter = ifaceiter->m_PostHooks.m_List.begin(); - hookiter != ifaceiter->m_PostHooks.m_List.end(); ++hookiter) - if (plug == hookiter->plug) - hookiter->paused = paused; - } - } - } - } - } - void CSourceHookImpl::PausePlugin(Plugin plug) - { - SetPluginPaused(plug, true); - } - - void CSourceHookImpl::UnpausePlugin(Plugin plug) - { - SetPluginPaused(plug, false); - } - - void CSourceHookImpl::HookLoopBegin(IIface *pIface) - { - HookLoopInfo hli = {0}; - hli.pCurIface = pIface; - hli.shouldContinue = true; - hli.recall = HookLoopInfo::Recall_No; - - static_cast(pIface)->m_PreHooks.RQFlagReset(); - static_cast(pIface)->m_PostHooks.RQFlagReset(); - - m_HLIStack.push(hli); - } - - void CSourceHookImpl::HookLoopEnd() - { - // When in a post recall... make sure status is high enough so that it returns the orig ret. - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall == HookLoopInfo::Recall_Post2) - *m_HLIStack.front().pStatus = MRES_SUPERCEDE; // THAT'LL TEACH THEM! - m_HLIStack.pop(); - } - - void CSourceHookImpl::SetRes(META_RES res) - { - *m_HLIStack.front().pCurRes = res; - } - - META_RES CSourceHookImpl::GetPrevRes() - { - return *m_HLIStack.front().pPrevRes; - } - - META_RES CSourceHookImpl::GetStatus() - { - return *m_HLIStack.front().pStatus; - } - - const void *CSourceHookImpl::GetOrigRet() - { - // When in a post recall... return the orig ret of the previous hookloop. - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall == HookLoopInfo::Recall_Post2) - return m_HLIStack.second().pOrigRet; - - return m_HLIStack.front().pOrigRet; - } - - const void *CSourceHookImpl::GetOverrideRet() - { - // pOverrideRet is always set since recalls were introduced - // GetOverrideRetPtr was added; a function which always returns pOverrideRet - // so that RETURN_META_VALUE_NEWPARAMS can provide an override result - - // This means that we have to filter GetOverrideRet: - // If the status variable is < MRES_OVERRIDE, return NULL. - - return (*m_HLIStack.front().pStatus < MRES_OVERRIDE) ? - NULL : m_HLIStack.front().pOverrideRet; - } - - void *CSourceHookImpl::GetOverrideRetPtr() - { - // As described in the comment above: always return pOverrideRet - return m_HLIStack.front().pOverrideRet; - } - - void *CSourceHookImpl::GetIfacePtr() - { - return *m_HLIStack.front().pIfacePtrPtr; - } - - void CSourceHookImpl::SetCurResPtr(META_RES *mres) - { - m_HLIStack.front().pCurRes = mres; - } - - void CSourceHookImpl::SetPrevResPtr(META_RES *mres) - { - m_HLIStack.front().pPrevRes = mres; - - // If we're recalling, drag the previous mres value to the new hookfunc - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall) - *mres = *m_HLIStack.second().pPrevRes; - } - - void CSourceHookImpl::SetStatusPtr(META_RES *mres) - { - m_HLIStack.front().pStatus = mres; - - // If we're recalling, drag the previous mres value to the new hookfunc - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall) - *mres = *m_HLIStack.second().pStatus; - } - - void CSourceHookImpl::SetIfacePtrPtr(void **pp) - { - m_HLIStack.front().pIfacePtrPtr = pp; - } - - void CSourceHookImpl::SetOrigRetPtr(const void *ptr) - { - m_HLIStack.front().pOrigRet = ptr; - } - void CSourceHookImpl::SetOverrideRetPtr(void *ptr) - { - m_HLIStack.front().pOverrideRet = ptr; - } - - // New function which does all of the above + more :) - void *CSourceHookImpl::SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) - { - HookLoopInfo &hli = m_HLIStack.front(); - hli.pStatus = statusPtr; - hli.pPrevRes = prevResPtr; - hli.pCurRes = curResPtr; - hli.pIfacePtrPtr = ifacePtrPtr; - hli.pOrigRet = origRetPtr; - - // Handle some recall stuff - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall) - { - HookLoopInfo &other = m_HLIStack.second(); - *statusPtr = *other.pStatus; - *prevResPtr = *other.pStatus; - - // When the status is low so there's no override return value and we're in a post recall, - // give it the orig return value as override return value. - if (*statusPtr < MRES_OVERRIDE && other.recall == HookLoopInfo::Recall_Post1) - hli.pOverrideRet = const_cast(other.pOrigRet); - else // Otherwise, transfer override ret normally - hli.pOverrideRet = other.pOverrideRet; - } - else - hli.pOverrideRet = overrideRetPtr; - - // Tell the hook func which override ret ptr to use - return hli.pOverrideRet; - } - - bool CSourceHookImpl::ShouldContinue() - { - // If recall is true, we shall not continue either. - // This is because, if it's true and ShouldContinue is called, it suggests that the - // actual recall is done and that we are back in the original handler which shall return - // immediately. - - // Post-recalls: - // The second element on the stack has recall set to Recall_Post1. - // This means that we want to skip this part and the original function calling thing, so - // we store the status mres value, set status to MRES_SUPERCEDE, and return false. - // We also set the recall flag to Recall_Post2, so the next time the thing calls us, we - // can return true (so that the thing goes into post hooks). - if (m_HLIStack.size() > 1) - { - if (m_HLIStack.second().recall == HookLoopInfo::Recall_Post1) - { - m_HLIStack.front().temporaryStatus = *m_HLIStack.front().pStatus; - *m_HLIStack.front().pStatus = MRES_SUPERCEDE; - m_HLIStack.second().recall = HookLoopInfo::Recall_Post2; - return false; - } - else if (m_HLIStack.second().recall == HookLoopInfo::Recall_Post2) - { - *m_HLIStack.front().pStatus = m_HLIStack.front().temporaryStatus; - return m_HLIStack.front().shouldContinue; - } - } - return m_HLIStack.front().shouldContinue && !m_HLIStack.front().recall; - } - - void CSourceHookImpl::DoRecall() - { - if (!m_HLIStack.empty()) - { - // Also watch out for post recalls! Described at the beginning of sourcehook_impl.h - m_HLIStack.front().recall = - static_cast(m_HLIStack.front().pCurIface)->m_PostHooks.RQFlagGet() ? - HookLoopInfo::Recall_Post1 : HookLoopInfo::Recall_Pre; - - CHookList *mlist = static_cast(m_HLIStack.front().recall == HookLoopInfo::Recall_Pre ? - m_HLIStack.front().pCurIface->GetPreHooks() : m_HLIStack.front().pCurIface->GetPostHooks()); - mlist->m_Recall = true; - - // The hookfunc usually does this, but it won't have a chance to see it, - // so for recalls, we update status here if it's required - if (*m_HLIStack.front().pCurRes > *m_HLIStack.front().pStatus) - *m_HLIStack.front().pStatus = *m_HLIStack.front().pCurRes; - - } - } - - void CSourceHookImpl::SetIgnoreHooks(Plugin plug, void *vfnptr) - { - m_OneIgnore = vfnptr; - } - - void CSourceHookImpl::ResetIgnoreHooks(Plugin plug, void *vfnptr) - { - m_OneIgnore = NULL; - } - - void *CSourceHookImpl::GetOrigVfnPtrEntry(void *vfnptr) - { - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hookmaniter = hmcl_iter->begin(); - hookmaniter != hmcl_iter->end(); ++hookmaniter) - { - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookmaniter->m_VfnPtrs.begin(); - vfnptr_iter != hookmaniter->m_VfnPtrs.end(); ++vfnptr_iter) - { - if (vfnptr_iter->m_Ptr == vfnptr) - return vfnptr_iter->m_OrigEntry; - } - } - } - return NULL; - } - - //////////////////////////// - // CCallClassImpl - //////////////////////////// - CSourceHookImpl::CCallClassImpl::CCallClassImpl(void *ptr, size_t size) - : m_Ptr(ptr), m_ObjSize(size), m_RefCounter(1) - { - } - CSourceHookImpl::CCallClassImpl::~CCallClassImpl() - { - } - - void *CSourceHookImpl::CCallClassImpl::GetThisPtr() - { - return m_Ptr; - } - void *CSourceHookImpl::CCallClassImpl::GetOrigFunc(int vtbloffs, int vtblidx) - { - OrigVTables::iterator iter = m_VT.find(vtbloffs); - if (iter != m_VT.end() && iter->val.size() > (size_t)vtblidx) - { - return iter->val[vtblidx]; - } - return NULL; - } - - void CSourceHookImpl::CCallClassImpl::ApplyCallClassPatch(int vtbl_offs, int vtbl_idx, void *orig_entry) - { - OrigFuncs &tmpvec = m_VT[vtbl_offs]; - if (tmpvec.size() <= (size_t)vtbl_idx) - tmpvec.resize(vtbl_idx+1, NULL); - tmpvec[vtbl_idx] = orig_entry; - } - void CSourceHookImpl::CCallClassImpl::RemoveCallClassPatch(int vtbl_offs, int vtbl_idx) - { - OrigVTables::iterator iter = m_VT.find(vtbl_offs); - if (iter != m_VT.end()) - { - if (iter->val.size() > (size_t)vtbl_idx) - { - iter->val[vtbl_idx] = 0; - - OrigFuncs &of = iter->val; - OrigFuncs::iterator lastused = of.end(); - for (OrigFuncs::iterator viter = of.begin(); viter != of.end(); ++viter) - { - if (*viter) - lastused = viter; - } - if (lastused == of.end()) - { - // No used element => Remove the whole vector - m_VT.erase(iter); - return; - } - of.resize(lastused - of.begin() + 1); - } - } - } - - //////////////////////////// - // CHookManagerInfo - //////////////////////////// - CSourceHookImpl::CHookManagerInfo::CHookManagerInfo() : m_HookManVersion(0) - { - } - CSourceHookImpl::CHookManagerInfo::~CHookManagerInfo() - { - } - - IVfnPtr *CSourceHookImpl::CHookManagerInfo::FindVfnPtr(void *vfnptr) - { - VfnPtrListIter iter = m_VfnPtrs.find(vfnptr); - return iter == m_VfnPtrs.end() ? NULL : &(*iter); - } - void CSourceHookImpl::CHookManagerInfo::SetInfo(int vtbl_offs, int vtbl_idx, const char *proto) - { - m_VtblOffs = vtbl_offs; - m_VtblIdx = vtbl_idx; - m_Proto = proto; - } - void CSourceHookImpl::CHookManagerInfo::SetHookfuncVfnptr(void *hookfunc_vfnptr) - { - m_HookfuncVfnptr = hookfunc_vfnptr; - } - void CSourceHookImpl::CHookManagerInfo::SetVersion(int version) - { - m_HookManVersion = version; - } - //////////////////////////// - // CVfnPtr - //////////////////////////// - - - // If you get a crash here, the ptr passed is invalid - // This usually means a SH_DECL_MANUALHOOK* with wrong thisptroffs/vtbloffs/vtblidx - CSourceHookImpl::CVfnPtr::CVfnPtr(void *ptr, void **pOneIgnore) : m_Ptr(ptr), - m_OrigEntry(*reinterpret_cast(ptr)), m_pOneIgnore(pOneIgnore) - { - } - CSourceHookImpl::CVfnPtr::~CVfnPtr() - { - } - - void *CSourceHookImpl::CVfnPtr::GetVfnPtr() - { - return m_Ptr; - } - - void *CSourceHookImpl::CVfnPtr::GetOrigEntry() - { - return m_OrigEntry; - } - - IIface *CSourceHookImpl::CVfnPtr::FindIface(void *ptr) - { - if (m_Ptr == *m_pOneIgnore) - { - *m_pOneIgnore = NULL; // Only once! - return NULL; - } - - IfaceListIter iter = m_Ifaces.find(ptr); - - // If nothing is found, check for a NULL-interface (VP hooks only) - if (iter == m_Ifaces.end()) - { - iter = m_Ifaces.find((void*)0); - return iter == m_Ifaces.end() ? NULL : &(*iter); - } - else - { - return &(*iter); - } - } - - //////////////////////////// - // CIface - //////////////////////////// - CSourceHookImpl::CIface::CIface(void *ptr) : m_Ptr(ptr) - { - } - CSourceHookImpl::CIface::~CIface() - { - } - - void *CSourceHookImpl::CIface::GetPtr() - { - return m_Ptr; - } - - IHookList *CSourceHookImpl::CIface::GetPreHooks() - { - return &m_PreHooks; - } - IHookList *CSourceHookImpl::CIface::GetPostHooks() - { - return &m_PostHooks; - } - - //////////////////////////// - // CHookList - //////////////////////////// - - CSourceHookImpl::CHookList::CHookList() : m_VPList(NULL), m_FreeIters(NULL), m_UsedIters(NULL), - m_Recall(false) - { - } - CSourceHookImpl::CHookList::CHookList(const CHookList &other) : m_VPList(other.m_VPList), m_List(other.m_List), - m_FreeIters(NULL), m_UsedIters(NULL), m_Recall(false) - { - } - - CSourceHookImpl::CHookList::~CHookList() - { - while (m_FreeIters) - { - CIter *iter = m_FreeIters->m_pNext; - delete m_FreeIters; - m_FreeIters = iter; - } - while (m_UsedIters) - { - CIter *iter = m_UsedIters->m_pNext; - delete m_UsedIters; - m_UsedIters = iter; - } - } - IHookList::IIter *CSourceHookImpl::CHookList::GetIter() - { - m_RQFlag = true; - - CIter *ret; - if (m_FreeIters) - { - ret = m_FreeIters; - m_FreeIters = ret->m_pNext; - ret->GoToBegin(); - } - else - { - ret = new CIter(this); - } - - // Muuuh, if we're recalling, it shall be a copy of the last iterator, incremented by one - if (m_Recall && m_UsedIters) - { - ret->Set(m_UsedIters); // m_UsedIters is the last returned and not released iterator - ret->Next(); // Use next instead of directly incrementing its m_Iter: - // skips paused plugins - } - - ret->m_pNext = m_UsedIters; - ret->m_pPrev = NULL; - if (m_UsedIters) - m_UsedIters->m_pPrev = ret; - m_UsedIters = ret; - - m_Recall = false; - - return ret; - } - void CSourceHookImpl::CHookList::ReleaseIter(IIter *pIter) - { - CIter *pIter2 = static_cast(pIter); - - // Unlink from m_UsedIters - - if (pIter2->m_pNext) - pIter2->m_pNext->m_pPrev = pIter2->m_pPrev; - if (pIter2->m_pPrev) - pIter2->m_pPrev->m_pNext = pIter2->m_pNext; - if (pIter2 == m_UsedIters) - m_UsedIters = NULL; - - // Link to m_FreeIters - - pIter2->m_pNext = m_FreeIters; - - m_FreeIters = pIter2; - - // Reset recall state. - m_Recall = false; - } - - void CSourceHookImpl::CHookList::SetVPList(List *newList) - { - m_VPList = newList; - - // Update cached CIter objects - - CIter *pTmp; - pTmp = m_FreeIters; - while (pTmp) - { - pTmp->m_Iter.SetListLeft(m_VPList); - pTmp = pTmp->m_pNext; - } - - pTmp = m_UsedIters; - while (pTmp) - { - pTmp->m_Iter.SetListLeft(m_VPList); - pTmp = pTmp->m_pNext; - } - } - - void CSourceHookImpl::CHookList::ClearVPList() - { - SetVPList(NULL); - } - - CSourceHookImpl::CHookList::CIter::CIter(CHookList *pList) : m_pList(pList), - m_Iter(pList->m_VPList, &m_pList->m_List), m_pNext(NULL) - { - } - CSourceHookImpl::CHookList::CIter::~CIter() - { - } - - void CSourceHookImpl::CHookList::CIter::Set(CIter *pOther) - { - m_Iter = pOther->m_Iter; - } - - void CSourceHookImpl::CHookList::CIter::GoToBegin() - { - m_Iter.GoToBegin(); - SkipPaused(); - } - - bool CSourceHookImpl::CHookList::CIter::End() - { - if (!m_pList) - return false; - return m_Iter.End();; - } - void CSourceHookImpl::CHookList::CIter::Next() - { - if (!m_pList) - return; - ++m_Iter; - SkipPaused(); - } - void CSourceHookImpl::CHookList::CIter::Clear() - { - m_pList = NULL; - } - void CSourceHookImpl::CHookList::CIter::SkipPaused() - { - while (!m_Iter.End() && m_Iter->paused) - ++m_Iter; - } - - ISHDelegate *CSourceHookImpl::CHookList::CIter::Handler() - { - return m_Iter->handler; - } - int CSourceHookImpl::CHookList::CIter::ThisPtrOffs() - { - return m_Iter->thisptr_offs; - } - - ////////////////////////////////////////////////////////////////////////// - // CProto - ////////////////////////////////////////////////////////////////////////// - char *CSourceHookImpl::CProto::DupProto(const char *p) - { - if (!p) - return NULL; - - char *newproto; - if (*p) - { - size_t len = strlen(p); - newproto = new char[len+1]; - memcpy(newproto, p, len+1); - } else { - const ProtoInfo *pi1 = reinterpret_cast(p); - int *ar_copy = new int[pi1->numOfParams + 1]; - for (int i = 0; i <= pi1->numOfParams; i++) - ar_copy[i] = pi1->params[i]; - ProtoInfo *copy = new ProtoInfo(pi1->retTypeSize, pi1->numOfParams, ar_copy); - newproto = reinterpret_cast(copy); - } - - return newproto; - } - - void CSourceHookImpl::CProto::FreeProto(char *prot) - { - if (!prot) - return; - - if (*prot) - { - delete [] prot; - } else { - ProtoInfo *pi = reinterpret_cast(prot); - delete [] pi->params; - delete pi; - } - } - - bool CSourceHookImpl::CProto::Equal(const char *p1, const char *p2) - { - if (!p1 || !p2) - return false; - - if (*p1 && *p2) // Case1: Both old - { - // As in old versions - return strcmp(p1, p2) == 0; - } - else if (!*p1 && !*p2) // Case2: Both new - { - const ProtoInfo *pi1 = reinterpret_cast(p1); - const ProtoInfo *pi2 = reinterpret_cast(p2); - - if (pi1->retTypeSize == pi2->retTypeSize && - pi1->numOfParams == pi2->numOfParams) - { - // params[0] is 0 for "normal" functions and -1 for vararg functions - // params[1] is size of first parameter - // params[2] is size of second parameter ... - for (int i = 0; i <= pi1->numOfParams; ++i) - { - if (pi1->params[i] != pi2->params[i]) - return false; - } - return true; - } - else - { - return false; - } - } - else // Case3: Mixed old/new - { - // Trust the user - return true; - } - } - - - ////////////////////////////////////////////////////////////////////////// - // CHookManagerContainer - ////////////////////////////////////////////////////////////////////////// - void CSourceHookImpl::CHookManagerContainer::AddHookManager(Plugin plug, const CHookManagerInfo &hookman) - { - iterator iter; - // Check whether such a hook manager already exists; if yes, ignore. - for (iter = begin(); iter != end(); ++iter) - { - if (iter->m_Plug == plug && iter->m_Func == hookman.m_Func) - return; - } - - // It doesn't -> add it. Add it to the end of its version group. - for (iter = begin(); iter != end(); ++iter) - { - if (iter->m_HookManVersion < hookman.m_HookManVersion) - break; - } - - bool isBeginning = iter == begin(); - - insert(iter, hookman); - - // If we inserted it at the beginning and if the dam breaks open many years too soon - // and if there is more than one hookman and if the second one isn't empty, transfer - // hooks from second to first - - if (isBeginning && size() > 1) - { - iter = begin(); - iterator second = iter; - ++second; - - if (!second->m_VfnPtrs.empty()) - { - // Move the vfnptrs from the old hook manager to the new one - iter->m_VfnPtrs = second->m_VfnPtrs; - second->m_VfnPtrs.clear(); - - // Unregister the old one, register the new one - second->m_Func(HA_Unregister, NULL); - iter->m_Func(HA_Register, &(*iter)); - - // Go through all vfnptrs in this hookman and patch them to point to the new manager's handler! - // or whatever - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = iter->m_VfnPtrs.begin(); - vfnptr_iter != iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - // And DEREFERENCE newHookMan->m_HookfuncVfnptr! - // otherwise it will be executing the vtable... had to find out the hard way - *reinterpret_cast(vfnptr_iter->m_Ptr) = *reinterpret_cast(iter->m_HookfuncVfnptr); - } - } - } - } - - ////////////////////////////////////////////////////////////////////////// - // CHookIDManager - ////////////////////////////////////////////////////////////////////////// - CSourceHookImpl::CHookIDManager::CHookIDManager() - { - } - - int CSourceHookImpl::CHookIDManager::New(const CProto &proto, int vtbl_offs, int vtbl_idx, void *vfnptr, - void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post) - { - Entry tmp(proto, vtbl_offs, vtbl_idx, vfnptr, adjustediface, plug, thisptr_offs, handler, post); - - size_t cursize = m_Entries.size(); - for (size_t i = 0; i < cursize; ++i) - { - if (m_Entries[i].isfree) - { - m_Entries[i] = tmp; - return static_cast(i) + 1; - } - } - - m_Entries.push_back(tmp); - return static_cast(m_Entries.size()); // return size() because hookid = id+1 anyway - } - - bool CSourceHookImpl::CHookIDManager::Remove(int hookid) - { - int realid = hookid - 1; - if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree) - return false; - - m_Entries[realid].isfree = true; - - // :TODO: remove free ids from back sometimes ?? - - return true; - } - - const CSourceHookImpl::CHookIDManager::Entry * CSourceHookImpl::CHookIDManager::QueryHook(int hookid) - { - int realid = hookid - 1; - if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree) - return NULL; - - return &m_Entries[realid]; - } - - void CSourceHookImpl::CHookIDManager::FindAllHooks(CVector &output, const CProto &proto, int vtbl_offs, - int vtbl_idx, void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post) - { - // oh my god, a lot of parameters... - size_t cursize = m_Entries.size(); - for (size_t i = 0; i < cursize; ++i) - { - if (!m_Entries[i].isfree && m_Entries[i].proto == proto && m_Entries[i].vtbl_offs == vtbl_offs && - m_Entries[i].vtbl_idx == vtbl_idx && m_Entries[i].adjustediface == adjustediface && m_Entries[i].plug == plug && - m_Entries[i].thisptr_offs == thisptr_offs && m_Entries[i].handler->IsEqual(handler) && m_Entries[i].post == post) - { - output.push_back(static_cast(i) + 1); - } - } - } -} diff --git a/sourcehook/sourcehook.h b/sourcehook/sourcehook.h deleted file mode 100644 index a75e271..0000000 --- a/sourcehook/sourcehook.h +++ /dev/null @@ -1,6537 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** -* @file sourcehook.h -* @brief Contains the public SourceHook API -*/ - -#ifndef __SOURCEHOOK_H__ -#define __SOURCEHOOK_H__ - -// Interface revisions: -// 1 - Initial revision -// 2 - Changed to virtual functions for iterators and all queries -// 3 - Added "hook loop status variable" -// 4 - Reentrant -#define SH_IFACE_VERSION 4 - -// Impl versions: -// ??? -// 4 - addition of hook ids and vp hooks (with them, AddHookNew and RemoveHookNew) -// This is not a SH_IFACE_VERSION change so that old plugins continue working! -// 5 - addition of direct vp hooks (new hook mode; from now on AddHookNew checks for -// invalid hookmode -> impl version won't have to change because of things like this) -#define SH_IMPL_VERSION 5 - -// Hookman version: -// 1 - Support for recalls, performance optimisations -#define SH_HOOKMAN_VERSION 1 - -// The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook -// It's used in various macros -#ifndef SH_GLOB_SHPTR -#define SH_GLOB_SHPTR g_SHPtr -#endif - -// Used to identify the current plugin -#ifndef SH_GLOB_PLUGPTR -#define SH_GLOB_PLUGPTR g_PLID -#endif - -#ifdef SH_DEBUG -# include -# include - -# define SH_ASSERT(x, info) \ - do { \ - if (!(x)) \ - { \ - printf("SOURCEHOOK DEBUG ASSERTION FAILED: %s:%u(%s): %s: ", __FILE__, __LINE__, __FUNCTION__, #x); \ - printf info; \ - putchar('\n'); \ - abort(); \ - } \ - } while(0) - -#else -# define SH_ASSERT(x, info) -#endif - -// System -#define SH_SYS_WIN32 1 -#define SH_SYS_LINUX 2 - -#ifdef _WIN32 -# define SH_SYS SH_SYS_WIN32 -#elif defined __linux__ -# define SH_SYS SH_SYS_LINUX -#else -# error Unsupported system -#endif - -// Compiler -#define SH_COMP_GCC 1 -#define SH_COMP_MSVC 2 - -#ifdef _MSC_VER -# define SH_COMP SH_COMP_MSVC -#elif defined __GNUC__ -# define SH_COMP SH_COMP_GCC -#else -# error Unsupported compiler -#endif - -#if SH_COMP==SH_COMP_MSVC -# define vsnprintf _vsnprintf -#endif - -#if SH_SYS != SH_SYS_WIN32 -# include -#endif - -#define SH_PTRSIZE sizeof(void*) - -#include "FastDelegate.h" -#include "sh_memfuncinfo.h" - -// Good old metamod! - -// Flags returned by a plugin's api function. -// NOTE: order is crucial, as greater/less comparisons are made. -enum META_RES -{ - MRES_IGNORED=0, // plugin didn't take any action - MRES_HANDLED, // plugin did something, but real function should still be called - MRES_OVERRIDE, // call real function, but use my return value - MRES_SUPERCEDE // skip real function; use my return value -}; - - -namespace SourceHook -{ - /** - * @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers - */ - const int STRBUF_LEN=4096; - - /** - * @brief An empty class. No inheritance used. Used for original-function-call hacks - */ - class EmptyClass - { - }; - - /** - * @brief Implicit cast. - */ - template - inline Out implicit_cast(In input) - { - return input; - } - - /** - * @brief A plugin typedef - * - * SourceHook doesn't really care what this is. As long as the ==, != and = operators work on it and every - * plugin has a unique identifier, everything is ok. - * It should also be possible to set it to 0. - */ - typedef int Plugin; - - struct ProtoInfo - { - ProtoInfo(int rtsz, int nop, const int *p) : beginningNull(0), retTypeSize(rtsz), numOfParams(nop), params(p) - { - } - int beginningNull; //!< To distinguish from old protos (which never begin with 0) - int retTypeSize; //!< 0 if void - int numOfParams; //!< number of parameters - const int *params; //!< params[0]=0 (or -1 for vararg), params[1]=size of first param, ... - }; - - /** - * @brief Specifies the actions for hook managers - */ - enum HookManagerAction - { - HA_GetInfo = 0, //!< Store info about the hook manager - HA_Register, //!< Save the IHookManagerInfo pointer for future reference - HA_Unregister //!< Clear the saved pointer - }; - - struct IHookManagerInfo; - - /** - * @brief Pointer to hook manager interface function - * - * A "hook manager" is a the only thing that knows the actual protoype of the function at compile time. - * - * @param ha What the hook manager should do - * @param hi A pointer to IHookManagerInfo - */ - typedef int (*HookManagerPubFunc)(HookManagerAction ha, IHookManagerInfo *hi); - - class ISHDelegate - { - public: - virtual void DeleteThis() = 0; // Ugly, I know - virtual bool IsEqual(ISHDelegate *other) = 0; - }; - - template class CSHDelegate : public ISHDelegate - { - T m_Deleg; - public: - CSHDelegate(T deleg) : m_Deleg(deleg) - { - } - - CSHDelegate(const CSHDelegate &other) : m_Deleg(other.m_Deleg) - { - } - - void DeleteThis() - { - delete this; - } - - bool IsEqual(ISHDelegate *other) - { - return static_cast* >(other)->GetDeleg() == GetDeleg(); - } - - T &GetDeleg() - { - return m_Deleg; - } - }; - - struct IHookList - { - struct IIter - { - virtual bool End() = 0; - virtual void Next() = 0; - virtual ISHDelegate *Handler() = 0; - virtual int ThisPtrOffs() = 0; - }; - virtual IIter *GetIter() = 0; - virtual void ReleaseIter(IIter *pIter) = 0; - }; - - struct IIface - { - virtual void *GetPtr() = 0; - virtual IHookList *GetPreHooks() = 0; - virtual IHookList *GetPostHooks() = 0; - }; - - struct IVfnPtr - { - virtual void *GetVfnPtr() = 0; - virtual void *GetOrigEntry() = 0; - - virtual IIface *FindIface(void *ptr) = 0; - }; - - struct IHookManagerInfo - { - virtual IVfnPtr *FindVfnPtr(void *vfnptr) = 0; - - virtual void SetInfo(int vtbloffs, int vtblidx, const char *proto) = 0; - virtual void SetHookfuncVfnptr(void *hookfunc_vfnptr) = 0; - - // Added 23.12.2005 (yup! I'm coding RIGHT BEFORE CHRISTMAS!) - // If the hookman doesn't set this, it defaults 0 - // SourceHook prefers hookmans with higher version numbers - virtual void SetVersion(int version) = 0; - }; - - class AutoHookIter - { - IHookList *m_pList; - IHookList::IIter *m_pIter; - public: - AutoHookIter(IHookList *pList) - : m_pList(pList), m_pIter(pList->GetIter()) - { - } - - ~AutoHookIter() - { - if (m_pList) - m_pList->ReleaseIter(m_pIter); - } - - bool End() - { - return m_pIter->End(); - } - - void Next() - { - m_pIter->Next(); - } - - ISHDelegate *Handler() - { - return m_pIter->Handler(); - } - - int ThisPtrOffs() - { - return m_pIter->ThisPtrOffs(); - } - - void SetToZero() - { - m_pList = 0; - } - }; - - template struct DeprecatedCallClass - { - virtual B *GetThisPtr() = 0; - virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; - }; - - // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) - // - Today is an important day. - // I'm adding support for functions which return references. - - // How it works: - // SH_SETUPCALLS doesn't use plain rettype to store the temporary return values (plugin ret, orig ret, - // override ret) anymore; instead, it uses SourceHook::ReferenceCarrier::type - // this is typedefed to the original rettype normally, but if the rettype is a reference, it's a special class - // which stores the reference as a pointer, and implements constructors, operator= and a conversion operator. - // special cases were needed for getoverrideret / getorigret; these are implemented through the - // SourceHook::MacroRefHelpers structs. - // Furthermore, SetOverrideRet had to be changed a bit; see SourceHook::OverrideFunctor somewhere down in this file. - template struct ReferenceCarrier - { - typedef T type; - }; - - template struct ReferenceCarrier - { - class type - { - T *m_StoredRef; - public: - type() : m_StoredRef(NULL) - { - } - type(T& ref) : m_StoredRef(&ref) - { - } - - T& operator= (T& ref) - { - m_StoredRef = &ref; - return ref; - } - - operator T& () const - { - return *m_StoredRef; - } - }; - }; - - /** - * @brief The main SourceHook interface - */ - class ISourceHook - { - public: - /** - * @brief Return interface version - */ - virtual int GetIfaceVersion() = 0; - - /** - * @brief Return implementation version - */ - virtual int GetImplVersion() = 0; - - /** - * @brief Add a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Removes a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins - * - * @param plug The unique identifier of the plugin in question - */ - virtual bool IsPluginInUse(Plugin plug) = 0; - - /** - * @brief Return a pointer to a callclass. Generate a new one if required. - * - * @param iface The interface pointer - * @param size Size of the class instance - */ - virtual DeprecatedCallClass *GetCallClass(void *iface, size_t size) = 0; - - /** - * @brief Release a callclass - * - * @param ptr Pointer to the callclass - */ - virtual void ReleaseCallClass(DeprecatedCallClass *ptr) = 0; - - virtual void SetRes(META_RES res) = 0; //!< Sets the meta result - virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the - //!< previously calledhandler - virtual META_RES GetStatus() = 0; //!< Gets the highest meta result - virtual const void *GetOrigRet() = 0; //!< Gets the original result. - //!< If not in post function, undefined - virtual const void *GetOverrideRet() = 0; //!< Gets the override result. - //!< If none is specified, NULL - virtual void *GetIfacePtr() = 0; //!< Gets the interface pointer - ////////////////////////////////////////////////////////////////////////// - // For hook managers - virtual void HookLoopBegin(IIface *pIface) = 0; //!< Should be called when a hook loop begins - virtual void HookLoopEnd() = 0; //!< Should be called when a hook loop exits - virtual void SetCurResPtr(META_RES *mres) = 0; //!< Sets pointer to the current meta result - virtual void SetPrevResPtr(META_RES *mres) = 0; //!< Sets pointer to previous meta result - virtual void SetStatusPtr(META_RES *mres) = 0; //!< Sets pointer to the status variable - virtual void SetIfacePtrPtr(void **pp) = 0; //!< Sets pointer to the interface this pointer - virtual void SetOrigRetPtr(const void *ptr) = 0; //!< Sets the original return pointer - virtual void SetOverrideRetPtr(void *ptr) = 0; //!< Sets the override result pointer - virtual bool ShouldContinue() = 0; //!< Returns false if the hook loop should exit - - /** - * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. - * - * @param plug The owner of the hook manager - * @param pubFunc The hook manager's info function - */ - virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) = 0; - - virtual void DoRecall() = 0; //!< Initiates a recall sequence - /* - HOW RECALLS WORK: - - The problem: - Users want the ability to change parameters of the called function - from inside their handler. - The solution: - 1) Mark as "recall" - 2) Recall the function - 3) => SH's hook func gets called: - 4) The first iterator points at the first hook the last hookfunc didn't execute yet - 5) does all iteration and returns normally - 6) The user's handler returns immediately - 7) The hook func returns immediately as well - - Also note that the recalled hookfunc starts with the status the recalling hookfunc - ended with. The last handler (doing the recall) is also able to specify its own - META_RES. - */ - - virtual void *GetOverrideRetPtr() = 0; //!< Returns the pointer set by SetOverrideRetPtr - - /** - * @brief Set up the hook loop. Equivalent to calling: - * SetStatusPtr, SetPrevResPtr, SetCurResPtr, SetIfacePtrPtr, SetOrigRetPtr, Get/SetOverrideRetPtr - * - * @param statusPtr pointer to status variable - * @param prevResPtr pointer to previous result variable - * @param curResPtr pointer to current result variable - * @param ifacePtrPtr pointer to interface this pointer variable - * @param origRetPr pointer to original return value variable. NULL for void funcs - * @param overrideRetPtr pointer to override return value variable. NULL for void funcs - * - * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr - * when the hook func is being called as part of a recall - */ - virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; - - /** - * @brief Modes for the new AddHook - */ - enum AddHookMode - { - Hook_Normal, - Hook_VP, - Hook_DVP - }; - - /** - * @brief Add a (VP) hook. - * - * @return non-zero hook id on success, 0 otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param mode Can be either Hook_Normal or Hook_VP (vtable-wide hook) - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual int AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Remove a VP hook by ID. - * - * @return true on success, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param hookid The hook id (returned by AddHookNew) - */ - virtual bool RemoveHookByID(Plugin plug, int hookid) = 0; - - /** - * @brief Makes sure that hooks are going to be ignored on the next call of vfnptr - * - * @param plug The unique identifier of the plugin that calls this function - * @param vfnptr The virtual function pointer of the function in question - */ - virtual void SetIgnoreHooks(Plugin plug, void *vfnptr) = 0; - - /** - * @brief Reverses SetIgnoreHooks' effect - * - * @param plug The unique identifier of the plugin that calls this function - * @param vfnptr The virtual function pointer of the function in question - */ - virtual void ResetIgnoreHooks(Plugin plug, void *vfnptr) = 0; - - /** - * @brief Finds the original entry of a virtual function pointer - * - * @param vfnptr The virtual function pointer - * @return The original entry if the virtual function pointer has been patched; NULL otherwise. - */ - virtual void *GetOrigVfnPtrEntry(void *vfnptr) = 0; - }; - - // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: - // These have to be able to return references. If T is a reference, the pointers returned - // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. - template struct MacroRefHelpers - { - inline static const T* GetOrigRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOrigRet()); - } - inline static const T* GetOverrideRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOverrideRet()); - } - }; - - template struct MacroRefHelpers - { - inline static T* GetOrigRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOrigRet()); - return &ref; - } - inline static T* GetOverrideRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOverrideRet()); - return &ref; - } - }; - - // For source-level compatibility - template struct CallClass - { - T *ptr; - - CallClass(T *p) : ptr(p) - { - } - - operator T*() - { - return ptr; - } - }; - - typedef CallClass GenericCallClass; - typedef CallClass ManualCallClass; - - template - CallClass *GetCallClass(T *p) - { - return new CallClass(p); - } - - template - void ReleaseCallClass(CallClass *p) - { - delete p; - } - - template - void *GetOrigVfnPtrEntry(X *pInstance, MFP mfp, ISourceHook *pSH) - { - SourceHook::MemFuncInfo info = {true, -1, 0, 0}; - SourceHook::GetFuncInfo(pInstance, mfp, info); - - void *vfnptr = reinterpret_cast( - *reinterpret_cast(reinterpret_cast(pInstance) + info.thisptroffs + info.vtbloffs) + info.vtblindex); - - void *origentry = pSH->GetOrigVfnPtrEntry(vfnptr); - - return origentry ? origentry : *reinterpret_cast(vfnptr); - } -} - -/************************************************************************/ -/* High level interface */ -/************************************************************************/ -#define META_RESULT_STATUS SH_GLOB_SHPTR->GetStatus() -#define META_RESULT_PREVIOUS SH_GLOB_SHPTR->GetPrevRes() -#define META_RESULT_ORIG_RET(type) *SourceHook::MacroRefHelpers::GetOrigRet(SH_GLOB_SHPTR) -#define META_RESULT_OVERRIDE_RET(type) *SourceHook::MacroRefHelpers::GetOverrideRet(SH_GLOB_SHPTR) -#define META_IFACEPTR(type) reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()) - -#define SET_META_RESULT(result) SH_GLOB_SHPTR->SetRes(result) -#define RETURN_META(result) do { SET_META_RESULT(result); return; } while(0) -#define RETURN_META_VALUE(result, value) do { SET_META_RESULT(result); return (value); } while(0) - -// If a hook on a function which returns a reference does not want to specify a return value, -// it can use this macro. -// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! -#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) - -// only call these from the hook handlers directly! -// :TODO: enforce it ? - -// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? -// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE - -// SourceHook::SetOverrideRet is defined later. -#define RETURN_META_NEWPARAMS(result, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_NEWPARAMS(result, value, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* meh, set the override result here because we don't get a chance to return */ \ - /* before continuing the hook loop through the recall */ \ - SourceHook::SetOverrideResult(memfuncptr)(SH_GLOB_SHPTR, value); \ - } \ - RETURN_META_VALUE(MRES_SUPERCEDE, \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams); \ - } while (0) - -// :TODO: thisptroffs in MNEWPARAMS ?? - -#if SH_COMP == SH_COMP_MSVC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - void *addr; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; - -#elif SH_COMP == SH_COMP_GCC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.s.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; \ - u.s.adjustor = 0; - -#endif - -#define RETURN_META_MNEWPARAMS(result, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - (thisptr->*(u.mfp)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_MNEWPARAMS(result, value, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* see RETURN_META_VALUE_NEWPARAMS */ \ - SourceHook::SetOverrideResult(SH_GLOB_SHPTR, value); \ - } \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ - } while (0) - -#define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ - do { \ - SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ - SH_MFHCls(hookname)::ms_MFI.thisptroffs = pthisptroffs; \ - SH_MFHCls(hookname)::ms_MFI.vtblindex = pvtblindex; \ - SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ - } while (0) - - -#define SH_GET_ORIG_VFNPTR_ENTRY(inst, mfp) (SourceHook::GetOrigVfnPtrEntry(inst, mfp, SH_GLOB_SHPTR)) - -// For source-level compatibility - -#define SH_GET_CALLCLASS(ptr) SourceHook::GetCallClass(ptr) -#define SH_GET_MCALLCLASS(ptr, size) SourceHook::GetCallClass(reinterpret_cast(ptr)) -#define SH_RELEASE_CALLCLASS(ptr) SourceHook::ReleaseCallClass(ptr) - -// New ADD / REMOVE macros. -#define SH_STATIC(func) fastdelegate::MakeDelegate(func) -#define SH_MEMBER(inst, func) fastdelegate::MakeDelegate(inst, func) - -#define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) - -#define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) - -#define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) - -#define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) - -#define SH_ADD_VPHOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHVPAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler, false) - -#define SH_ADD_DVPHOOK(ifacetype, ifacefunc, vtableptr, handler, post) \ - __SourceHook_FHVPAdd##ifacetype##ifacefunc(reinterpret_cast(vtableptr), \ - post, handler, true) - -#define SH_ADD_MANUALVPHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMVPAdd##hookname(reinterpret_cast(ifaceptr), post, handler, false) - -#define SH_ADD_MANUALDVPHOOK(hookname, vtableptr, handler, post) \ - __SourceHook_FHMVPAdd##hookname(reinterpret_cast(vtableptr), post, handler, true) - -#define SH_REMOVE_HOOK_ID(hookid) \ - (SH_GLOB_SHPTR->RemoveHookByID(SH_GLOB_PLUGPTR, hookid)) - -// Old macros -// !! These are now deprecated. Instead, use one of these: -// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -// SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -// SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_STATIC(handler), post) -#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -// SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -// SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(inst, func), post) - -#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_STATIC(handler), post) -#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, SH_MEMBER(handler_inst, handler_func), post) - -#define SH_NOATTRIB - - - - -#if SH_COMP == SH_COMP_MSVC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; -#elif SH_COMP == SH_COMP_GCC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; \ - reinterpret_cast(&mfp)[1] = 0; -#else -# error Not supported yet. -#endif - -////////////////////////////////////////////////////////////////////////// -#define SH_FHCls(ift, iff, ov) __SourceHook_FHCls_##ift##iff##ov -#define SH_MFHCls(hookname) __SourceHook_MFHCls_##hookname - -#define SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) \ - SH_FHCls(ifacetype,ifacefunc,overload)() \ - { \ - GetFuncInfo(funcptr, ms_MFI); \ - } \ - \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - GetFuncInfo(funcptr, ms_MFI); \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_FHCls(ifacetype,ifacefunc,overload)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -// It has to be possible to use the macros in namespaces -// -> So we need to access and extend the global SourceHook namespace -// We use a namespace alias for this -#define SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, funcptr) \ - struct SH_FHCls(ifacetype,ifacefunc,overload) \ - { \ - static SH_FHCls(ifacetype,ifacefunc,overload) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) - -#define SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, funcptr) \ - }; \ - SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ - int __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ - return false; /* No non-virtual functions / virtual inheritance supported */ \ - \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ - new CSHDelegate(handler), post); \ - } \ - int __SourceHook_FHVPAdd##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler, bool direct) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ - return false; /* No non-virtual functions / virtual inheritance supported */ \ - \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ - direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ - iface, mfi.thisptroffs, SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ - new CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0) \ - return false; /* No virtual inheritance supported */ \ - \ - CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, &tmp, post); \ - } \ - -#define SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - struct SH_MFHCls(hookname) \ - { \ - static SH_MFHCls(hookname) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - \ - SH_MFHCls(hookname)() \ - { \ - ms_MFI.isVirtual = true; \ - ms_MFI.thisptroffs = pthisptroffs; \ - ms_MFI.vtblindex = pvtblidx; \ - ms_MFI.vtbloffs = pvtbloffs; \ - } \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - /* we don't set ms_MFI here because manual hookmans can be reconfigured */ \ - /* :FIXME: possible problem: someone adding a hook from a constructor of a global entity */ \ - /* which is construced before SH_MFHCls(hookname)() gets called? */ \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - if (SH_GLOB_SHPTR->GetImplVersion() < SH_IMPL_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_MFHCls(hookname)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -#define SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - }; \ - SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ - int __SourceHook_FHMAdd##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, ::SourceHook::ISourceHook::Hook_Normal, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, \ - new ::SourceHook::CSHDelegate(handler), post); \ - } \ - int __SourceHook_FHMVPAdd##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler, bool direct) \ - { \ - return SH_GLOB_SHPTR->AddHookNew(SH_GLOB_PLUGPTR, \ - direct ? ::SourceHook::ISourceHook::Hook_DVP : ::SourceHook::ISourceHook::Hook_VP, \ - iface, pthisptroffs, SH_MFHCls(hookname)::HookManPubFunc, \ - new ::SourceHook::CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - ::SourceHook::CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, &tmp, post); \ - } \ - - -#define SH_SETUPCALLS(rettype, paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - return (reinterpret_cast(this)->*mfp)params; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - typedef ReferenceCarrier::type my_rettype; \ - my_rettype orig_ret; \ - my_rettype override_ret; \ - my_rettype plugin_ret; \ - void* ifptr; \ - my_rettype *pOverrideRet = reinterpret_cast(SH_GLOB_SHPTR->SetupHookLoop( \ - &status, &prev_res, &cur_res, &ifptr, &orig_ret, &override_ret)); - -#define SH_CALL_HOOKS(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - plugin_ret = reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (cur_res >= MRES_OVERRIDE) \ - *pOverrideRet = plugin_ret; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG(rettype, paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - orig_ret = (reinterpret_cast(this)->*mfp)params; \ - } \ - else \ - orig_ret = override_ret; \ - -#define SH_RETURN() \ - SH_GLOB_SHPTR->HookLoopEnd(); \ - return status >= MRES_OVERRIDE ? *pOverrideRet : orig_ret; - -#define SH_HANDLEFUNC(paramtypes, params, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params) \ - SH_CALL_HOOKS(pre, params) \ - SH_CALL_ORIG(rettype, paramtypes, params) \ - SH_CALL_HOOKS(post, params) \ - SH_RETURN() - -////////////////////////////////////////////////////////////////////////// -#define SH_SETUPCALLS_void(paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - return; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - void* ifptr; \ - SH_GLOB_SHPTR->SetupHookLoop(&status, &prev_res, &cur_res, &ifptr, NULL, NULL); \ - -#define SH_CALL_HOOKS_void(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG_void(paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - } - -#define SH_RETURN_void() \ - SH_GLOB_SHPTR->HookLoopEnd(); - -#define SH_HANDLEFUNC_void(paramtypes, params) \ - SH_SETUPCALLS_void(paramtypes, params) \ - SH_CALL_HOOKS_void(pre, params) \ - SH_CALL_ORIG_void(paramtypes, params) \ - SH_CALL_HOOKS_void(post, params) \ - SH_RETURN_void() - - -// Special vafmt handlers -// :TODO: what -#define SH_HANDLEFUNC_vafmt(paramtypes, params_orig, params_plug, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(pre, params_plug) \ - SH_CALL_ORIG(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(post, params_plug) \ - SH_RETURN() - -#define SH_HANDLEFUNC_void_vafmt(paramtypes, params_orig, params_plug) \ - SH_SETUPCALLS_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(pre, params_plug) \ - SH_CALL_ORIG_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(post, params_plug) \ - SH_RETURN_void() - -////////////////////////////////////////////////////////////////////////// - -// :FIXME: -// sizeof on references returns the size of the datatype, NOT the pointer size or something -// -> one should probably flag references in __SourceHook_ParamSizes_* ! -// or simply assume that their size is sizeof(void*)=SH_PTRSIZE... could be doable through a simple template - - -// ********* Support for 0 arguments ********* -#define SH_DECL_HOOK0(ifacetype, ifacefunc, attr, overload, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate0 FD; \ - virtual rettype Func() \ - { SH_HANDLEFUNC((), (), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_void(ifacetype, ifacefunc, attr, overload) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate0<> FD; \ - virtual void Func() \ - { SH_HANDLEFUNC_void((), ()); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_vafmt(ifacetype, ifacefunc, attr, overload, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((...), ("%s", buf), (buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_void_vafmt(ifacetype, ifacefunc, attr, overload) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((...), ("%s", buf), (buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK0(hookname, vtblidx, vtbloffs, thisptroffs, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate0 FD; \ - virtual rettype Func() \ - { SH_HANDLEFUNC((), (), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK0_void(hookname, vtblidx, vtbloffs, thisptroffs) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate0<> FD; \ - virtual void Func() \ - { SH_HANDLEFUNC_void((), ()); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 0, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 1 arguments ********* -#define SH_DECL_HOOK1(ifacetype, ifacefunc, attr, overload, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(param1 p1) \ - { SH_HANDLEFUNC((param1), (p1), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_void(ifacetype, ifacefunc, attr, overload, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(param1 p1) \ - { SH_HANDLEFUNC_void((param1), (p1)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, ...), (p1, "%s", buf), (p1, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_void_vafmt(ifacetype, ifacefunc, attr, overload, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, ...), (p1, "%s", buf), (p1, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK1(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(param1 p1) \ - { SH_HANDLEFUNC((param1), (p1), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK1_void(hookname, vtblidx, vtbloffs, thisptroffs, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(param1 p1) \ - { SH_HANDLEFUNC_void((param1), (p1)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 1, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 2 arguments ********* -#define SH_DECL_HOOK2(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_void(ifacetype, ifacefunc, attr, overload, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK2(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK2_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 2, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 3 arguments ********* -#define SH_DECL_HOOK3(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK3(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK3_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 3, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 4 arguments ********* -#define SH_DECL_HOOK4(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK4(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK4_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 4, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 5 arguments ********* -#define SH_DECL_HOOK5(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK5(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK5_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 5, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 6 arguments ********* -#define SH_DECL_HOOK6(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK6(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK6_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 6, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 7 arguments ********* -#define SH_DECL_HOOK7(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK7(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK7_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 7, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 8 arguments ********* -#define SH_DECL_HOOK8(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK8(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK8_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 8, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 9 arguments ********* -#define SH_DECL_HOOK9(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK9(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK9_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 9, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 10 arguments ********* -#define SH_DECL_HOOK10(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK10(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK10_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 10, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 11 arguments ********* -#define SH_DECL_HOOK11(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK11(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK11_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 11, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 12 arguments ********* -#define SH_DECL_HOOK12(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK12(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK12_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 12, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 13 arguments ********* -#define SH_DECL_HOOK13(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK13(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK13_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 13, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 14 arguments ********* -#define SH_DECL_HOOK14(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK14(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK14_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 14, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 15 arguments ********* -#define SH_DECL_HOOK15(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK15(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK15_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 15, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 16 arguments ********* -#define SH_DECL_HOOK16(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK16(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK16_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 16, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 17 arguments ********* -#define SH_DECL_HOOK17(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK17(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK17_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 17, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 18 arguments ********* -#define SH_DECL_HOOK18(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK18(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK18_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 18, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 19 arguments ********* -#define SH_DECL_HOOK19(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK19(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK19_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 19, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 20 arguments ********* -#define SH_DECL_HOOK20(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate21 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate21 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK20(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK20_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 20, __SourceHook_ParamSizesM_##hookname); \ - - - - -////////////////////////////////////////////////////////////////////////// -// SH_CALL - -#define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - \ - m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ - RetType tmpret = (m_ThisPtr->*m_MFP)call; \ - m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ - return tmpret; \ -} - -#define SH_MAKE_EXECUTABLECLASS_OB_void(call, prms) \ -{ \ - using namespace ::SourceHook; \ - \ - m_pSH->SetIgnoreHooks(m_Plug, m_VfnPtr); \ - (m_ThisPtr->*m_MFP)call; \ - m_pSH->ResetIgnoreHooks(m_Plug, m_VfnPtr); \ -} - -namespace SourceHook -{ - // Call Class Wrapper! - template struct CCW - { - typedef T type; - - // Get Real Pointer! - static inline T *GRP(T *p) - { - return p; - } - }; - - template struct CCW< CallClass > - { - typedef T type; - - // Get Real Pointer! - static inline T *GRP(CallClass *p) - { - return p->ptr; - } - }; - - - // Support for 0 arguments - template class ExecutableClass0 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass0(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()() const - SH_MAKE_EXECUTABLECLASS_OB((), ()) - - - template RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass0 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass0(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()() const - SH_MAKE_EXECUTABLECLASS_OB_void((), ()) - - - template void operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1), (Param1)) - - template void operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 1 arguments - template class ExecutableClass1 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass1 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass1(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1), (Param1)) - - - template void operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 2 arguments - template class ExecutableClass2 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass2(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass2 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass2(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2), (Param1, Param2)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 3 arguments - template class ExecutableClass3 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass3(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass3 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass3(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3), (Param1, Param2, Param3)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 4 arguments - template class ExecutableClass4 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass4(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass4 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass4(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 5 arguments - template class ExecutableClass5 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass5(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass5 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass5(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 6 arguments - template class ExecutableClass6 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass6(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass6 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass6(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 7 arguments - template class ExecutableClass7 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass7(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass7 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass7(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 8 arguments - template class ExecutableClass8 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass8(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass8 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass8(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 9 arguments - template class ExecutableClass9 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass9(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass9 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass9(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 10 arguments - template class ExecutableClass10 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass10(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass10 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass10(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 11 arguments - template class ExecutableClass11 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass11(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass11 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass11(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 12 arguments - template class ExecutableClass12 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass12(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass12 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass12(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 13 arguments - template class ExecutableClass13 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass13(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass13 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass13(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 14 arguments - template class ExecutableClass14 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass14(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass14 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass14(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 15 arguments - template class ExecutableClass15 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass15(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass15 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass15(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 16 arguments - template class ExecutableClass16 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass16(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass16 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass16(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 17 arguments - template class ExecutableClass17 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass17(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass17 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass17(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 18 arguments - template class ExecutableClass18 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass18(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass18 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass18(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 19 arguments - template class ExecutableClass19 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass19(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class ExecutableClass19 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass19(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 20 arguments - template class ExecutableClass20 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass20(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - - }; - - template class ExecutableClass20 - { - ObjType *m_ThisPtr; - void *m_VfnPtr; - MFP m_MFP; - ISourceHook *m_pSH; - Plugin m_Plug; - public: - ExecutableClass20(ObjType *tp, MFP mfp, void *vp, ISourceHook *pSH, Plugin plug) : m_ThisPtr(tp), - m_VfnPtr(vp), m_MFP(mfp), m_pSH(pSH), m_Plug(plug) { } - - void operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB_void((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - - }; - - -} - -#define SH__CALL_GET_VFNPTR_NORMAL \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(CCW::GRP(ptr), mfp, mfi); \ - void *vfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(ptr) + mfi.thisptroffs + mfi.vtbloffs) + mfi.vtblindex); - -#define SH__CALL_GET_VFNPTR_MANUAL \ - using namespace ::SourceHook; \ - void *vfnptr = reinterpret_cast( \ - *reinterpret_cast( (reinterpret_cast(CCW::GRP(ptr)) + thisptroffs + vtbloffs) ) + vtblidx); \ - /* patch mfp */ \ - *reinterpret_cast(&mfp) = *reinterpret_cast(vfnptr); - -// SH_CALL needs to deduce the return type -> it uses templates and function overloading -// That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP -// The only purpose of the mfp2 parameter is to extract the return type - - -// Support for 0 arguments -template -SourceHook::ExecutableClass0::type, MFP, RetType> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass0::type, MFP, RetType> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)()const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass0 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass0( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 1 arguments -template -SourceHook::ExecutableClass1::type, MFP, RetType, Param1> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass1::type, MFP, RetType, Param1> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass1 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass1( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 2 arguments -template -SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass2 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass2( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 3 arguments -template -SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass3 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass3( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 4 arguments -template -SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass4 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass4( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 5 arguments -template -SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass5 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass5( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 6 arguments -template -SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass6 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass6( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 7 arguments -template -SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass7 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass7( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 8 arguments -template -SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass8 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass8( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 9 arguments -template -SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass9 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass9( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 10 arguments -template -SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass10 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass10( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 11 arguments -template -SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass11 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass11( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 12 arguments -template -SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass12 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass12( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 13 arguments -template -SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass13 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass13( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 14 arguments -template -SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass14 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass14( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 15 arguments -template -SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass15 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass15( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 16 arguments -template -SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass16 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass16( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 17 arguments -template -SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass17 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass17( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 18 arguments -template -SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass18 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass18( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 19 arguments -template -SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass19 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass19( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - -// Support for 20 arguments -template -SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass20 -SH_MCALL3(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_MANUAL - return SourceHook::ExecutableClass20( - reinterpret_cast(CCW::GRP(ptr)), mfp, vfnptr, shptr, plug); -} - - -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 -// GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it - - -// Support for 0 arguments -template -SourceHook::ExecutableClass0::type, MFP, RetType> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass0::type, MFP, RetType> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass0::type, MFP, RetType>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 1 arguments -template -SourceHook::ExecutableClass1::type, MFP, RetType, Param1> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass1::type, MFP, RetType, Param1> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass1::type, MFP, RetType, Param1>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 2 arguments -template -SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass2::type, MFP, RetType, Param1, Param2>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 3 arguments -template -SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass3::type, MFP, RetType, Param1, Param2, Param3>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 4 arguments -template -SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass4::type, MFP, RetType, Param1, Param2, Param3, Param4>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 5 arguments -template -SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass5::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 6 arguments -template -SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass6::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 7 arguments -template -SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass7::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 8 arguments -template -SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass8::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 9 arguments -template -SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass9::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 10 arguments -template -SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass10::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 11 arguments -template -SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass11::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 12 arguments -template -SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass12::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 13 arguments -template -SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass13::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 14 arguments -template -SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass14::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 15 arguments -template -SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass15::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 16 arguments -template -SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass16::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 17 arguments -template -SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass17::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 18 arguments -template -SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass18::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 19 arguments -template -SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass19::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - -// Support for 20 arguments -template -SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - -template -SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const, SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - SH__CALL_GET_VFNPTR_NORMAL - return SourceHook::ExecutableClass20::type, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(CCW::GRP(ptr), - mfp, vfnptr, shptr, plug); -} - - - -#endif - -#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) -#define SH_MCALL2(ptr, mfp, vtblidx, vtbloffs, thisptroffs) SH_MCALL3((ptr), (mfp), (mfp), (vtblidx), (vtbloffs), (thisptroffs), SH_GLOB_SHPTR, SH_GLOB_PLUGPTR) -#define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ - SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) - -#undef SH_MAKE_EXECUTABLECLASS_OB - -////////////////////////////////////////////////////////////////////////// -// SetOverrideRet and RecallGetIface for recalls -// These take a ISourceHook pointer instead of using SH_GLOB_SHPTR directly -// The reason is that the user may want to redefine SH_GLOB_SHPTR - then the macros -// (META_RETURN_VALUE_NEWPARAMS) should obey the new pointer. - -namespace SourceHook -{ - template - void SetOverrideResult(ISourceHook *shptr, const RetType res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - - // SetOverrideResult used to be implemented like this: - // SetOverrideResult(shptr, memfuncptr, return); - // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference - // (it thought it was ambigous - the ref and non-ref type) - // so now SetOverrideResult(memfuncptr) deduces the ret type, and returns a functor which does the work - // new syntax: SetOverrideResult(memfuncptr)(shptr, return) - // This also allows us to create a special version for references which respects ReferenceCarrier. - - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - }; - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T &res) - { - // overrideretptr points to ReferenceCarrier - *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; - } - }; - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)()) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)()) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - -} - -#endif - // The pope is dead. -> :( diff --git a/sourcehook/sourcehook_impl.h b/sourcehook/sourcehook_impl.h deleted file mode 100644 index ac1c5fd..0000000 --- a/sourcehook/sourcehook_impl.h +++ /dev/null @@ -1,817 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -#ifndef __SOURCEHOOK_IMPL_H__ -#define __SOURCEHOOK_IMPL_H__ - -#include "sourcehook.h" -#include "sh_list.h" -#include "sh_vector.h" -#include "sh_tinyhash.h" -#include "sh_stack.h" -#include "sh_listcat.h" - -/* - -IMPLEMENTATION INFO - ---------------------------------------- -Protos ("Prototypes") - The purpose of protos is to provide the amount of type information about a function - which is required to be able to execute a function call without corrupting the stack. - Our protos do not fully do this, but they provide the size of the return value, the number of - parameters, and the size of each parameter, which is enough for most situations. - - There are two version of protos: - OLD: - C-Style strings. - - 0_void: - "attrib" - 1_void: - "attrib|param1_type" - 2_void: - "attrib|param1_type|param2_type - 0: - "attrib|ret_type" - 1: - "attrib|ret_type|param1_type" - 2: - "attrib|ret_type|param2_type" - - Old protos are deprecated. - - NEW: - New protos are in fact pointers to the ProtoInfo structure (see sourcehook.h) - - Old protos begin with a non-zero byte, new protos begin with a zero byte. - - Protos are usually stored in a CProto instance. - ---------------------------------------- -Hook managers and hook manager containers - Each hookman container is tied to _one_ proto/vtable index/vtable offset info. - Hookman containers then contain a list of hook managers provided by plugins, sorted by version. - (higher versions come first) - - Duplicate hook managers are ignored (ie. hook managers where proto, vtable index, vtable offset, - plugin, version are the same as in an already exisiting hook manager) - - A new hook manager is always added to the end of the version group in the corresponding - hook container. - - If the new hook manager was added to the beginning of the container (which only happens if - it is the first one or if it has a higher version than the previously first hook manager), - the now second hook manager is shut down and the new hook manager takes its job. - - A "hook manager container id" (HMCI) consits of three values: proto, vtbl index, vtbl offset. ---------------------------------------- -Hooks - When adding a hook, first the proposed hook manager is added to the corresponding - hook manager container as described above. - - Then the first hook manager in the the manhook container is chosen to handle the function. - - Removing a hook does not neccessarily unreigster the plugin's hook manager. In order to do this, - use RemoveHookManager or UnloadPlugin/ - - Hooks can be paused - they remain in memory but they are not called. In SH, the hook iterator - classes handle pausing transparently. - - The hook loop is supposed to call ShouldContinue before each iteration. This makes hook handlers - able to remove themselves. - ---------------------------------------- -Call classes - - !! deprecated !! - see below (new SH_CALL) - - Call classes are identified by a this pointer and an instance size - - We use the instance size because a derived class instance and a base class instance could - have the same this pointers, and we want to avoid that the derived class - (which could be bigger) gets the same callclass as the base class (mainly if the - base class' callclass was requested first). - - Call classes are reference counted. - - The original function pointers are stored in a vector (in order to allow fast random access). - These vectors are stored as the value type of a hash. The key type is int and represents the - vtable offset. - - If the hash key doesn't exist or the vtblidx is out of range or the corresponding element in the - vector is NULL, there is no hook on that function. - ---------------------------------------- -Recalls - Recalls are used for the META_RETURN_(VALUE_)NEWPARAMS macros, ie. to change the parameters - in the hook loop on the fly. - - First, the macro calls DoRecall(), then it calls the function the hook is attached to -> it - calls the hookfunc. SourceHook makes sure that the newly invoked hook loop starts where the last - one left off and that status variables like status, previous result, override return are kept. - When this recurisvely called hookfunc returns, the macro returns what it returned - (using MRES_SUPERCEDE). CSourceHookImpl returns false from ShouldContinue so the original hook loop - is abandonned. - -Post Recalls - People wanted to be able to use META_RETURN_(VALUE_)NEWPARAMS from post hooks as well. Crazy people! - Anyway, for this, we have to know where a hook handler is. Is it executing pre or post hooks at the moment? - The only way we can know this is watching when it calls CHookList::GetIter(). So CHookList gets a new variable: - m_RequestedFlag. It also gets two new functions: RQFlagReset() and RQFlagGet(). - HookLoopBegin() calls RQFlagReset on both hooklists of the iface; then DoRecall() checks whether the postlist's - RQ flag is set. if yes, the hook loop is in post mode. - - So, what a about a recall in post mode? The first ShouldContinue returns false and sets Status to supercede. - This way the pre hooks and the function call will be skipped. Then, then next ShouldContinue returns true, so we get - into the post hooks. HA! - -Return Values in Post Recalls - The easy case is when we already have an override return value. In this case, the status register gets transferred, - and so does the override return pointer. So, basically, everything is ok. - - However, what happens if we don't? ie. the status register is on MRES_IGNORED? In this case we'd have to transfer the - orig ret value. But we can't: There's no way to tell the hookfunc: "Use this as orig ret pointer". It uses its own. - So, we emulate it. GetOrigRet will return the orig ret pointer from the old hook loop. If still no one overrides it, - we'd have to return it. BUT! HOW TO DO THIS? Check out SH_RETURN(). First calls HookLoopEnd(), then decides whether - to return the override retval or the orig retval. But it doesn't ask for a new override return. So we give the function - the last orig return value as its new override return value; but leave status where it is so everything works, and in - HookLoopEnd we make sure that status is high enough so that the override return will be returned. crazy. - - All this stuff could be much less complicated if I didn't try to preserve binary compatibility :) - -VP Hooks - VP hooks are hooks which are called on a vfnptr, regardless of the this pointer with which it was called. They are - implemented as a special CIface instance with m_Ptr = NULL. All Hook Lists have a new "ListCatIterator" which - virtually concatenates the NULL-interface-hook-list with their normal hook list. - - - I'm afraid that with the addition of Recalls and VP Hooks, SourceHook is now a pretty complex and hacked-together - binary compatible beast which is pretty hard to maintain unless you've written it :) - -New SH_CALL - The addition of VP hooks messed up the Call Classes concept (see above) - call classes are bound to an - instance pointer; they only work on one of the hooked instances. But VP hooks are called on all instances. - - That's why now, SH_CALL takes an instance pointer instead of a callclass pointer. It basically does this: - 1) call SH_GLOB_PTR->SetIgnoreHooks(vfnptr) - 2) call this->*mfp - 3) call SH_GLOB_PTR->ResetIgnoreHooks(vfnptr) - - SourceHook stroes the "ignored vfnptr" and makes CVfnPtr::FindIface return NULL if the CVfnPtr instance - corresponds to the ignored vfnptr. This way the hook manager thinks that the instance isn't hooked, and calls - the original function. Everything works fine. This works even for VP hooks. -*/ - -namespace SourceHook -{ - /** - * @brief The SourceHook implementation class - */ - class CSourceHookImpl : public ISourceHook - { - private: - class CProto - { - char *m_Proto; - - static bool Equal(const char *p1, const char *p2); - char *DupProto(const char *src); - void FreeProto(char *prot); - public: - CProto() : m_Proto(NULL) - { - } - - CProto(const char *szProto) : m_Proto(DupProto(szProto)) - { - } - - CProto(const CProto &other) : m_Proto(DupProto(other.m_Proto)) - { - } - - ~CProto() - { - FreeProto(m_Proto); - m_Proto = NULL; - } - - void operator = (const char *szProto) - { - m_Proto = DupProto(szProto); - } - - void operator = (const CProto &other) - { - m_Proto = DupProto(other.m_Proto); - } - - bool operator == (const char *szProto) const - { - return Equal(szProto, m_Proto); - } - bool operator == (const CProto &other) const - { - return Equal(other.m_Proto, m_Proto); - } - - const char *GetProto() const - { - return m_Proto; - } - }; - - - /** - * @brief A hook can be removed if you have this information - */ - struct RemoveHookInfo - { - RemoveHookInfo(Plugin pplug, void *piface, int tpo, HookManagerPubFunc phookman, - ISHDelegate *phandler, bool ppost) - : plug(pplug), iface(piface), thisptr_offs(tpo), - hookman(phookman), handler(phandler), post(ppost) - { - } - - Plugin plug; - void *iface; - int thisptr_offs; - HookManagerPubFunc hookman; - ISHDelegate *handler; - bool post; - }; - - struct RemoveHookManInfo - { - RemoveHookManInfo(Plugin pplug, HookManagerPubFunc phookman) - : plug(pplug), hookman(phookman) - { - } - - Plugin plug; - HookManagerPubFunc hookman; - }; - - // Associates hook ids with info about the hooks - // Also used to keep track of used hook ids - class CHookIDManager - { - public: - struct Entry - { - bool isfree; - - // hookman info - CProto proto; - int vtbl_offs; - int vtbl_idx; - - // vfnptr - void *vfnptr; - - // iface - void* adjustediface; - - // hook - Plugin plug; - int thisptr_offs; - ISHDelegate *handler; - bool post; - - Entry(const CProto &pprt, int pvo, int pvi, void *pvp, void *pai, Plugin pplug, int pto, - ISHDelegate *ph, bool ppost) - : isfree(false), proto(pprt), vtbl_offs(pvo), vtbl_idx(pvi), vfnptr(pvp), - adjustediface(pai), plug(pplug), thisptr_offs(pto), handler(ph), post(ppost) - { - } - Entry() - { - } - }; - private: - // Internally, hookid 1 is stored as m_Entries[0] - - CVector m_Entries; - public: - CHookIDManager(); - int New(const CProto &proto, int vtbl_offs, int vtbl_idx, void *vfnptr, void *adjustediface, - Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post); - bool Remove(int hookid); - const Entry * QueryHook(int hookid); - - // Finds all hooks with the given info, and fills the hookids into output. - void FindAllHooks(CVector &output, const CProto &proto, int vtbl_offs, int vtbl_idx, - void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post); - - // Removes all hooks with a specified vfnptr - bool RemoveAll(void *vfnptr); - }; - - struct HookInfo - { - ISHDelegate *handler; //!< Pointer to the handler - bool paused; //!< If true, the hook should not be executed - Plugin plug; //!< The owner plugin - int thisptr_offs; //!< This pointer offset - int hookid; //!< Unique ID given by CHookIDManager - - bool operator==(int otherid) - { - return hookid == otherid; - } - }; - - class CHookList : public IHookList - { - public: - List *m_VPList; // left-hand list for ListCatIterator -> for VP hooks - List m_List; - - friend class CIter; - - class CIter : public IHookList::IIter - { - friend class CHookList; - - CHookList *m_pList; - - void SkipPaused(); - public: - - ListCatIterator m_Iter; - - CIter(CHookList *pList); - - virtual ~CIter(); - - void GoToBegin(); - void Set(CIter *pOther); - - bool End(); - void Next(); - ISHDelegate *Handler(); - int ThisPtrOffs(); - - void Clear(); - - CIter *m_pNext; // When stored in m_FreeIters and m_UsedIters - CIter *m_pPrev; // Only used when stored in m_UsedIters - }; - - CIter *m_FreeIters; - CIter *m_UsedIters; // The last returned and not-yet-released iter is always m_UsedIters - - // For recalls - bool m_Recall; - bool m_RQFlag; - - void SetRecallState(); // Sets the list into a state where the next returned - // iterator (from GetIter) will be a copy of the last - // returned iterator, incremented by one. This is used in Recalls. - // The hook resets this state automatically on: - // GetIter, ReleaseIter - - void RQFlagReset() { m_RQFlag = false; } - bool RQFlagGet() { return m_RQFlag; } - CHookList(); - CHookList(const CHookList &other); - virtual ~CHookList(); - - void operator=(const CHookList &other); - - IIter *GetIter(); - void ReleaseIter(IIter *pIter); - - void SetVPList(List *newList); - void ClearVPList(); - }; - - // I know, data hiding... But I'm a lazy bastard! - - class CIface : public IIface - { - public: - void *m_Ptr; - CHookList m_PreHooks; - CHookList m_PostHooks; - public: - CIface(void *ptr); - virtual ~CIface(); - - void *GetPtr(); - IHookList *GetPreHooks(); - IHookList *GetPostHooks(); - - bool operator==(void *ptr) - { - return m_Ptr == ptr; - } - bool operator!=(void *ptr) - { - return m_Ptr != ptr; - } - }; - - class CVfnPtr : public IVfnPtr - { - public: - typedef List IfaceList; - typedef IfaceList::iterator IfaceListIter; - - void *m_Ptr; - void *m_OrigEntry; - - IfaceList m_Ifaces; - - void **m_pOneIgnore; - public: - CVfnPtr(void *ptr, void **pOneIgnore); - virtual ~CVfnPtr(); - - void *GetVfnPtr(); - void *GetOrigEntry(); - - virtual IIface *FindIface(void *ptr); - - bool operator==(void *ptr) - { - return m_Ptr == ptr; - } - }; - - class CHookManagerInfo : public IHookManagerInfo - { - public: - typedef List VfnPtrList; - typedef VfnPtrList::iterator VfnPtrListIter; - - Plugin m_Plug; - HookManagerPubFunc m_Func; - - int m_VtblOffs; - int m_VtblIdx; - const char *m_Proto; - void *m_HookfuncVfnptr; - - VfnPtrList m_VfnPtrs; - - int m_HookManVersion; - public: - CHookManagerInfo(); - virtual ~CHookManagerInfo(); - - IVfnPtr *FindVfnPtr(void *vfnptr); - - void SetInfo(int vtbl_offs, int vtbl_idx, const char *proto); - void SetHookfuncVfnptr(void *hookfunc_vfnptr); - - void SetVersion(int version); - - bool operator < (const CHookManagerInfo &other) - { - return m_HookManVersion < other.m_HookManVersion; - } - - struct Descriptor - { - Descriptor(Plugin pplug, HookManagerPubFunc ppubFunc) : plug(pplug), pubFunc(ppubFunc) - { - } - - Plugin plug; - HookManagerPubFunc pubFunc; - }; - - bool operator == (const Descriptor desc) - { - return m_Func == desc.pubFunc && m_Plug == desc.plug; - } - }; - - typedef List HookManInfoList; - - class CHookManagerContainer : public HookManInfoList - { - public: - // HMCI (Hook Manager Container Identification) - class HMCI - { - CProto m_Proto; - int m_VtableOffset; - int m_VtableIndex; - public: - HMCI(const char *proto, int vtbloffs, int vtblidx) : - m_Proto(proto), m_VtableOffset(vtbloffs), m_VtableIndex(vtblidx) - { - } - ~HMCI() - { - } - - bool operator==(const HMCI &other) const - { - return - other.m_VtableIndex == m_VtableIndex && - other.m_Proto == m_Proto && - other.m_VtableOffset == m_VtableOffset; - } - - const CProto &GetProto() const - { - return m_Proto; - } - int GetVtableOffset() const - { - return m_VtableOffset; - } - int GetVtableIndex() const - { - return m_VtableIndex; - } - }; - HMCI m_HCMI; - - public: - CHookManagerContainer(const HMCI &hmci) : m_HCMI(hmci) - { - } - bool operator == (const HMCI &other) const - { - return m_HCMI == other; - } - void AddHookManager(Plugin plug, const CHookManagerInfo &hookman); - }; - - class CCallClassImpl : public DeprecatedCallClass - { - public: - - typedef SourceHook::CVector OrigFuncs; - typedef SourceHook::THash OrigVTables; - - void *m_Ptr; //!< Pointer to the actual object - size_t m_ObjSize; //!< Size of the instance - OrigVTables m_VT; //!< Info about vtables & functions - - int m_RefCounter; - - CCallClassImpl(void *ptr, size_t size); - virtual ~CCallClassImpl(); - - bool operator==(void *other) - { - return m_Ptr == other; - } - - void *GetThisPtr(); - void *GetOrigFunc(int vtbloffs, int vtblidx); - - void ApplyCallClassPatch(int vtbl_offs, int vtbl_idx, void *orig_entry); - void RemoveCallClassPatch(int vtbl_offs, int vtbl_idx); - }; - - /** - * @brief A list of CallClass structures - */ - typedef List Impl_CallClassList; - - Impl_CallClassList m_CallClasses; //!< A list of already generated callclasses - - /** - * @brief A list of CHookManagerContainers - */ - typedef List HookManContList; - - HookManContList m_HookMans; //!< A list of hook managers - - struct HookLoopInfo - { - enum RecallType - { - Recall_No=0, - Recall_Pre, - Recall_Post1, - Recall_Post2 - }; - - META_RES *pStatus; - META_RES *pPrevRes; - META_RES *pCurRes; - - META_RES temporaryStatus; //!< Stored during Post1 recall phase - bool shouldContinue; - RecallType recall; //!< Specifies which kind of recall we're in. - - IIface *pCurIface; - const void *pOrigRet; - void *pOverrideRet; - void **pIfacePtrPtr; - }; - typedef CStack HookLoopInfoStack; - - void ApplyCallClassPatches(CCallClassImpl &cc); - void ApplyCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx, void *orig_entry); - void RemoveCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx); - - void SetPluginPaused(Plugin plug, bool paused); - - HookLoopInfoStack m_HLIStack; - CHookIDManager m_HookIDMan; - - void *m_OneIgnore; //:TODO: - bool m_IgnoreActive; - public: - CSourceHookImpl(); - virtual ~CSourceHookImpl(); - - /** - * @brief Returns the interface version - */ - int GetIfaceVersion(); - - /** - * @brief Returns the implemnetation version - */ - int GetImplVersion(); - - /** - * @brief Make sure that a plugin is not used by any other plugins anymore, and unregister all its hook managers - */ - void UnloadPlugin(Plugin plug); - - /** - * @brief Shut down the whole system, unregister all hook managers - */ - void CompleteShutdown(); - - /** - * @brief Add a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post); - - /** - * @brief Removes a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param thisptr_offs This pointer adjuster - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post); - - /** - * @brief Removes a hook. - * - * @ return True if the function succeeded, false otherwise - * - * @param info A RemoveHookInfo structure, describing the hook - */ - bool RemoveHook(RemoveHookInfo info); - - /** - * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins - * - * @param plug The unique identifier of the plugin in question - */ - bool IsPluginInUse(Plugin plug); - - /** - * @brief Pauses all hooks of a plugin - * - * @param plug The unique identifier of the plugin - */ - void PausePlugin(Plugin plug); - - /** - * @brief Unpauses all hooks of a plugin - * - * @param plug The unique identifier of the plugin - */ - void UnpausePlugin(Plugin plug); - - /** - * @brief Return a pointer to a callclass. Generate a new one if required. - * - * @param iface The interface pointer - * @param size Size of the class instance - */ - DeprecatedCallClass *GetCallClass(void *iface, size_t size); - - /** - * @brief Release a callclass - * - * @param ptr Pointer to the callclass - */ - virtual void ReleaseCallClass(DeprecatedCallClass *ptr); - - virtual void SetRes(META_RES res); //!< Sets the meta result - virtual META_RES GetPrevRes(); //!< Gets the meta result of the previously called handler - virtual META_RES GetStatus(); //!< Gets the highest meta result - virtual const void *GetOrigRet(); //!< Gets the original result. If not in post function, undefined - virtual const void *GetOverrideRet(); //!< Gets the override result. If none is specified, NULL - virtual void *GetIfacePtr(); //!< Gets the interface pointer - - ////////////////////////////////////////////////////////////////////////// - // For hook managers - void HookLoopBegin(IIface *pIface); //!< Should be called when a hook loop begins - void HookLoopEnd(); //!< Should be called when a hook loop exits - void SetCurResPtr(META_RES *mres); //!< Sets pointer to the current meta result - void SetPrevResPtr(META_RES *mres); //!< Sets pointer to previous meta result - void SetStatusPtr(META_RES *mres); //!< Sets pointer to the status variable - void SetIfacePtrPtr(void **pp); //!< Sets pointer to the interface this pointer - void SetOrigRetPtr(const void *ptr); //!< Sets the original return pointer - void SetOverrideRetPtr(void *ptr); //!< Sets the override result pointer - bool ShouldContinue(); //!< Returns false if the hook loop should exit - - /** - * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. - * - * @param plug The owner of the hook manager - * @param pubFunc The hook manager's info function - */ - virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc); - virtual void RemoveHookManager(RemoveHookManInfo info); - - virtual void DoRecall(); //!< Initiates a recall sequence - virtual void *GetOverrideRetPtr(); //!< Returns the pointer set by SetOverrideRetPtr - - virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr); - - /** - * @brief Add a (VP) hook. - * - * @return non-zero hook id on success, 0 otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param mode Can be either Hook_Normal or Hook_VP (vtable-wide hook) - * @param iface The interface pointer - * The representative interface pointer for VP hooks - * The vtable pointer for direct VP hooks !!! - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual int AddHookNew(Plugin plug, AddHookMode mode, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post); - - /** - * @brief Remove a VP hook by ID. - * - * @return true on success, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param hookid The hook id (returned by AddHookNew) - */ - virtual bool RemoveHookByID(Plugin plug, int hookid); - - /** - * @brief Makes sure that hooks are going to be ignored on the next call of vfnptr - * - * @param plug The unique identifier of the plugin that calls this function - * @param vfnptr The virtual function pointer of the function in question - */ - virtual void SetIgnoreHooks(Plugin plug, void *vfnptr); - - /** - * @brief Reverses SetIgnoreHooks' effect - * - * @param plug The unique identifier of the plugin that calls this function - * @param vfnptr The virtual function pointer of the function in question - */ - virtual void ResetIgnoreHooks(Plugin plug, void *vfnptr); - - /** - * @brief Finds the original entry of a virtual function pointer - * - * @param vfnptr The virtual function pointer - * @return The original entry if the virtual function pointer has been patched; NULL otherwise. - */ - virtual void *GetOrigVfnPtrEntry(void *vfnptr); - }; -} - -#endif diff --git a/sourcehook/test/Makefile b/sourcehook/test/Makefile deleted file mode 100644 index 6c859b0..0000000 --- a/sourcehook/test/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson and Pavol Marko - -OPT_FLAGS = -O3 -funroll-loops -s -pipe -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc -LINK = -lstdc++ -INCLUDE = -I. -I.. -MAX_PARAMS=20 - -BINARY = sourcehook_test -OBJECTS = main.cpp sourcehook.cpp $(shell ls -t test*.cpp) -HEADERS = ../sh_list.h ../sh_tinyhash.h ../sh_memory.h ../sh_string.h ../sh_vector.h ../sourcehook_impl.h ../FastDelegate.h ../sourcehook.h ../sh_memfuncinfo.h - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -CFLAGS += -Wall -# Also, enable SH_ASSERT -CFLAGS += -DSH_DEBUG - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - - -default: all - -$(BIN_DIR)/%.o: %.cpp $(HEADERS) - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -../sourcehook.h: ../generate/sourcehook.hxx - (cd ../generate; ./shworker.bin iter sourcehook.hxx sourcehook.h $(MAX_PARAMS); cp sourcehook.h ..) - -../sourcehook.hxx: ../generate/sh_memfuncinfo.hxx - (cd ../generate; ./shworker.bin iter sh_memfuncinfo.hxx sh_memfuncinfo.h $(MAX_PARAMS); cp sh_memfuncino.h ..) - -../FastDelegate.hxx: ../generate/FastDelegate.hxx - (cd ../generate; ./shworker.bin iter FastDelegate.hxx FastDelegate.h $(MAX_PARAMS); cp FastDelegate.h ..) - -debug: - $(MAKE) all DEBUG=true - -all: - mkdir -p $(BIN_DIR) - ln -sf ../sourcehook.cpp sourcehook.cpp - $(MAKE) $(BINARY) - rm -f $(BINARY) - rm -f sourcehook.cpp - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - - -$(BINARY): $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -o$(BIN_DIR)/$(BINARY) - -clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/sourcehook/test/main.cpp b/sourcehook/test/main.cpp deleted file mode 100644 index aa0147d..0000000 --- a/sourcehook/test/main.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// Hello BAIL! -// hello pm how are you -// I'm fine, what about you? -// not bad, just looking for mem leaks -// mem leaks in my code!? never! I have to preserve binary compatibility :( -// This is a test file - -#include -#include -#include -#include -#include -#include "sh_tinyhash.h" -#include "sh_list.h" -#include "sourcehook_impl.h" -#include "sourcehook.h" - -using namespace std; - -bool g_Verbose; - -class Test -{ - typedef bool (*TestProto)(std::string&); - TestProto m_Func; - std::string m_Name; - - static SourceHook::List ms_Tests; -public: - Test(TestProto func, const char *name) : m_Func(func), m_Name(name) - { - ms_Tests.push_back(this); - } - - bool operator()() - { - std::string error; - if (!m_Func(error)) - { - cout << "Test" << m_Name << " FAILED: " << error << endl; - return false; - } - else - { - cout << "Test" << m_Name << " passed" << endl; - return true; - } - } - - static void DoTests() - { - int passed=0, failed=0; - for (SourceHook::List::iterator iter = ms_Tests.begin(); iter != ms_Tests.end(); ++iter) - { - if ((**iter)()) - ++passed; - else - ++failed; - } - cout << endl << "----" << endl << "Passed: " << passed << endl << "Failed: " << failed << endl; - cout << "Total: " << passed + failed << endl; - } -}; - -SourceHook::List Test::ms_Tests; - -#define DO_TEST(x) \ - bool Test##x(std::string &error); \ - Test g_Test##x(Test##x, #x); - -DO_TEST(List); -DO_TEST(Basic); -DO_TEST(VafmtAndOverload); -DO_TEST(ThisPtrOffs); -DO_TEST(PlugSys); -DO_TEST(Bail); -DO_TEST(Reentr); -DO_TEST(Manual); -DO_TEST(Recall); -DO_TEST(Multi); -DO_TEST(Ref); -DO_TEST(RefRet); -DO_TEST(VPHooks); - -int main(int argc, char *argv[]) -{ - std::string error; - - g_Verbose = argc > 1 && strcmp(argv[1], "-v") == 0; - - Test::DoTests(); - - cout << "Press enter to continue" << endl; - - char x; - cin.read(&x, 1); -} - -SourceHook::ISourceHook *Test_Factory() -{ - return new SourceHook::CSourceHookImpl(); -} - -void Test_Delete(SourceHook::ISourceHook *shptr) -{ - delete static_cast(shptr); -} - -void Test_CompleteShutdown(SourceHook::ISourceHook *shptr) -{ - static_cast(shptr)->CompleteShutdown(); -} - -bool Test_IsPluginInUse(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - return static_cast(shptr)->IsPluginInUse(plug); -} - -void Test_UnloadPlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - static_cast(shptr)->UnloadPlugin(plug); -} - -void Test_PausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - static_cast(shptr)->PausePlugin(plug); -} - -void Test_UnpausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - static_cast(shptr)->UnpausePlugin(plug); -} diff --git a/sourcehook/test/msvc7/test.vcproj b/sourcehook/test/msvc7/test.vcproj deleted file mode 100644 index be61217..0000000 --- a/sourcehook/test/msvc7/test.vcproj +++ /dev/null @@ -1,374 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcehook/test/msvc8/test.vcproj b/sourcehook/test/msvc8/test.vcproj deleted file mode 100644 index ae768e5..0000000 --- a/sourcehook/test/msvc8/test.vcproj +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcehook/test/sourcehook_test.h b/sourcehook/test/sourcehook_test.h deleted file mode 100644 index 9d914b4..0000000 --- a/sourcehook/test/sourcehook_test.h +++ /dev/null @@ -1,27 +0,0 @@ -// This file is used for backwards compatibility testing -// It allows us to test binary backwards compatibility by using an older include file HERE: -#include "sourcehook.h" // <-- here -// There. main.cpp which implements all of the following function is always usign sourcehook.h -// and the up-to-date sourcehook_impl.h/sourcehook.cpp. The tests use this file however. -// If the test needs an up-to-date version (like the recall test), it can simply -// #include "sourcehook.h" before including this, thus overriding our decision. - - -SourceHook::ISourceHook *Test_Factory(); -void Test_Delete(SourceHook::ISourceHook *shptr); - -struct CSHPtrAutoDestruction -{ - SourceHook::ISourceHook *m_SHPtr; - CSHPtrAutoDestruction(SourceHook::ISourceHook *shptr) : m_SHPtr(shptr) {} - ~CSHPtrAutoDestruction() { Test_Delete(m_SHPtr); } -}; - -#define GET_SHPTR(var) var = Test_Factory(); CSHPtrAutoDestruction ___autodestruction(var); - -// Access to CSourceHookImpl functions -void Test_CompleteShutdown(SourceHook::ISourceHook *shptr); -bool Test_IsPluginInUse(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); -void Test_UnloadPlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); -void Test_PausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); -void Test_UnpausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); diff --git a/sourcehook/test/test1.cpp b/sourcehook/test/test1.cpp deleted file mode 100644 index d55e7af..0000000 --- a/sourcehook/test/test1.cpp +++ /dev/null @@ -1,718 +0,0 @@ -#include -#include "sourcehook_test.h" -#include "testevents.h" - -#include "sh_memory.h" - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - // TEST1 - // Basic tests - // Hooking and callclass - - MAKE_STATE_1(State_ModuleInMemory, bool); - MAKE_STATE(State_F1_Called); - MAKE_STATE_1(State_F1_PreHandler_Called, void*); - MAKE_STATE_1(State_F1_PostHandler_Called, void*); - MAKE_STATE_1(State_F1_HookAdded, bool); - MAKE_STATE(State_F1_HookRemoved); - MAKE_STATE(State_F1_CallClassGenerated); - MAKE_STATE(State_F1_CallClassReleased); - MAKE_STATE_1(State_F299_Called, std::string); - MAKE_STATE_1(State_F299_PreHandlerCalled, std::string); - MAKE_STATE_1(State_F299_PostHandlerCalled, std::string); - MAKE_STATE_1(State_F299Ret, bool); - - class Test - { - public: - virtual void F1() - { - ADD_STATE(State_F1_Called); - } - virtual void F2(){} - virtual void F3(){} - virtual void F4(){} - virtual void F5(){} - virtual void F6(){} - virtual void F7(){} - virtual void F8(){} - virtual void F9(){} - virtual void F10(){} - virtual void F11(){} - virtual void F12(){} - virtual void F13(){} - virtual void F14(){} - virtual void F15(){} - virtual void F16(){} - virtual void F17(){} - virtual void F18(){} - virtual void F19(){} - virtual float F20() const { return 1.0f; } // Look! F20 is const-ed and returns a float - virtual void F21(){} - virtual void F22(){} - virtual void F23(){} - virtual void F24(){} - virtual void F25(){} - virtual void F26(){} - virtual void F27(){} - virtual void F28(){} - virtual void F29(){} - virtual void F30(){} - virtual void F31(){} - virtual void F32(){} - virtual void F33(){} - virtual void F34(){} - virtual void F35(){} - virtual void F36(){} - virtual void F37(){} - virtual void F38(){} - virtual void F39(){} - virtual void F40(){} - virtual void F41(){} - virtual void F42(){} - virtual void F43(){} - virtual void F44(){} - virtual void F45(){} - virtual void F46(){} - virtual void F47(){} - virtual void F48(){} - virtual void F49(){} - virtual void F50(){} - virtual void F51(){} - virtual void F52(){} - virtual void F53(){} - virtual void F54(){} - virtual void F55(){} - virtual void F56(){} - virtual void F57(){} - virtual void F58(){} - virtual void F59(){} - virtual void F60(int &hello){} - virtual void F61(){} - virtual void F62(){} - virtual void F63(){} - virtual void F64(){} - virtual void F65(){} - virtual void F66(){} - virtual void F67(){} - virtual void F68(){} - virtual void F69(){} - virtual void F70(){} - virtual void F71(){} - virtual void F72(){} - virtual void F73(){} - virtual void F74(){} - virtual void F75(){} - virtual void F76(){} - virtual void F77(){} - virtual void F78(){} - virtual void F79(){} - virtual void F80(){} - virtual void F81(){} - virtual void F82(){} - virtual void F83(){} - virtual void F84(){} - virtual void F85(){} - virtual void F86(){} - virtual void F87(){} - virtual void F88(){} - virtual void F89(){} - virtual void F90(){} - virtual void F91(){} - virtual void F92(){} - virtual void F93(){} - virtual void F94(){} - virtual void F95(){} - virtual void F96(){} - virtual void F97(){} - virtual void F98(){} - virtual void F99(){} - virtual void F100(){} - virtual void F101(){} - virtual void F102(){} - virtual void F103(){} - virtual void F104(){} - virtual void F105(){} - virtual void F106(){} - virtual void F107(){} - virtual void F108(){} - virtual void F109(){} - virtual void F110(){} - virtual void F111(){} - virtual void F112(){} - virtual void F113(){} - virtual void F114(){} - virtual void F115(){} - virtual void F116(){} - virtual void F117(){} - virtual void F118(){} - virtual void F119(){} - virtual void F120(){} - virtual void F121(){} - virtual void F122(){} - virtual void F123(){} - virtual void F124(){} - virtual void F125(){} - virtual void F126(){} - virtual void F127(){} - virtual void F128(){} - virtual void F129(){} - virtual void F130(){} - virtual void F131(){} - virtual void F132(){} - virtual void F133(){} - virtual void F134(){} - virtual void F135(){} - virtual void F136(){} - virtual void F137(){} - virtual void F138(){} - virtual void F139(){} - virtual void F140(){} - virtual void F141(){} - virtual void F142(){} - virtual void F143(){} - virtual void F144(){} - virtual void F145(){} - virtual void F146(){} - virtual void F147(){} - virtual void F148(){} - virtual void F149(){} - virtual void F150(){} - virtual void F151(){} - virtual void F152(){} - virtual void F153(){} - virtual void F154(){} - virtual void F155(){} - virtual void F156(){} - virtual void F157(){} - virtual void F158(){} - virtual void F159(){} - virtual void F160(){} - virtual void F161(){} - virtual void F162(){} - virtual void F163(){} - virtual void F164(){} - virtual void F165(){} - virtual void F166(){} - virtual void F167(){} - virtual void F168(){} - virtual void F169(){} - virtual void F170(){} - virtual void F171(){} - virtual void F172(){} - virtual void F173(){} - virtual void F174(){} - virtual void F175(){} - virtual void F176(){} - virtual void F177(){} - virtual void F178(){} - virtual void F179(){} - virtual void F180(){} - virtual void F181(){} - virtual void F182(){} - virtual void F183(){} - virtual void F184(){} - virtual void F185(){} - virtual void F186(){} - virtual void F187(){} - virtual void F188(){} - virtual void F189(){} - virtual void F190(){} - virtual void F191(){} - virtual void F192(){} - virtual void F193(){} - virtual void F194(){} - virtual void F195(){} - virtual void F196(){} - virtual void F197(){} - virtual void F198(){} - virtual void F199(){} - virtual void F200(){} - virtual void F201(){} - virtual void F202(){} - virtual void F203(){} - virtual void F204(){} - virtual void F205(){} - virtual void F206(){} - virtual void F207(){} - virtual void F208(){} - virtual void F209(){} - virtual void F210(){} - virtual void F211(){} - virtual void F212(){} - virtual void F213(){} - virtual void F214(){} - virtual void F215(){} - virtual void F216(){} - virtual void F217(){} - virtual void F218(){} - virtual void F219(){} - virtual void F220(){} - virtual void F221(){} - virtual void F222(){} - virtual void F223(){} - virtual void F224(){} - virtual void F225(){} - virtual void F226(){} - virtual void F227(){} - virtual void F228(){} - virtual void F229(){} - virtual void F230(){} - virtual void F231(){} - virtual void F232(){} - virtual void F233(){} - virtual void F234(){} - virtual void F235(){} - virtual void F236(){} - virtual void F237(){} - virtual void F238(){} - virtual void F239(){} - virtual void F240(){} - virtual void F241(){} - virtual void F242(){} - virtual void F243(){} - virtual void F244(){} - virtual void F245(){} - virtual void F246(){} - virtual void F247(){} - virtual void F248(){} - virtual void F249(){} - virtual void F250(){} - virtual void F251(){} - virtual void F252(){} - virtual void F253(){} - virtual void F254(){} - virtual void F255(){} - virtual void F256(){} - virtual void F257(){} - virtual void F258(){} - virtual void F259(){} - virtual void F260(){} - virtual void F261(){} - virtual void F262(){} - virtual void F263(){} - virtual void F264(){} - virtual void F265(){} - virtual void F266(){} - virtual void F267(){} - virtual void F268(){} - virtual void F269(){} - virtual void F270(){} - virtual void F271(){} - virtual void F272(){} - virtual void F273(){} - virtual void F274(){} - virtual void F275(){} - virtual void F276(){} - virtual void F277(){} - virtual void F278(){} - virtual void F279(){} - virtual void F280(){} - virtual void F281(){} - virtual void F282(){} - virtual void F283(){} - virtual void F284(){} - virtual void F285(){} - virtual void F286(){} - virtual void F287(){} - virtual void F288(){} - virtual void F289(){} - virtual void F290(){} - virtual void F291(){} - virtual void F292(){} - virtual void F293(){} - virtual void F294(){} - virtual void F295(){} - virtual void F296(){} - virtual void F297(){} - virtual void F298(){} - virtual bool F299(const char *mwah) - { - ADD_STATE(State_F299_Called(mwah)); - return true; - } - }; - - // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! - class Whatever : public Test - { - }; - - SH_DECL_HOOK1(Test, F299, SH_NOATTRIB, 0, bool, const char *); - SH_DECL_HOOK0_void(Test, F1, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F2, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F3, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F4, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F5, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F6, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F7, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F8, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F9, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F10, SH_NOATTRIB, 0); - - SH_DECL_HOOK0(Test, F20, const, 0, float); - SH_DECL_HOOK1_void(Test, F60, SH_NOATTRIB, 0, int&); - - META_RES g_F1Pre_WhatToDo; - META_RES g_F1Post_WhatToDo; - - struct HandlersF1 - { - void Pre() - { - ADD_STATE(State_F1_PreHandler_Called(reinterpret_cast(this))); - RETURN_META(g_F1Pre_WhatToDo); - } - - void Post() - { - ADD_STATE(State_F1_PostHandler_Called(reinterpret_cast(this))); - RETURN_META(g_F1Post_WhatToDo); - } - }; - - META_RES g_F299Pre_WhatToDo; - bool g_F299Pre_WhatToRet; - - bool F299_Pre(const char *mwah) - { - ADD_STATE(State_F299_PreHandlerCalled(mwah)); - RETURN_META_VALUE(g_F299Pre_WhatToDo, g_F299Pre_WhatToRet); - } - - bool F299_Post(const char *mwah) - { - ADD_STATE(State_F299_PostHandlerCalled(mwah)); - RETURN_META_VALUE(MRES_OVERRIDE, META_RESULT_STATUS >= MRES_OVERRIDE ? !META_RESULT_OVERRIDE_RET(bool) : - !META_RESULT_ORIG_RET(bool)); - } - - void F60_Pre(int &hello) - { - hello = 10; - } -} - -template T func(T a) -{ - return a; -} - - -bool TestBasic(std::string &error) -{ - // Simple test for ModuleInMemory - // 1) &error should on the stack - // 2) 0 should not be mapped - ADD_STATE(State_ModuleInMemory(SourceHook::ModuleInMemory(reinterpret_cast(&error), sizeof(error)))); - ADD_STATE(State_ModuleInMemory(SourceHook::ModuleInMemory(0, 1))); - - CHECK_STATES((&g_States, - new State_ModuleInMemory(true), - new State_ModuleInMemory(false), - NULL), "ModuleInMemory"); - - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - HandlersF1 f1_handlers; - Whatever test; - Test *pTest = &test; - - // 1) SH_CALL it and call it normally - - return true; - SH_CALL(pTest, &Test::F1)(); - - - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_Called, - new State_F1_Called, - NULL), "Part 1"); - - // 2) Request a call class again - - SH_CALL(pTest, &Test::F1)(); - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_Called, - new State_F1_Called, - new State_F1_Called, - - new State_F1_Called, - new State_F1_Called, - NULL), "Part 2"); - - // 3) Add a pre hook - // (one add memfunc in old format) - g_F1Pre_WhatToDo = MRES_SUPERCEDE; - ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false) ? true : false)); - - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookAdded(true), - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - NULL), "Part 3"); - - // 4) Test source-level compat with callclasses - SourceHook::CallClass *pCC = SH_GET_CALLCLASS(pTest); - - SH_CALL(pCC, &Test::F1)(); - pTest->F1(); - - SH_RELEASE_CALLCLASS(pCC); - - CHECK_STATES((&g_States, - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - NULL), "Part 4"); - - // 5) Check ignore / supercede - g_F1Pre_WhatToDo = MRES_SUPERCEDE; - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - g_F1Pre_WhatToDo = MRES_IGNORED; - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_Called, - NULL), "Part 5"); - - // 6) remove the hook again - // (one remove memfunc in old format) - SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false); - ADD_STATE(State_F1_HookRemoved); - - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookRemoved, - new State_F1_Called, - new State_F1_Called, - NULL), "Part 6"); - - // 7) add a post hook now - g_F1Post_WhatToDo = MRES_IGNORED; - ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Post), true) ? true : false)); - - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookAdded(true), - new State_F1_Called, - new State_F1_Called, - new State_F1_PostHandler_Called(&f1_handlers), - NULL), "Part 7"); - - // 8) And a pre hook again - g_F1Pre_WhatToDo = MRES_IGNORED; - ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false) ? true : false)); - - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - g_F1Pre_WhatToDo = MRES_SUPERCEDE; - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookAdded(true), - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_Called, - new State_F1_PostHandler_Called(&f1_handlers), - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_PostHandler_Called(&f1_handlers), - NULL), "Part 8"); - - // 9) Remove all hooks - SH_REMOVE_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - ADD_STATE(State_F1_HookRemoved); - SH_REMOVE_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Post), true); - ADD_STATE(State_F1_HookRemoved); - - SH_CALL(pTest, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookRemoved, - new State_F1_HookRemoved, - new State_F1_Called, - new State_F1_Called, - NULL), "Part 9"); - - // 10) Some checks on F299 - g_F299Pre_WhatToDo = MRES_IGNORED; - g_F299Pre_WhatToRet = false; - - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_Called("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.1"); - - // (one add staticfunc in old format) - SH_ADD_HOOK_STATICFUNC(Test, F299, pTest, F299_Pre, false); - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_PreHandlerCalled("hi"), - new State_F299_Called("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.2"); - - SH_ADD_HOOK(Test, F299, pTest, SH_STATIC(F299_Post), true); - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_PreHandlerCalled("hi"), - new State_F299_Called("hi"), - new State_F299_PostHandlerCalled("hi"), - new State_F299Ret(false), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.3"); - - g_F299Pre_WhatToDo = MRES_OVERRIDE; - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_PreHandlerCalled("hi"), - new State_F299_Called("hi"), - new State_F299_PostHandlerCalled("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.4"); - - g_F299Pre_WhatToDo = MRES_SUPERCEDE; - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_PreHandlerCalled("hi"), - new State_F299_PostHandlerCalled("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.5"); - - // (one remove staticfunc in old format) - SH_REMOVE_HOOK_STATICFUNC(Test, F299, pTest, F299_Pre, false); - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_Called("hi"), - new State_F299_PostHandlerCalled("hi"), - new State_F299Ret(false), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.6"); - - SH_REMOVE_HOOK(Test, F299, pTest, SH_STATIC(F299_Post), true); - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(pTest, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_Called("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.7"); - - - // 11 1/2) Test removing hook by id - - g_F1Pre_WhatToDo = MRES_IGNORED; - - pTest->F1(); - int hookPre = SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - int hookPost = SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Post), true); - - pTest->F1(); - SH_REMOVE_HOOK_ID(hookPost); - pTest->F1(); - SH_REMOVE_HOOK_ID(hookPre); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_Called, - - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_Called, - new State_F1_PostHandler_Called(&f1_handlers), - - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_Called, - - new State_F1_Called, - - NULL), "Part 11 1/2"); - - // 12) Test? Test. - SH_ADD_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); - SH_ADD_HOOK(Test, F2, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); - SH_ADD_HOOK(Test, F3, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_ADD_HOOK(Test, F4, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); - SH_ADD_HOOK(Test, F5, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_ADD_HOOK(Test, F6, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); - SH_ADD_HOOK(Test, F7, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_ADD_HOOK(Test, F8, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_ADD_HOOK(Test, F9, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_ADD_HOOK(Test, F10, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - - SH_REMOVE_HOOK(Test, F1, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); - SH_REMOVE_HOOK(Test, F2, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); - SH_REMOVE_HOOK(Test, F3, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_REMOVE_HOOK(Test, F4, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); - SH_REMOVE_HOOK(Test, F5, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_REMOVE_HOOK(Test, F6, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), true); - SH_REMOVE_HOOK(Test, F7, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_REMOVE_HOOK(Test, F8, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_REMOVE_HOOK(Test, F9, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - SH_REMOVE_HOOK(Test, F10, pTest, SH_MEMBER(&f1_handlers, &HandlersF1::Pre), false); - - SH_ADD_HOOK(Test, F60, pTest, SH_STATIC(F60_Pre), false); - - int a = 0; - pTest->F60(a); - Test_CompleteShutdown(g_SHPtr); - - CHECK_COND(a == 10, "Part12.a"); - - return true; -} diff --git a/sourcehook/test/test2.cpp b/sourcehook/test/test2.cpp deleted file mode 100644 index 46c988c..0000000 --- a/sourcehook/test/test2.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include -#include "sourcehook_test.h" -#include "testevents.h" -#include - -// TEST2 -// Vafmt and Overloaded functions -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_EatYams_Called, int); - MAKE_STATE_1(State_EatYams_Handler_Called, int); - MAKE_STATE_2(State_Vafmt_Called, int, std::string); - MAKE_STATE_2(State_Vafmt_PreHandler_Called, int, std::string); - MAKE_STATE_2(State_Vafmt_PostHandler_Called, int, std::string); - - class IGaben - { - public: - virtual void EatYams() - { - ADD_STATE(State_EatYams_Called(0)); - } - virtual bool EatYams(const char *location) const - { - ADD_STATE(State_EatYams_Called(1)); - return true; - } - virtual void Vafmt1(bool param1, int x, const char *fmt, ...) - { - va_list ap; - va_start(ap, fmt); - char buffer[512]; - vsprintf(buffer, fmt, ap); - va_end(ap); - ADD_STATE(State_Vafmt_Called(1, std::string(buffer))); - } - virtual float Vafmt2(const char *fmt, ...) - { - va_list ap; - va_start(ap, fmt); - char buffer[512]; - vsprintf(buffer, fmt, ap); - va_end(ap); - ADD_STATE(State_Vafmt_Called(2, std::string(buffer))); - return 0.0f; - } - }; - - // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! - class Whatever : public IGaben - { - }; - - SH_DECL_HOOK0_void(IGaben, EatYams, SH_NOATTRIB, 0); - SH_DECL_HOOK1(IGaben, EatYams, const, 1, bool, const char *); - SH_DECL_HOOK2_void_vafmt(IGaben, Vafmt1, SH_NOATTRIB, 0, bool, int); - SH_DECL_HOOK0_vafmt(IGaben, Vafmt2, SH_NOATTRIB, 0, float); - - void EatYams0_Handler() - { - ADD_STATE(State_EatYams_Handler_Called(0)); - } - - bool EatYams1_Handler(const char *loc) - { - ADD_STATE(State_EatYams_Handler_Called(1)); - return true; - } - - void Vafmt1_PreHandler(bool param1, int x, const char *in) - { - ADD_STATE(State_Vafmt_PreHandler_Called(1, std::string(in))); - } - void Vafmt1_PostHandler(bool param1, int x, const char *in) - { - ADD_STATE(State_Vafmt_PostHandler_Called(1, std::string(in))); - } - float Vafmt2_PreHandler(const char *in) - { - ADD_STATE(State_Vafmt_PreHandler_Called(2, std::string(in))); - return 0.0f; - } - float Vafmt2_PostHandler(const char *in) - { - ADD_STATE(State_Vafmt_PostHandler_Called(2, std::string(in))); - return 0.0f; - } -} - - -bool TestVafmtAndOverload(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - Whatever gabgab; - IGaben *pGab = &gabgab; - - // Part 1 - SH_CALL(pGab, static_cast(&IGaben::EatYams))(); - SH_CALL(pGab, static_cast(&IGaben::EatYams))("Here!"); - - SH_ADD_HOOK(IGaben, EatYams, pGab, EatYams0_Handler, false); - SH_ADD_HOOK(IGaben, EatYams, pGab, EatYams1_Handler, false); - - pGab->EatYams(); - pGab->EatYams("Here!"); - - SH_REMOVE_HOOK(IGaben, EatYams, pGab, EatYams0_Handler, false); - SH_REMOVE_HOOK(IGaben, EatYams, pGab, EatYams1_Handler, false); - - CHECK_STATES((&g_States, - new State_EatYams_Called(0), - new State_EatYams_Called(1), - new State_EatYams_Handler_Called(0), - new State_EatYams_Called(0), - new State_EatYams_Handler_Called(1), - new State_EatYams_Called(1), - NULL),"Part 1"); - - // Part 2 - pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); - SH_CALL(pGab, &IGaben::Vafmt1)(true, 55, "Hello %s%d%s", "BA", 1, "L"); - pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); - SH_CALL(pGab, &IGaben::Vafmt2)("Hello %s%d%s", "BA", 1, "LOPAN"); - - CHECK_STATES((&g_States, - new State_Vafmt_Called(1, "Hello BA1L"), - new State_Vafmt_Called(1, "Hello BA1L"), - new State_Vafmt_Called(2, "Hello BA1LOPAN"), - new State_Vafmt_Called(2, "Hello BA1LOPAN"), - NULL), "Part 2"); - - // Part 3 - SH_ADD_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PreHandler, false); - SH_ADD_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PostHandler, true); - SH_ADD_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PreHandler, false); - SH_ADD_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PostHandler, true); - - pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); - pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); - - CHECK_STATES((&g_States, - new State_Vafmt_PreHandler_Called(1, std::string("Hello BA1L")), - new State_Vafmt_Called(1, std::string("Hello BA1L")), - new State_Vafmt_PostHandler_Called(1, std::string("Hello BA1L")), - - new State_Vafmt_PreHandler_Called(2, std::string("Hello BA1LOPAN")), - new State_Vafmt_Called(2, std::string("Hello BA1LOPAN")), - new State_Vafmt_PostHandler_Called(2, std::string("Hello BA1LOPAN")), - NULL), "Part 3"); - - // Part 4 - SH_REMOVE_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PreHandler, false); - SH_REMOVE_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PostHandler, true); - SH_REMOVE_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PreHandler, false); - SH_REMOVE_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PostHandler, true); - - pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); - pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); - - CHECK_STATES((&g_States, - new State_Vafmt_Called(1, "Hello BA1L"), - new State_Vafmt_Called(2, "Hello BA1LOPAN"), - NULL), "Part 4"); - - return true; -} diff --git a/sourcehook/test/test3.cpp b/sourcehook/test/test3.cpp deleted file mode 100644 index f78d61c..0000000 --- a/sourcehook/test/test3.cpp +++ /dev/null @@ -1,232 +0,0 @@ -#include -#include "sourcehook_test.h" -#include "testevents.h" - -// TEST3 -// Tests with inheritance / thisptroffsets - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Func1_Called, void*); // param1: This pointer - MAKE_STATE_1(State_Func2_Called, void*); // param1: This pointer - MAKE_STATE_1(State_Func3_Called, void*); // param1: This pointer - - MAKE_STATE_1(State_Func1H_Called, void*); - MAKE_STATE_1(State_Func2H_Called, void*); - MAKE_STATE_1(State_Func3H_Called, void*); - - class Base1 - { - int a; - public: - virtual void Func1() - { - ADD_STATE(State_Func1_Called(reinterpret_cast(this))); - } - }; - class Base2 - { - int b; - public: - virtual void Func2() - { - ADD_STATE(State_Func2_Called(reinterpret_cast(this))); - } - }; - class Derived : public Base1, public Base2 - { - int c; - public: - virtual void Func3() - { - ADD_STATE(State_Func3_Called(reinterpret_cast(this))); - } - }; - - class DerivedDerived : public Derived { }; - - SH_DECL_HOOK0_void(Derived, Func1, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Derived, Func2, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Derived, Func3, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Base1, Func1, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Base2, Func2, SH_NOATTRIB, 0); - - void Handler_Func1() - { - ADD_STATE(State_Func1H_Called(META_IFACEPTR(void))); - } - void Handler_Func2() - { - ADD_STATE(State_Func2H_Called(META_IFACEPTR(void))); - } - void Handler_Func3() - { - ADD_STATE(State_Func3H_Called(META_IFACEPTR(void))); - } -} - -bool TestThisPtrOffs(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - DerivedDerived inst; - Derived *pD = &inst; - Base1 *pB1 = pD; - Base2 *pB2 = pD; - - // It should be: - // pB1 = pD - // pB2 > pB1 - - // 1) - // Get a callclass for pD - // Verify whether the this pointers are correct - // Also call them normally to make sure that we aren't messing it up ;) - - SH_CALL(pD, &Derived::Func1)(); - SH_CALL(pD, &Derived::Func2)(); - SH_CALL(pD, &Derived::Func3)(); - pD->Func1(); - pD->Func2(); - pD->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - new State_Func3_Called(pD), - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - new State_Func3_Called(pD), - NULL), "Part 1"); - - SH_CALL(pD, &Base1::Func1)(); - SH_CALL(pD, &Base2::Func2)(); - - CHECK_STATES((&g_States, - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - NULL), "Part 1.1"); - - // 2) - // Get callclasses for the other ones and verify it as well - - SH_CALL(pB1, &Base1::Func1)(); - SH_CALL(pB2, &Base2::Func2)(); - - CHECK_STATES((&g_States, - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - NULL), "Part 2"); - - - // 3) Add hooks on them (referring to them through pD1 / Derived) - // Check whether the hooks are called with the correct this pointer - - SH_ADD_HOOK(Derived, Func1, pD, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(Derived, Func2, pD, SH_STATIC(Handler_Func2), false); - SH_ADD_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); - - pD->Func1(); - pD->Func2(); - pD->Func3(); - pB1->Func1(); - pB2->Func2(); - - // The handlers should always be called with the pointer to Derived - CHECK_STATES((&g_States, - new State_Func1H_Called(pD), - new State_Func1_Called(pB1), - new State_Func2H_Called(pD), - new State_Func2_Called(pB2), - new State_Func3H_Called(pD), - new State_Func3_Called(pD), - new State_Func1H_Called(pD), - new State_Func1_Called(pB1), - new State_Func2H_Called(pD), - new State_Func2_Called(pB2), - NULL), "Part 3"); - - SH_REMOVE_HOOK(Derived, Func1, pD, SH_STATIC(Handler_Func1), false); - SH_REMOVE_HOOK(Derived, Func2, pD, SH_STATIC(Handler_Func2), false); - SH_REMOVE_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); - - // 4) - // Now add the hooks on Base1 and Base2 and check again - - // Note that the new implicit_cast should convert the pD to Base1*/Base2* :) - SH_ADD_HOOK(Base1, Func1, pD, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(Base2, Func2, pD, SH_STATIC(Handler_Func2), false); - SH_ADD_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); - - pD->Func1(); - pD->Func2(); - pD->Func3(); - pB1->Func1(); - pB2->Func2(); - - // This time, the handlers for Func1 should be called with pB1 and the handlers - // for Func2 should be called with pB2 - CHECK_STATES((&g_States, - new State_Func1H_Called(pB1), - new State_Func1_Called(pB1), - new State_Func2H_Called(pB2), - new State_Func2_Called(pB2), - new State_Func3H_Called(pD), - new State_Func3_Called(pD), - new State_Func1H_Called(pB1), - new State_Func1_Called(pB1), - new State_Func2H_Called(pB2), - new State_Func2_Called(pB2), - NULL), "Part 4"); - - SH_REMOVE_HOOK(Base1, Func1, pD, SH_STATIC(Handler_Func1), false); - SH_REMOVE_HOOK(Base2, Func2, pD, SH_STATIC(Handler_Func2), false); - SH_REMOVE_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); - - - // 5) - // Add some hooks, and use callclasses - - // 5.1) First off, add all of them on pD - SH_ADD_HOOK(Derived, Func1, pD, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(Derived, Func2, pD, SH_STATIC(Handler_Func2), false); - SH_ADD_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); - - pD->Func1(); - pD->Func2(); - pD->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called(pD), - new State_Func1_Called(pB1), - new State_Func2H_Called(pD), - new State_Func2_Called(pB2), - new State_Func3H_Called(pD), - new State_Func3_Called(pD), - NULL), "Part 5.1"); - - SH_CALL(pD, &Derived::Func1)(); - SH_CALL(pD, &Derived::Func2)(); - SH_CALL(pD, &Derived::Func3)(); - SH_CALL(pB1, &Base1::Func1)(); - SH_CALL(pB2, &Base2::Func2)(); - - CHECK_STATES((&g_States, - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - new State_Func3_Called(pD), - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - NULL), "Part 5.2"); - - SH_REMOVE_HOOK(Derived, Func1, pD, SH_STATIC(Handler_Func1), false); - SH_REMOVE_HOOK(Derived, Func2, pD, SH_STATIC(Handler_Func2), false); - SH_REMOVE_HOOK(Derived, Func3, pD, SH_STATIC(Handler_Func3), false); - - return true; -} diff --git a/sourcehook/test/test4.cpp b/sourcehook/test/test4.cpp deleted file mode 100644 index 483cab5..0000000 --- a/sourcehook/test/test4.cpp +++ /dev/null @@ -1,425 +0,0 @@ -#include -#include "sourcehook_test.h" -#include "testevents.h" - -// TEST4 -// Tests of plugin management system - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE(State_Func1_Called); - MAKE_STATE(State_Func2_Called); - MAKE_STATE(State_Func3_Called); - - MAKE_STATE(State_Func1H_Called); - MAKE_STATE(State_Func2H_Called); - MAKE_STATE(State_Func3H_Called); - - MAKE_STATE_2(State_PluginInUse, int, bool); - - class Test - { - public: - virtual void Func1() - { - ADD_STATE(State_Func1_Called); - } - - virtual void Func2() - { - ADD_STATE(State_Func2_Called); - } - - virtual void Func3() - { - ADD_STATE(State_Func3_Called); - } - }; - - // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! - class Whatever : public Test - { - }; - - SH_DECL_HOOK0_void(Test, Func1, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, Func2, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, Func3, SH_NOATTRIB, 0); - - void Handler_Func1() - { - ADD_STATE(State_Func1H_Called); - } - void Handler_Func2() - { - ADD_STATE(State_Func2H_Called); - } - void Handler_Func3() - { - ADD_STATE(State_Func3H_Called); - } -} - -bool TestPlugSys(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1; - - Whatever inst; - Test *pInst = &inst; - - // 1) - // Add hooks, then issue a complete shutdown - SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); - SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 1.1"); - - Test_CompleteShutdown(g_SHPtr); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called, - new State_Func2_Called, - new State_Func3_Called, - NULL), "Part 1.2"); - - // 2) - // Add hooks from "different plugins", then shutdown the plugins - - g_PLID = 1; - SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); - g_PLID = 2; - SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); - g_PLID = 3; - SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); - - g_PLID = 1; - SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); - SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); - - g_PLID = 2; - SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); - - g_PLID = 3; - SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 2.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 2.2"); - - // Unload plugins one by one - Test_UnloadPlugin(g_SHPtr, 3); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 2.3.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, false), - new State_PluginInUse(4, false), - NULL), "Part 2.3.2"); - - Test_UnloadPlugin(g_SHPtr, 2); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 2.4.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, false), - new State_PluginInUse(3, false), - new State_PluginInUse(4, false), - NULL), "Part 2.4.2"); - - Test_UnloadPlugin(g_SHPtr, 1); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called, - new State_Func2_Called, - new State_Func3_Called, - NULL), "Part 2.5.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, false), - new State_PluginInUse(2, false), - new State_PluginInUse(3, false), - new State_PluginInUse(4, false), - NULL), "Part 2.5.2"); - - - // 3) - // Add hooks from "different plugins", then pause the plugins - - g_PLID = 1; - SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); - g_PLID = 2; - SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); - g_PLID = 3; - SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); - - g_PLID = 1; - SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); - SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); - - g_PLID = 2; - SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(Test, Func3, pInst, SH_STATIC(Handler_Func3), false); - - g_PLID = 3; - SH_ADD_HOOK(Test, Func1, pInst, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(Test, Func2, pInst, SH_STATIC(Handler_Func2), true); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 3.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.2"); - - // Unload plugins one by one - Test_PausePlugin(g_SHPtr, 3); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 3.3.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.3.2"); - - Test_PausePlugin(g_SHPtr, 2); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 3.4.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.4.2"); - - Test_PausePlugin(g_SHPtr, 1); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called, - new State_Func2_Called, - new State_Func3_Called, - NULL), "Part 3.5.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.5.2"); - - Test_UnpausePlugin(g_SHPtr, 1); - Test_UnpausePlugin(g_SHPtr, 2); - Test_UnpausePlugin(g_SHPtr, 3); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.6"); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 3.7"); - - // 4) Shutdown :) - Test_CompleteShutdown(g_SHPtr); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called, - new State_Func2_Called, - new State_Func3_Called, - NULL), "Part 4"); - - return true; -} diff --git a/sourcehook/test/testbail.cpp b/sourcehook/test/testbail.cpp deleted file mode 100644 index 46f7b9d..0000000 --- a/sourcehook/test/testbail.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// TESTBAIL -// This test used to be a test for a bug BAIL found. -// That bug is now fixed so I've granted BAIL the pleasure of being a test for -// the correct priority ordering of hook managers based on their version. - -/* - THE PROBLEM: - Old hook funcs don't work right when you combine override returns and recalls. - THE SOLUTION: - Always use a new hook func when possible. For this, hook funcs have to be able to say - " HELLO I'M NEW! " - - This file tests that functionality. - - How it works: - testbail.cpp compiles with old version of sourcehook.h. - It sets everything up, adds a hook on a function - Then testbail2.cpp which has the new version adds a hook on the same function and - does a recall and overrides the value in it. -*/ -#include "sourcehook_test.h" -#include "testbail.h" - -namespace N_TestBail -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - IGaben *g_Gabgab; -} - -namespace -{ - int EatYams_Handler1(int a) - { - ADD_STATE(State_EatYams_Handler1_Called(a)); - RETURN_META_VALUE(MRES_IGNORED, 0); - } -} - -bool TestBail(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1; - - g_Gabgab = new IGaben; - - SH_ADD_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler1), false); - - ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); - - CHECK_STATES((&g_States, - new State_EatYams_Handler1_Called(0xDEAD), - new State_EatYams_Called(0xDEAD), - new State_EatYams_Return(5), - NULL), "Part 1"); - - if (!TestBail2(error)) - return false; - - CHECK_STATES((&g_States, - new State_EatYams_Handler1_Called(0xDEAD), - new State_EatYams_Handler2_Called(0xDEAD), - new State_EatYams_Handler3_Called(0xBEEF), - new State_EatYams_Called(0xBEEF), - NULL), "Part 2.1"); - - // WHAT IF NOW SOMEONE UNLOADS PLUGIN 2 !?!?!?!? - Test_UnloadPlugin(g_SHPtr, 2); - - ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); - - CHECK_STATES((&g_States, - new State_EatYams_Handler1_Called(0xDEAD), - new State_EatYams_Called(0xDEAD), - new State_EatYams_Return(5), - NULL), "Part 3"); - - SH_REMOVE_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler1), false); - - ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); - - CHECK_STATES((&g_States, - new State_EatYams_Called(0xDEAD), - new State_EatYams_Return(5), - NULL), "Part 4"); - - // Now, heh, try it the other way round. - - Test_CompleteShutdown(g_SHPtr); - - if (!TestBail2(error)) - return false; - - CHECK_STATES((&g_States, - new State_EatYams_Handler2_Called(0xDEAD), - new State_EatYams_Handler3_Called(0xBEEF), - new State_EatYams_Called(0xBEEF), - NULL), "Part 5"); - - SH_ADD_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler1), false); - - ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); - - CHECK_STATES((&g_States, - new State_EatYams_Handler2_Called(0xDEAD), - new State_EatYams_Handler3_Called(0xBEEF), - new State_EatYams_Handler1_Called(0xBEEF), - new State_EatYams_Called(0xBEEF), - new State_EatYams_Return(6), - NULL), "Part 6"); - - delete g_Gabgab; - - return true; -} diff --git a/sourcehook/test/testbail.h b/sourcehook/test/testbail.h deleted file mode 100644 index 258a49c..0000000 --- a/sourcehook/test/testbail.h +++ /dev/null @@ -1,39 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// Shared data for testbail - -#include -#include "testevents.h" - -namespace N_TestBail -{ - extern StateList g_States; - extern SourceHook::ISourceHook *g_SHPtr; - - MAKE_STATE_1(State_EatYams_Called, int); - MAKE_STATE_1(State_EatYams_Handler1_Called, int); - MAKE_STATE_1(State_EatYams_Handler2_Called, int); - MAKE_STATE_1(State_EatYams_Handler3_Called, int); - MAKE_STATE_1(State_EatYams_Return, int); - - class IGaben - { - public: - virtual int EatYams(int a) - { - ADD_STATE(State_EatYams_Called(a)); - return 5; - } - }; - - extern IGaben *g_Gabgab; - - bool TestBail2(std::string &error); -} - -using namespace N_TestBail; - -namespace -{ - SourceHook::Plugin g_PLID; - SH_DECL_HOOK1(IGaben, EatYams, SH_NOATTRIB, 0, int, int); -} diff --git a/sourcehook/test/testbail2.cpp b/sourcehook/test/testbail2.cpp deleted file mode 100644 index d3f7f28..0000000 --- a/sourcehook/test/testbail2.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// TESTBAIL -// Different compilation unit - -#include "sourcehook.h" -#include "sourcehook_test.h" -#include "testbail.h" - - -int EatYams_Handler2(int a) -{ - ADD_STATE(State_EatYams_Handler2_Called(a)); - RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, 6, &IGaben::EatYams, (0xBEEF)); -} - -int EatYams_Handler3(int a) -{ - ADD_STATE(State_EatYams_Handler3_Called(a)); - RETURN_META_VALUE(MRES_IGNORED, 0); -} - -namespace N_TestBail -{ - bool TestBail2(std::string &error) - { - g_PLID = 2; - - SH_ADD_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler2), false); - SH_ADD_HOOK(IGaben, EatYams, g_Gabgab, SH_STATIC(EatYams_Handler3), false); - - int ret = g_Gabgab->EatYams(0xDEAD); - - CHECK_COND(ret == 6, "Part 2.1"); - - return true; - } -} diff --git a/sourcehook/test/testevents.h b/sourcehook/test/testevents.h deleted file mode 100644 index ef7c891..0000000 --- a/sourcehook/test/testevents.h +++ /dev/null @@ -1,153 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -#ifndef __TESTEVENTS_H__ -#define __TESTEVENTS_H__ - -#include -#include -#include -#include -#include - -extern bool g_Verbose; - -struct State -{ - virtual ~State() - { - - } - - virtual bool IsEqual(State *other) - { - return (typeid(other) == typeid(this)) ? true : false; - } - - virtual void Dump() = 0; -}; - -typedef std::list StateList; -namespace -{ - void DumpStates(StateList *sl) - { - for (StateList::iterator iter = sl->begin(); iter != sl->end(); ++iter) - (*iter)->Dump(); - } - - bool StatesOk(StateList *sl, ...) - { - StateList requiredstates; - va_list argptr; - va_start(argptr, sl); - while (true) - { - State *cs = va_arg(argptr, State*); - if (!cs) - break; - requiredstates.push_back(cs); - } - va_end(argptr); - - if (requiredstates.size() != sl->size()) - { - if (g_Verbose) - { - std::cout << std::endl << "FAIL: Should be:" << std::endl; - DumpStates(&requiredstates); - std::cout << std::endl << "FAIL: Is:" << std::endl; - DumpStates(sl); - } - - for (StateList::iterator iter = requiredstates.begin(); iter != requiredstates.end(); ++iter) - delete *iter; - for (StateList::iterator iter = sl->begin(); iter != sl->end(); ++iter) - delete *iter; - sl->clear(); - return false; - } - - bool ok = true; - StateList::iterator req_iter = requiredstates.begin(); - for (StateList::iterator o_iter = sl->begin(); o_iter != sl->end(); ++o_iter, ++req_iter) - { - if (!(*o_iter)->IsEqual(*req_iter)) - { - ok = false; - break; - } - } - - for (StateList::iterator iter = requiredstates.begin(); iter != requiredstates.end(); ++iter) - delete *iter; - for (StateList::iterator iter = sl->begin(); iter != sl->end(); ++iter) - delete *iter; - sl->clear(); - - return ok; - } -} - -#define ADD_STATE(name) g_States.push_back(new name) -#define ADD_STATE_PTR(statesptr, name) statesptr->push_back(new name) - -#define CHECK_STATES(mwah, myerr) if (!StatesOk mwah) { error=myerr; return false; } else if (g_Verbose) { std::cout << "No error: " << myerr << std::endl; } - -#define MAKE_STATE(name) struct name : State { \ - virtual void Dump() { \ - std::cout << " " << #name << std::endl; } \ - }; - -#define MAKE_STATE_1(name, p1_type) struct name : State { \ - p1_type m_Param1; \ - name(p1_type param1) : m_Param1(param1) {} \ - virtual bool IsEqual(State *other) { \ - name *other2 = dynamic_cast(other); \ - if (!other2) \ - return false; \ - return other2->m_Param1 == m_Param1;\ - } \ - virtual void Dump() { \ - std::cout << " " << #name << "; Param1=" << m_Param1 << std::endl; } \ - } - -#define MAKE_STATE_2(name, p1_type, p2_type) struct name : State { \ - p1_type m_Param1; \ - p2_type m_Param2; \ - name(p1_type param1, p2_type param2) : m_Param1(param1), m_Param2(param2) {} \ - virtual bool IsEqual(State *other) { \ - name *other2 = dynamic_cast(other); \ - if (!other2) \ - return false; \ - return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2;\ - } \ - virtual void Dump() { \ - std::cout << " " << #name << "; Param1=" << m_Param1 << "; Param2=" << m_Param2 << std::endl; } \ - } - -#define MAKE_STATE_3(name, p1_type, p2_type, p3_type) struct name : State { \ - p1_type m_Param1; \ - p2_type m_Param2; \ - p3_type m_Param3; \ - name(p1_type param1, p2_type param2, p3_type param3) : m_Param1(param1), m_Param2(param2), m_Param3(param3) {} \ - virtual bool IsEqual(State *other) { \ - name *other2 = dynamic_cast(other); \ - if (!other2) \ - return false; \ - return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2 && other2->m_Param3 == m_Param3;\ - } \ - virtual void Dump() { \ - std::cout << " " << #name << "; Param1=" << m_Param1 << "; Param2=" << m_Param2 << "; Param3=" << m_Param3 << std::endl; } \ - } - -#define CHECK_COND(c, err) if (!(c)) { error = err; return false; } - -#endif diff --git a/sourcehook/test/testlist.cpp b/sourcehook/test/testlist.cpp deleted file mode 100644 index bbaa4d3..0000000 --- a/sourcehook/test/testlist.cpp +++ /dev/null @@ -1,282 +0,0 @@ -#include -#include "sh_list.h" -#include "sh_stack.h" -#include "sh_tinyhash.h" -#include "sh_vector.h" -#include "testevents.h" - -// TEST LIST -// Tests sh_list, sh_tinyhash, sh_vector - -// :TODO: vector test, list insert test - -namespace -{ - struct Hmm - { - Hmm *m_This; - int m_Int; - Hmm(const Hmm &other) : m_Int(other.m_Int) - { - m_This = this; - } - Hmm(int i) : m_Int(i) - { - m_This = this; - } - Hmm() : m_Int(0) - { - m_This = this; - } - void operator = (const Hmm &other) - { - m_Int = other.m_Int; - } - operator int () const - { - return m_Int; - } - }; - - #define LIST_THIS_CHECK(lst, err) \ - for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) \ - CHECK_COND(&(*iter) == iter->m_This, err); - - bool DoTestList(std::string &error) - { - typedef SourceHook::List ListType; - ListType lst; - - CHECK_COND(lst.empty(), "Part1"); - - for (int i = 1; i <= 100; ++i) - lst.push_back(i); - - LIST_THIS_CHECK(lst, "PartA1"); - - CHECK_COND(!lst.empty(), "Part2"); - - lst.clear(); - - CHECK_COND(lst.empty(), "Part3"); - - for (int i = 1; i <= 100; ++i) - lst.push_back(i); - - CHECK_COND(lst.back() == 100, "Part4"); - LIST_THIS_CHECK(lst, "PartA2"); - - int ver = 1; - for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) - CHECK_COND(*iter == ver++, "Part5"); - - CHECK_COND(ver == 101, "Part 6"); - - ListType::iterator iter50 = lst.find(50); - CHECK_COND(*iter50 == 50, "Part7"); - - iter50 = lst.erase(iter50); - CHECK_COND(*iter50 == 51, "Part8"); - CHECK_COND(*--iter50 == 49, "Part8.2"); - - lst.remove(80); - - ver = 1; - for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) - { - CHECK_COND(*iter == ver++, "Part9"); - if (ver == 50 || ver == 80) - ++ver; - } - CHECK_COND(ver == 101, "Part10"); - LIST_THIS_CHECK(lst, "PartA3"); - - ListType lst2; - lst = lst2; - CHECK_COND(lst.empty(), "Part11"); - - for (int i = 1; i <= 100; ++i) - lst.push_back(i); - lst2 = lst; - CHECK_COND(lst2.size() == 100, "Part11.2"); - - LIST_THIS_CHECK(lst, "PartA4"); - LIST_THIS_CHECK(lst2, "PartA5"); - - ver = 1; - for (ListType::iterator iter = lst2.begin(); iter != lst2.end(); ++iter) - CHECK_COND(*iter == ver++, "Part12"); - - lst.clear(); - for (int i = 401; i <= 500; ++i) - lst.push_back(i); - lst = lst2; - CHECK_COND(lst2.size() == 100, "Part13"); - - ver = 1; - for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) - CHECK_COND(*iter == ver++, "Part14"); - - LIST_THIS_CHECK(lst, "PartA6"); - LIST_THIS_CHECK(lst2, "PartA7"); - - return true; - } - - bool DoTestTinyHash(std::string &error) - { - const int mymax = 5000; - - typedef SourceHook::THash HashType; - HashType hash; - - for (int i = 1; i <= mymax; ++i) - hash[i] = i + 5000; - - for (int i = 1; i <= mymax; ++i) - CHECK_COND(hash[i] == i + 5000, "Part1"); - - // Find - int ver = 1; - HashType::iterator iter; - for (iter = hash.begin(); iter != hash.end(); ++iter) - CHECK_COND(iter->key == ver && iter->val == (ver++) + 5000, "Part2"); - - CHECK_COND(ver == mymax+1, "Part2.1"); - - iter = hash.find(300); - CHECK_COND(iter != hash.end() && iter->val == 300+5000, "Part3.1"); - iter = hash.find(mymax+200); - CHECK_COND(iter == hash.end(), "Part3.2"); - - HashType hash2; - for (int i = 1; i <= mymax; ++i) - hash2[i] = i + 5000; - - hash2.erase(mymax - 100); - CHECK_COND(hash2.find(mymax - 101) != hash2.end(), "Part 4.1"); - CHECK_COND(hash2.find(mymax - 99) != hash2.end(), "Part 4.2"); - CHECK_COND(hash2.find(mymax - 100) == hash2.end(), "Part 4.3"); - hash2.erase(mymax - 99); - CHECK_COND(hash2.find(mymax - 101) != hash2.end(), "Part 4.4"); - CHECK_COND(hash2.find(mymax - 99) == hash2.end(), "Part 4.5"); - CHECK_COND(hash2.find(mymax - 100) == hash2.end(), "Part 4.6"); - - return true; - } - - bool DoTestStack(std::string &error) - { - typedef SourceHook::CStack IntStack; - IntStack stk; - int i; - - CHECK_COND(stk.size() == 0 && stk.empty(), "A0"); - - for (i = 0; i < 5000; ++i) - stk.push(i); - - CHECK_COND(stk.front() == 4999, "1"); - CHECK_COND(stk.size() == 5000 && !stk.empty(), "A1"); - - IntStack::iterator iter; - i = 0; - for (iter = stk.begin(); iter != stk.end(); ++iter, ++i) - CHECK_COND(*iter == i, "2"); - - i = 0; - for (iter = stk.begin(); iter != stk.end(); iter++, ++i) - CHECK_COND(*iter == i, "3"); - - --iter; - iter--; - *iter = 'g'+'a'+'b'+'e'+'n'; - stk.pop(); - - CHECK_COND(stk.size() == 4999 && !stk.empty(), "A2"); - CHECK_COND(stk.front() == 'g'+'a'+'b'+'e'+'n', "4"); - - IntStack stk2(stk); - CHECK_COND(stk2.size() == 4999 && !stk2.empty(), "A3"); - - IntStack::iterator iter2 = stk2.begin(); - for (iter = stk.begin(); iter != stk.end(); ++iter, iter2++) - CHECK_COND(*iter == *iter2, "5"); - - while (!stk2.empty()) - stk2.pop(); - CHECK_COND(stk2.size() == 0 && stk2.empty(), "A4"); - stk = stk2; - CHECK_COND(stk.size() == 0 && stk.empty(), "A5"); - - return true; - } - - bool DoTestVec(std::string &error) - { - typedef SourceHook::CVector IntVector; - IntVector vec1; - IntVector::iterator iter; - int i; - - CHECK_COND(vec1.size() == 0 && vec1.empty(), "V1"); - for (i = 0; i < 500; ++i) - vec1.push_back(i); - - CHECK_COND(vec1.size() == 500 && !vec1.empty(), "V2"); - - for (i = 0; i < 500; ++i) - CHECK_COND(vec1[i] == i, "V3"); - - for (i = 0, iter = vec1.begin(); iter != vec1.end(); ++iter, ++i) - CHECK_COND(*iter == i, "V4"); - - vec1.resize(1000); - for (i = 0; i < 500; ++i) - CHECK_COND(vec1[i] == i, "V5.1"); - for (i = 500; i < 1000; ++i) - CHECK_COND(vec1[i] == 0, "V5.2"); - - vec1.resize(200); - for (i = 0; i < 200; ++i) - CHECK_COND(vec1[i] == i, "V6"); - - vec1.resize(500, 0x12345678); - for (i = 0; i < 200; ++i) - CHECK_COND(vec1[i] == i, "V7.1"); - for (i = 200; i < 500; ++i) - CHECK_COND(vec1[i] == 0x12345678, "V7.2"); - - IntVector vec2(vec1); - CHECK_COND(vec2.size() == vec1.size() && vec2.empty() == vec1.empty(), "V8.0"); - for (i = 0; i < 200; ++i) - CHECK_COND(vec2[i] == i, "V8.1"); - for (i = 200; i < 500; ++i) - CHECK_COND(vec2[i] == 0x12345678, "V8.2"); - - - vec1.clear(); - CHECK_COND(vec1.size() == 0 && vec1.empty() && vec1.begin() == vec1.end(), "V9"); - vec2 = vec1; - CHECK_COND(vec2.size() == 0 && vec2.empty() && vec2.begin() == vec2.end(), "V9"); - - return true; - } -} - -bool TestList(std::string &error) -{ - if (!DoTestList(error)) - return false; - - if (!DoTestTinyHash(error)) - return false; - - if (!DoTestStack(error)) - return false; - - if (!DoTestVec(error)) - return false; - - return true; -} diff --git a/sourcehook/test/testmanual.cpp b/sourcehook/test/testmanual.cpp deleted file mode 100644 index ad89f43..0000000 --- a/sourcehook/test/testmanual.cpp +++ /dev/null @@ -1,369 +0,0 @@ -#include -#include "sourcehook.h" -#include "sourcehook_test.h" -#include "testevents.h" - -// TESTMANUAL -// Test manual hooks -// :TODO: test more extensively - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Func1_Called, void*); // param1: This pointer - MAKE_STATE_2(State_Func2_Called, void*, int); // param1: This pointer; param2: parameter - MAKE_STATE_1(State_Func3_Called, void*); // param1: This pointer - MAKE_STATE_2(State_Func4_Called, void*, int); // param1: This pointer; param2: parameter - MAKE_STATE_1(State_Func5_Called, void*); // param1: This pointer - - MAKE_STATE_1(State_Func1H_Called, void*); - MAKE_STATE_2(State_Func2H_Called, void*, int); - MAKE_STATE_1(State_Func3H_Called, void*); - MAKE_STATE_2(State_Func4H_Called, void*, int); - - MAKE_STATE_1(State_Return, short); - - class TheWall - { - public: - virtual void Func1() - { - ADD_STATE(State_Func1_Called(reinterpret_cast(this))); - } - virtual void Func2(int x) - { - ADD_STATE(State_Func2_Called(reinterpret_cast(this), x)); - } - - virtual short Func3() - { - ADD_STATE(State_Func3_Called(reinterpret_cast(this))); - return 3; - } - virtual short Func4(int x) - { - ADD_STATE(State_Func4_Called(reinterpret_cast(this), x)); - return 4; - } - virtual void Func5() - { - ADD_STATE(State_Func5_Called(reinterpret_cast(this))); - } - - }; - // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! - class Whatever : public TheWall - { - }; - - SH_DECL_HOOK0_void(TheWall, Func1, SH_NOATTRIB, 0); - SH_DECL_HOOK1_void(TheWall, Func2, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0(TheWall, Func3, SH_NOATTRIB, 0, short); - SH_DECL_HOOK1(TheWall, Func4, SH_NOATTRIB, 0, short, int); - - SH_DECL_MANUALHOOK0_void(TheWall_Func1, 0, 0, 0); - SH_DECL_MANUALHOOK1_void(TheWall_Func2, 1, 0, 0, int); - SH_DECL_MANUALHOOK0(TheWall_Func3, 2, 0, 0, short); - SH_DECL_MANUALHOOK1(TheWall_Func4, 3, 0, 0, short, int); - - typedef void (SourceHook::EmptyClass::*MFP_Func1)(); - typedef void (SourceHook::EmptyClass::*MFP_Func2)(int); - typedef short (SourceHook::EmptyClass::*MFP_Func3)(); - typedef short (SourceHook::EmptyClass::*MFP_Func4)(int); - - void Handler_Func1() - { - ADD_STATE(State_Func1H_Called(META_IFACEPTR(void))); - } - void Handler_Func2(int x) - { - ADD_STATE(State_Func2H_Called(META_IFACEPTR(void), x)); - RETURN_META_MNEWPARAMS(MRES_IGNORED, TheWall_Func2, (0x87654321)); - } - short Handler_Func3() - { - ADD_STATE(State_Func3H_Called(META_IFACEPTR(void))); - return 0; - } - short Handler_Func4(int x) - { - ADD_STATE(State_Func4H_Called(META_IFACEPTR(void), x)); - - // newparams (recall) using the manual hook declaration! - RETURN_META_VALUE_MNEWPARAMS(MRES_IGNORED, 0, TheWall_Func4, (0x12345678)); - } - - struct AnotherBrick - { - void Handler_Func1() - { - ADD_STATE(State_Func1H_Called(META_IFACEPTR(void))); - RETURN_META(MRES_SUPERCEDE); - } - }; -} - -bool TestManual(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - Whatever inst; - TheWall *p = &inst; - - // 1) - // Call each function - p->Func1(); - p->Func2(200); - ADD_STATE(State_Return(p->Func3())); - ADD_STATE(State_Return(p->Func4(400))); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func2_Called(p, 200), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4_Called(p, 400), - new State_Return(4), - NULL), "Part 1"); - - // 1.1) - // Now call each function through the manual call class, using the hook decl and manually - SH_MCALL(p, TheWall_Func1)(); - SH_MCALL2(p, MFP_Func1(), 0, 0, 0)(); - SH_MCALL(p, TheWall_Func2)(200); - SH_MCALL2(p, MFP_Func2(), 1, 0, 0)(200); - ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func3)())); - ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func3(), 2, 0, 0)())); - ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func4)(400))); - ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func4(), 3, 0, 0)(400))); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func1_Called(p), - new State_Func2_Called(p, 200), - new State_Func2_Called(p, 200), - new State_Func3_Called(p), - new State_Return(3), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4_Called(p, 400), - new State_Return(4), - new State_Func4_Called(p, 400), - new State_Return(4), - NULL), "Part 1.1"); - - // Compat: really get a manual call class! - SourceHook::ManualCallClass *pCC = SH_GET_MCALLCLASS(p, sizeof(void*)); - SH_MCALL(pCC, TheWall_Func1)(); - SH_MCALL2(pCC, MFP_Func1(), 0, 0, 0)(); - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func1_Called(p), - NULL), "Part 1.2"); - - SH_RELEASE_CALLCLASS(pCC); - - // 2) - // Hook each function normally, call them - SH_ADD_HOOK(TheWall, Func1, p, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(TheWall, Func2, p, SH_STATIC(Handler_Func2), false); - SH_ADD_HOOK(TheWall, Func3, p, SH_STATIC(Handler_Func3), false); - SH_ADD_HOOK(TheWall, Func4, p, SH_STATIC(Handler_Func4), false); - - p->Func1(); - p->Func2(200); - ADD_STATE(State_Return(p->Func3())); - ADD_STATE(State_Return(p->Func4(400))); - - CHECK_STATES((&g_States, - new State_Func1H_Called(p), - new State_Func1_Called(p), - new State_Func2H_Called(p, 200), - new State_Func2_Called(p, 0x87654321), - new State_Func3H_Called(p), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4H_Called(p, 400), - new State_Func4_Called(p, 0x12345678), - new State_Return(4), - NULL), "Part 2"); - - // Call them through the mcallclass - // 2.1) - // Now call each function through the manual call class, using the hook decl and manually - SH_MCALL(p, TheWall_Func1)(); - SH_MCALL2(p, MFP_Func1(), 0, 0, 0)(); - SH_MCALL(p, TheWall_Func2)(200); - SH_MCALL2(p, MFP_Func2(), 1, 0, 0)(200); - ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func3)())); - ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func3(), 2, 0, 0)())); - ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func4)(400))); - ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func4(), 3, 0, 0)(400))); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func1_Called(p), - new State_Func2_Called(p, 200), - new State_Func2_Called(p, 200), - new State_Func3_Called(p), - new State_Return(3), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4_Called(p, 400), - new State_Return(4), - new State_Func4_Called(p, 400), - new State_Return(4), - NULL), "Part 2.1"); - - // Unhook them - SH_REMOVE_HOOK(TheWall, Func1, p, SH_STATIC(Handler_Func1), false); - SH_REMOVE_HOOK(TheWall, Func2, p, SH_STATIC(Handler_Func2), false); - SH_REMOVE_HOOK(TheWall, Func3, p, SH_STATIC(Handler_Func3), false); - SH_REMOVE_HOOK(TheWall, Func4, p, SH_STATIC(Handler_Func4), false); - - // 3) - // Hook each function manually, call them - - SH_ADD_MANUALHOOK(TheWall_Func1, p, SH_STATIC(Handler_Func1), false); - SH_ADD_MANUALHOOK(TheWall_Func2, p, SH_STATIC(Handler_Func2), false); - SH_ADD_MANUALHOOK(TheWall_Func3, p, SH_STATIC(Handler_Func3), false); - SH_ADD_MANUALHOOK(TheWall_Func4, p, SH_STATIC(Handler_Func4), false); - - p->Func1(); - p->Func2(200); - ADD_STATE(State_Return(p->Func3())); - ADD_STATE(State_Return(p->Func4(400))); - - CHECK_STATES((&g_States, - new State_Func1H_Called(p), - new State_Func1_Called(p), - new State_Func2H_Called(p, 200), - new State_Func2_Called(p, 0x87654321), - new State_Func3H_Called(p), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4H_Called(p, 400), - new State_Func4_Called(p, 0x12345678), - new State_Return(4), - NULL), "Part 3"); - - // Now through the mcallclass - - // Call them through the mcallclass - // 3.1) - // Now call each function through the manual call class, using the hook decl and manually - SH_MCALL(p, TheWall_Func1)(); - SH_MCALL2(p, MFP_Func1(), 0, 0, 0)(); - SH_MCALL(p, TheWall_Func2)(200); - SH_MCALL2(p, MFP_Func2(), 1, 0, 0)(200); - ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func3)())); - ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func3(), 2, 0, 0)())); - ADD_STATE(State_Return(SH_MCALL(p, TheWall_Func4)(400))); - ADD_STATE(State_Return(SH_MCALL2(p, MFP_Func4(), 3, 0, 0)(400))); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func1_Called(p), - new State_Func2_Called(p, 200), - new State_Func2_Called(p, 200), - new State_Func3_Called(p), - new State_Return(3), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4_Called(p, 400), - new State_Return(4), - new State_Func4_Called(p, 400), - new State_Return(4), - NULL), "Part 3.1"); - - // Unhook them - SH_REMOVE_MANUALHOOK(TheWall_Func1, p, SH_STATIC(Handler_Func1), false); - SH_REMOVE_MANUALHOOK(TheWall_Func2, p, SH_STATIC(Handler_Func2), false); - SH_REMOVE_MANUALHOOK(TheWall_Func3, p, SH_STATIC(Handler_Func3), false); - SH_REMOVE_MANUALHOOK(TheWall_Func4, p, SH_STATIC(Handler_Func4), false); - - // 4) - // Hook each function manually, then normally, call, unhook - - AnotherBrick handler_inst; - - // Why this? - // 1) tests sh_add_manualhook - // 2) in my tests, the proto of the manual hook was not equal to the proto of the auto hook - // (because there are no attribs for manual hooks). - // sourcehook.cpp did a !strcmp(..), so it assigned a new hook manager even though there - // already was one for this vfnptr. This hook manager stored the pointer of the original - // hook manager's hookfunc as the orig pointer - everything seemingly worked. - // The problem with this is that returning MRES_SUPERCEDE (as AnotherBrick::Handler_Func1 - // does) will supercede the second hook func from being called - thus bypassing the call - // of the auto hook here. - SH_ADD_MANUALHOOK(TheWall_Func1, p, SH_MEMBER(&handler_inst, &AnotherBrick::Handler_Func1), false); - SH_ADD_MANUALHOOK(TheWall_Func2, p, SH_STATIC(Handler_Func2), false); - SH_ADD_MANUALHOOK(TheWall_Func3, p, SH_STATIC(Handler_Func3), false); - SH_ADD_MANUALHOOK(TheWall_Func4, p, SH_STATIC(Handler_Func4), false); - - SH_ADD_HOOK(TheWall, Func1, p, SH_STATIC(Handler_Func1), false); - SH_ADD_HOOK(TheWall, Func2, p, SH_STATIC(Handler_Func2), false); - SH_ADD_HOOK(TheWall, Func3, p, SH_STATIC(Handler_Func3), false); - SH_ADD_HOOK(TheWall, Func4, p, SH_STATIC(Handler_Func4), false); - - p->Func1(); - p->Func2(200); - ADD_STATE(State_Return(p->Func3())); - ADD_STATE(State_Return(p->Func4(400))); - - CHECK_STATES((&g_States, - new State_Func1H_Called(p), - new State_Func1H_Called(p), - //new State_Func1_Called(p), - new State_Func2H_Called(p, 200), - new State_Func2H_Called(p, 0x87654321), - new State_Func2_Called(p, 0x87654321), - new State_Func3H_Called(p), - new State_Func3H_Called(p), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4H_Called(p, 400), - new State_Func4H_Called(p, 0x12345678), - new State_Func4_Called(p, 0x12345678), - new State_Return(4), - NULL), "Part 4"); - - SH_REMOVE_MANUALHOOK(TheWall_Func1, p, SH_MEMBER(&handler_inst, &AnotherBrick::Handler_Func1), false); - SH_REMOVE_MANUALHOOK(TheWall_Func2, p, SH_STATIC(Handler_Func2), false); - SH_REMOVE_MANUALHOOK(TheWall_Func3, p, SH_STATIC(Handler_Func3), false); - SH_REMOVE_MANUALHOOK(TheWall_Func4, p, SH_STATIC(Handler_Func4), false); - - SH_REMOVE_HOOK(TheWall, Func1, p, SH_STATIC(Handler_Func1), false); - SH_REMOVE_HOOK(TheWall, Func2, p, SH_STATIC(Handler_Func2), false); - SH_REMOVE_HOOK(TheWall, Func3, p, SH_STATIC(Handler_Func3), false); - SH_REMOVE_HOOK(TheWall, Func4, p, SH_STATIC(Handler_Func4), false); - - // 5) Reconfigure TheWall_Func1 to actually hook Func5: - SH_MANUALHOOK_RECONFIGURE(TheWall_Func1, 4, 0, 0); - SH_ADD_MANUALHOOK(TheWall_Func1, p, SH_STATIC(Handler_Func1), false); - - p->Func5(); - - CHECK_STATES((&g_States, - new State_Func1H_Called(p), - new State_Func5_Called(p), - NULL), "Part 5"); - - // 6) Test auto-remove on reconfig - SH_MANUALHOOK_RECONFIGURE(TheWall_Func1, 0, 0, 0); - - p->Func1(); - p->Func5(); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func5_Called(p), - NULL), "Part 6"); - - return true; -} diff --git a/sourcehook/test/testmulti.cpp b/sourcehook/test/testmulti.cpp deleted file mode 100644 index af5555c..0000000 --- a/sourcehook/test/testmulti.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include -#include "sourcehook.h" -#include "sourcehook_test.h" -#include "testevents.h" - -// This should probably be done the other way round! -#ifdef __linux__ -#define _snprintf snprintf -#endif - -namespace -{ - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - unsigned int g_callcount[10]; - - class VMultiTest - { - public: - VMultiTest(unsigned int index) : m_idx(index) - { - } - public: - virtual void HookTarget() - { - } - virtual void Notify() - { - g_callcount[this->m_idx]++; - } - private: - unsigned int m_idx; - }; - - void HookFunction() - { - VMultiTest *pv = META_IFACEPTR(VMultiTest); - pv->Notify(); - } - - SH_DECL_HOOK0_void(VMultiTest, HookTarget, SH_NOATTRIB, false); -}; - -bool TestMulti(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - VMultiTest **pv = new VMultiTest *[10]; - for (unsigned int i=0; i<10; i++) - pv[i] = new VMultiTest(i); - - - for (unsigned int i=0; i<10; i++) - SH_ADD_HOOK(VMultiTest, HookTarget, pv[i], SH_STATIC(HookFunction), false); - - pv[0]->HookTarget(); - - if (g_callcount[0] != 1) - { - error.assign("g_callcount[0] != 0"); - return false; - } - - for (unsigned int i=1; i<10; i++) - { - if (g_callcount[i]) - { - error.assign("g_callcount[n] != 0"); - return false; - } - } - - SH_REMOVE_HOOK(VMultiTest, HookTarget, pv[0], SH_STATIC(HookFunction), false); - - for (unsigned int i=1; i<10; i++) - pv[i]->HookTarget(); - - if (g_callcount[0] != 1) - { - error.assign("g_callcount[0] != 0"); - return false; - } - - for (unsigned int i=1; i<10; i++) - { - if (g_callcount[i] != 1) - { - char err[256]; - _snprintf(err, sizeof(err)-1, "g_callcount[%d] != 1", i); - error.assign(err); - return false; - } - } - - for (unsigned int i=1; i<10; i++) - { - SH_REMOVE_HOOK(VMultiTest, HookTarget, pv[1], SH_STATIC(HookFunction), false); - delete pv[i]; - } - - delete [] pv; - - return true; -} diff --git a/sourcehook/test/testrecall.cpp b/sourcehook/test/testrecall.cpp deleted file mode 100644 index 5277b17..0000000 --- a/sourcehook/test/testrecall.cpp +++ /dev/null @@ -1,231 +0,0 @@ -#include -#include "sourcehook.h" -#include "sourcehook_test.h" -#include "testevents.h" - -// TESTRECALL -// Test modifying parameters from hook handlers - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Func1, int); - MAKE_STATE_1(State_H1_Func1, int); - MAKE_STATE_1(State_H2_Func1, int); - MAKE_STATE_2(State_HP_Func1, int, void*); - - MAKE_STATE_1(State_Func2, int); - MAKE_STATE_1(State_H1_Func2, int); - MAKE_STATE_1(State_H2_Func2, int); - MAKE_STATE_2(State_HP_Func2, int, int); - - MAKE_STATE_2(State_Func22, int, int); - MAKE_STATE_2(State_H1_Func22, int, int); - MAKE_STATE_2(State_HP1_Func22, int, int); - MAKE_STATE_2(State_HP2_Func22, int, int); - - struct Test - { - virtual void Func1(int a) - { - ADD_STATE(State_Func1(a)); - } - - virtual int Func2(int a) - { - ADD_STATE(State_Func2(a)); - return 1000; - } - - // Overloaded version - virtual int Func2(int a, int b) - { - ADD_STATE(State_Func22(a, b)); - return 0xDEADFC; - } - }; - - // GCC's optimizer is too good. I had to add this in order to make it execute a virtual table lookup! - struct Whatever : Test - { - }; - - void Handler1_Func1(int a) - { - ADD_STATE(State_H1_Func1(a)); - RETURN_META_NEWPARAMS(MRES_IGNORED, &Test::Func1, (5)); - } - void Handler2_Func1(int a) - { - ADD_STATE(State_H2_Func1(a)); - RETURN_META_NEWPARAMS(MRES_IGNORED, &Test::Func1, (a - 5)); - } - void HandlerPost_Func1(int a) - { - ADD_STATE(State_HP_Func1(a, META_IFACEPTR(void))); - } - - - int Handler1_Func2(int a) - { - ADD_STATE(State_H1_Func2(a)); - // Pfeeehhh, ugly, I know, but I had to test it :) - RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, 500, - static_cast(&Test::Func2), (a - 10)); - } - - int Handler2_Func2(int a) - { - ADD_STATE(State_H2_Func2(a)); - RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, 0, - static_cast(&Test::Func2), (a - 10)); - } - - int HandlerPost_Func2(int a) - { - ADD_STATE(State_HP_Func2(a, META_RESULT_ORIG_RET(int))); - RETURN_META_VALUE(MRES_IGNORED, 0); - } - - int Handler1_Func22(int a, int b) - { - ADD_STATE(State_H1_Func22(a, b)); - RETURN_META_VALUE(MRES_IGNORED, 0); - } - - int HandlerPost1_Func22(int a, int b) - { - ADD_STATE(State_HP1_Func22(a, b)); - RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, 0, static_cast(&Test::Func2), (1, 2)); - } - - int HandlerPost1A_Func22(int a, int b) - { - ADD_STATE(State_HP1_Func22(a, b)); - RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, 0, static_cast(&Test::Func2), (1, 2)); - } - - int HandlerPost2_Func22(int a, int b) - { - ADD_STATE(State_HP2_Func22(a, b)); - RETURN_META_VALUE(MRES_IGNORED, 0); - } - - SH_DECL_HOOK1_void(Test, Func1, SH_NOATTRIB, 0, int); - SH_DECL_HOOK1(Test, Func2, SH_NOATTRIB, 0, int, int); - SH_DECL_HOOK2(Test, Func2, SH_NOATTRIB, 1, int, int, int); -} - -bool TestRecall(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - Whatever inst; - Test *ptr = &inst; - - SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler1_Func1), false); - SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); - SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(HandlerPost_Func1), true); - - ptr->Func1(77); - - CHECK_STATES((&g_States, - new State_H1_Func1(77), - new State_H2_Func1(5), - new State_Func1(0), - new State_HP_Func1(0, ptr), - NULL), "Part 1"); - - SH_REMOVE_HOOK(Test, Func1, ptr, SH_STATIC(Handler1_Func1), false); - SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); - SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); - SH_ADD_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); - - ptr->Func1(77); - - CHECK_STATES((&g_States, - new State_H2_Func1(77), - new State_H2_Func1(72), - new State_H2_Func1(67), - new State_H2_Func1(62), - new State_Func1(57), - new State_HP_Func1(57, ptr), - NULL), "Part 2"); - - SH_REMOVE_HOOK(Test, Func1, ptr, SH_STATIC(Handler2_Func1), false); - SH_REMOVE_HOOK(Test, Func1, ptr, SH_STATIC(HandlerPost_Func1), true); - - ptr->Func1(77); - - CHECK_STATES((&g_States, - new State_Func1(77), - NULL), "Part 3"); - - // Func2 - - SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(Handler1_Func2), false); - SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost_Func2), true); - - int a = ptr->Func2(77); - CHECK_STATES((&g_States, - new State_H1_Func2(77), - new State_Func2(67), - new State_HP_Func2(67, 1000), // 1000 because it's the ORIG_RET - NULL), "Part 4"); - - CHECK_COND(a == 500, "Part 4.1"); - - // Func2, with other handler - SH_REMOVE_HOOK(Test, Func2, ptr, SH_STATIC(Handler1_Func2), false); - SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(Handler2_Func2), false); - - a = ptr->Func2(77); - CHECK_STATES((&g_States, - new State_H2_Func2(77), - new State_Func2(67), - new State_HP_Func2(67, 1000), // 1000 because it's the ORIG_RET - NULL), "Part 4.2"); - - CHECK_COND(a == 1000, "Part 4.2.1"); // Should return 1000 as well. - - // Func22 -> post recalls - - // 1) WITH OVERRIDE - - SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(Handler1_Func22), false); - SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost1A_Func22), true); - SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost2_Func22), true); - - a = ptr->Func2(10, 11); - CHECK_STATES((&g_States, - new State_H1_Func22(10, 11), - new State_Func22(10, 11), - new State_HP1_Func22(10, 11), - new State_HP2_Func22(1, 2), - NULL), "Part 5"); - - CHECK_COND(a == 0, "Part 5.1"); - - // 2) WITH IGNORE - SH_REMOVE_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost1A_Func22), true); - SH_REMOVE_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost2_Func22), true); - - SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost1_Func22), true); - SH_ADD_HOOK(Test, Func2, ptr, SH_STATIC(HandlerPost2_Func22), true); - - a = ptr->Func2(10, 11); - CHECK_STATES((&g_States, - new State_H1_Func22(10, 11), - new State_Func22(10, 11), - new State_HP1_Func22(10, 11), - new State_HP2_Func22(1, 2), - NULL), "Part 5"); - - CHECK_COND(a == 0xDEADFC, "Part 5.1"); - - return true; -} diff --git a/sourcehook/test/testreentr.cpp b/sourcehook/test/testreentr.cpp deleted file mode 100644 index e0b6974..0000000 --- a/sourcehook/test/testreentr.cpp +++ /dev/null @@ -1,609 +0,0 @@ -// Reentrancy test -// = calling hooks from hook handlers, etc - -#include -#include "sourcehook_test.h" -#include "testevents.h" - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - struct C1; - struct C2; - struct C3; - struct C4; - struct C5; - struct C6; - struct C7; - struct C8; - - C1 *g_pC1; - C2 *g_pC2; - C3 *g_pC3; - C4 *g_pC4; - C5 *g_pC5; - C6 *g_pC6; - C7 *g_pC7; - C8 *g_pC8; - - // param1: This pointer - MAKE_STATE_1(State_C1_F, C1*); - MAKE_STATE_1(State_C2_F, C2*); - MAKE_STATE_1(State_C3_F, C3*); - MAKE_STATE_1(State_C4_F, C4*); - MAKE_STATE_1(State_C5_F, C5*); - MAKE_STATE_1(State_C6_F, C6*); - MAKE_STATE_1(State_C7_F, C7*); - MAKE_STATE_1(State_C8_F, C8*); - - MAKE_STATE_1(State_C1_G, C1*); - MAKE_STATE_1(State_C2_G, C2*); - MAKE_STATE_1(State_C3_G, C3*); - MAKE_STATE_1(State_C4_G, C4*); - MAKE_STATE_1(State_C5_G, C5*); - MAKE_STATE_1(State_C6_G, C6*); - MAKE_STATE_1(State_C7_G, C7*); - MAKE_STATE_1(State_C8_G, C8*); - - MAKE_STATE_1(State_H_C1_F, C1*); - MAKE_STATE_1(State_H_C2_F, C2*); - MAKE_STATE_1(State_H_C3_F, C3*); - MAKE_STATE_1(State_H_C4_F, C4*); - MAKE_STATE_1(State_H_C5_F, C5*); - MAKE_STATE_1(State_H_C6_F, C6*); - MAKE_STATE_1(State_H_C7_F, C7*); - MAKE_STATE_1(State_H_C8_F, C8*); - - MAKE_STATE_1(State_H_C1_G, C1*); - MAKE_STATE_1(State_H_C2_G, C2*); - MAKE_STATE_1(State_H_C3_G, C3*); - MAKE_STATE_1(State_H_C4_G, C4*); - MAKE_STATE_1(State_H_C5_G, C5*); - MAKE_STATE_1(State_H_C6_G, C6*); - MAKE_STATE_1(State_H_C7_G, C7*); - MAKE_STATE_1(State_H_C8_G, C8*); - - MAKE_STATE_1(State_H2_C4_G, C4*); - - int g_TestID; - - struct C1 - { - virtual void F() - { - ADD_STATE(State_C1_F(this)); - } - virtual int G() - { - ADD_STATE(State_C1_G(this)); - return 1; - } - }; - - struct C2 - { - virtual void F() - { - ADD_STATE(State_C2_F(this)); - } - virtual int G() - { - ADD_STATE(State_C2_G(this)); - return 2; - } - }; - struct C3 - { - virtual void F() - { - ADD_STATE(State_C3_F(this)); - } - virtual int G() - { - ADD_STATE(State_C3_G(this)); - return 3; - } - }; - struct C4 - { - virtual void F() - { - ADD_STATE(State_C4_F(this)); - } - virtual int G() - { - ADD_STATE(State_C4_G(this)); - return 4; - } - }; - struct C5 - { - virtual void F() - { - ADD_STATE(State_C5_F(this)); - } - virtual int G() - { - ADD_STATE(State_C5_G(this)); - return 5; - } - }; - struct C6 - { - virtual void F() - { - ADD_STATE(State_C6_F(this)); - } - virtual int G() - { - ADD_STATE(State_C6_G(this)); - return 6; - } - }; - struct C7 - { - virtual void F() - { - ADD_STATE(State_C7_F(this)); - } - virtual int G() - { - ADD_STATE(State_C7_G(this)); - return 7; - } - }; - struct C8 - { - virtual void F() - { - ADD_STATE(State_C8_F(this)); - } - virtual int G() - { - ADD_STATE(State_C8_G(this)); - return 8; - } - }; - - struct C1_Derived : public C1 {}; - struct C2_Derived : public C2 {}; - struct C3_Derived : public C3 {}; - struct C4_Derived : public C4 {}; - struct C5_Derived : public C5 {}; - struct C6_Derived : public C6 {}; - struct C7_Derived : public C7 {}; - struct C8_Derived : public C8 {}; - - SH_DECL_HOOK0_void(C1, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C1, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C2, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C2, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C3, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C3, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C4, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C4, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C5, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C5, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C6, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C6, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C7, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C7, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C8, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C8, G, SH_NOATTRIB, 0, int); - - void Handler_C1_F() - { - ADD_STATE(State_H_C1_F(META_IFACEPTR(C1))); - g_pC1->G(); - } - int Handler_C1_G() - { - ADD_STATE(State_H_C1_G(META_IFACEPTR(C1))); - g_pC2->F(); - return 1; - } - void Handler_C2_F() - { - ADD_STATE(State_H_C2_F(META_IFACEPTR(C2))); - g_pC2->G(); - } - int Handler_C2_G() - { - ADD_STATE(State_H_C2_G(META_IFACEPTR(C2))); - g_pC3->F(); - return 2; - } - void Handler_C3_F() - { - ADD_STATE(State_H_C3_F(META_IFACEPTR(C3))); - g_pC3->G(); - } - int Handler_C3_G() - { - ADD_STATE(State_H_C3_G(META_IFACEPTR(C3))); - g_pC4->F(); - return 3; - } - void Handler_C4_F() - { - ADD_STATE(State_H_C4_F(META_IFACEPTR(C4))); - g_pC4->G(); - } - int Handler_C4_G() - { - ADD_STATE(State_H_C4_G(META_IFACEPTR(C4))); - g_pC5->F(); - return 4; - } - int Handler2_C4_G() - { - ADD_STATE(State_H2_C4_G(META_IFACEPTR(C4))); - return 4; - } - void Handler_C5_F() - { - ADD_STATE(State_H_C5_F(META_IFACEPTR(C5))); - g_pC5->G(); - } - int Handler_C5_G() - { - ADD_STATE(State_H_C5_G(META_IFACEPTR(C5))); - g_pC6->F(); - return 5; - } - void Handler_C6_F() - { - ADD_STATE(State_H_C6_F(META_IFACEPTR(C6))); - g_pC6->G(); - } - int Handler_C6_G() - { - ADD_STATE(State_H_C6_G(META_IFACEPTR(C6))); - g_pC7->F(); - return 6; - } - void Handler_C7_F() - { - if (g_TestID == 1 || g_TestID == 2) - SH_REMOVE_HOOK(C4, G, g_pC4, SH_STATIC(Handler2_C4_G), false); - if (g_TestID == 2) - SH_REMOVE_HOOK(C4, G, g_pC4, SH_STATIC(Handler_C4_G), false); - - ADD_STATE(State_H_C7_F(META_IFACEPTR(C7))); - g_pC7->G(); - } - int Handler_C7_G() - { - ADD_STATE(State_H_C7_G(META_IFACEPTR(C7))); - g_pC8->F(); - return 7; - } - void Handler_C8_F() - { - ADD_STATE(State_H_C8_F(META_IFACEPTR(C8))); - g_pC8->G(); - } - int Handler_C8_G() - { - ADD_STATE(State_H_C8_G(META_IFACEPTR(C8))); - return 8; - } - - C1_Derived g_C1; - C2_Derived g_C2; - C3_Derived g_C3; - C4_Derived g_C4; - C5_Derived g_C5; - C6_Derived g_C6; - C7_Derived g_C7; - C8_Derived g_C8; -} - -bool TestReentr(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - g_pC1 = &g_C1; - g_pC2 = &g_C2; - g_pC3 = &g_C3; - g_pC4 = &g_C4; - g_pC5 = &g_C5; - g_pC6 = &g_C6; - g_pC7 = &g_C7; - g_pC8 = &g_C8; - - SH_ADD_HOOK(C1, F, g_pC1, SH_STATIC(Handler_C1_F), false); - SH_ADD_HOOK(C1, G, g_pC1, SH_STATIC(Handler_C1_G), false); - SH_ADD_HOOK(C2, F, g_pC2, SH_STATIC(Handler_C2_F), false); - SH_ADD_HOOK(C2, G, g_pC2, SH_STATIC(Handler_C2_G), false); - SH_ADD_HOOK(C3, F, g_pC3, SH_STATIC(Handler_C3_F), false); - SH_ADD_HOOK(C3, G, g_pC3, SH_STATIC(Handler_C3_G), false); - SH_ADD_HOOK(C4, F, g_pC4, SH_STATIC(Handler_C4_F), false); - SH_ADD_HOOK(C4, G, g_pC4, SH_STATIC(Handler_C4_G), false); - SH_ADD_HOOK(C5, F, g_pC5, SH_STATIC(Handler_C5_F), false); - SH_ADD_HOOK(C5, G, g_pC5, SH_STATIC(Handler_C5_G), false); - SH_ADD_HOOK(C6, F, g_pC6, SH_STATIC(Handler_C6_F), false); - SH_ADD_HOOK(C6, G, g_pC6, SH_STATIC(Handler_C6_G), false); - SH_ADD_HOOK(C7, F, g_pC7, SH_STATIC(Handler_C7_F), false); - SH_ADD_HOOK(C7, G, g_pC7, SH_STATIC(Handler_C7_G), false); - SH_ADD_HOOK(C8, F, g_pC8, SH_STATIC(Handler_C8_F), false); - SH_ADD_HOOK(C8, G, g_pC8, SH_STATIC(Handler_C8_G), false); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "1"); - - - SH_ADD_HOOK(C4, G, g_pC4, SH_STATIC(Handler2_C4_G), false); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_H2_C4_G(g_pC4), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "2"); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_H2_C4_G(g_pC4), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "3"); - - g_TestID = 1; - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "4"); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "5"); - - - - SH_ADD_HOOK(C4, G, g_pC4, SH_STATIC(Handler2_C4_G), false); - - g_TestID = 2; - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "6"); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "7"); - - SH_REMOVE_HOOK(C1, F, g_pC1, SH_STATIC(Handler_C1_F), false); - SH_REMOVE_HOOK(C1, G, g_pC1, SH_STATIC(Handler_C1_G), false); - SH_REMOVE_HOOK(C2, F, g_pC2, SH_STATIC(Handler_C2_F), false); - SH_REMOVE_HOOK(C2, G, g_pC2, SH_STATIC(Handler_C2_G), false); - SH_REMOVE_HOOK(C3, F, g_pC3, SH_STATIC(Handler_C3_F), false); - SH_REMOVE_HOOK(C3, G, g_pC3, SH_STATIC(Handler_C3_G), false); - SH_REMOVE_HOOK(C4, F, g_pC4, SH_STATIC(Handler_C4_F), false); - SH_REMOVE_HOOK(C4, G, g_pC4, SH_STATIC(Handler_C4_G), false); - SH_REMOVE_HOOK(C5, F, g_pC5, SH_STATIC(Handler_C5_F), false); - SH_REMOVE_HOOK(C5, G, g_pC5, SH_STATIC(Handler_C5_G), false); - SH_REMOVE_HOOK(C6, F, g_pC6, SH_STATIC(Handler_C6_F), false); - SH_REMOVE_HOOK(C6, G, g_pC6, SH_STATIC(Handler_C6_G), false); - SH_REMOVE_HOOK(C7, F, g_pC7, SH_STATIC(Handler_C7_F), false); - SH_REMOVE_HOOK(C7, G, g_pC7, SH_STATIC(Handler_C7_G), false); - SH_REMOVE_HOOK(C8, F, g_pC8, SH_STATIC(Handler_C8_F), false); - SH_REMOVE_HOOK(C8, G, g_pC8, SH_STATIC(Handler_C8_G), false); - - return true; -} diff --git a/sourcehook/test/testref.cpp b/sourcehook/test/testref.cpp deleted file mode 100644 index d718f3a..0000000 --- a/sourcehook/test/testref.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "testevents.h" -#include "sourcehook_test.h" - -// References and private copy constructors and stuff like that! - -/* -BAILOPAN, 29.04.2006 21:51 : -onoto-san, interesting error from VS -we have this function: -void GabHaben(ISomething &sth); - -SomethingDerived sth; -and SH_CALL(cc, &WHAT::GabHaben)(sth); -"No copy constructor available for class 'SomethingDerived'" -*/ - - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Result, int); - MAKE_STATE_1(State_Result_InHook, int); - - class CBase - { - // Private copy constructor! - CBase(CBase &other) - { - } - public: - CBase() - { - } - - virtual int Func() - { - return 0; - } - }; - - class CDerived : public CBase - { - virtual int Func() - { - return 10; - } - }; - - // Complicated derived shit ! - class COtherWeirdBase - { - int member; - }; - class CDerived2 : private COtherWeirdBase, public CBase - { - int m_Return; - public: - CDerived2(int a) : m_Return(a) - { - } - - virtual int Func() - { - return m_Return; - } - }; - - class CHello - { - public: - virtual int Func(CBase &sth) - { - return sth.Func(); - } - }; - class CHelloDerived : public CHello { }; - - class CHook - { - public: - virtual int Func(CBase &sth) - { - ADD_STATE(State_Result_InHook(sth.Func())); - RETURN_META_VALUE(MRES_SUPERCEDE, 20); - } - }; - SH_DECL_HOOK1(CHello, Func, SH_NOATTRIB, 0, int, CBase&); -} - - -bool TestRef(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1; - - CBase base; - CDerived der; - CDerived2 der2(11); - CDerived2 der3(12); - CHelloDerived hello; - CHello *pHello = &hello; - CHook hook; - - ADD_STATE(State_Result(pHello->Func(base))); - ADD_STATE(State_Result(pHello->Func(der))); - ADD_STATE(State_Result(pHello->Func(der2))); - ADD_STATE(State_Result(pHello->Func(der3))); - - CHECK_STATES((&g_States, - new State_Result(0), - new State_Result(10), - new State_Result(11), - new State_Result(12), - NULL), "Part 1"); - - ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(base))); - ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der))); - ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der2))); - ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der3))); - - CHECK_STATES((&g_States, - new State_Result(0), - new State_Result(10), - new State_Result(11), - new State_Result(12), - NULL), "Part 2"); - - SH_ADD_HOOK(CHello, Func, &hello, SH_MEMBER(&hook, &CHook::Func), false); - - ADD_STATE(State_Result(pHello->Func(base))); - ADD_STATE(State_Result(pHello->Func(der))); - ADD_STATE(State_Result(pHello->Func(der2))); - ADD_STATE(State_Result(pHello->Func(der3))); - - CHECK_STATES((&g_States, - new State_Result_InHook(0), - new State_Result(20), - new State_Result_InHook(10), - new State_Result(20), - new State_Result_InHook(11), - new State_Result(20), - new State_Result_InHook(12), - new State_Result(20), - NULL), "Part 3"); - - ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(base))); - ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der))); - ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der2))); - ADD_STATE(State_Result(SH_CALL(pHello, &CHello::Func)(der3))); - - CHECK_STATES((&g_States, - new State_Result(0), - new State_Result(10), - new State_Result(11), - new State_Result(12), - NULL), "Part 4"); - - return true; -} diff --git a/sourcehook/test/testrefret.cpp b/sourcehook/test/testrefret.cpp deleted file mode 100644 index d4c19d8..0000000 --- a/sourcehook/test/testrefret.cpp +++ /dev/null @@ -1,202 +0,0 @@ -#include "testevents.h" -#include "sourcehook_test.h" - -// Tests support for functions which return references - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Func1_Pre1, int*); // p1: the ref Func1_Pre1 is going to return - MAKE_STATE_3(State_Func1_Pre2, META_RES, int*, int*); // p1: current status - // p2: override ret - // p3: what this handler is going to supercede with - MAKE_STATE_1(State_Func1, int*); // p1: the ref Func1 is going to return - MAKE_STATE_2(State_Func1_Post1, int*, int*); // p1: orig_ret; p2: override_ret - MAKE_STATE_1(State_Func1_Post2, int*); // p1: what it's going to return - MAKE_STATE_1(State_Func1_Ret, int*); // p1: the ref it returned - - - MAKE_STATE_2(State_Func2_Pre1, int, const int*); // p1: func's p1; p2: what it's going to ret - MAKE_STATE_2(State_Func2, int, const int*); // p1: func's p1; p2: what it's going to ret - MAKE_STATE_3(State_Func2_Post1, int, const int*, const int*); // p1: func's p1; p2: orig ret; p3: override ret - MAKE_STATE_1(State_Func2_Ret, const int*); // p1: ret - - int g_Var; - - class Test - { - public: - int m_Var1; - int m_Var2; - - Test() : m_Var1(87) - { - } - - virtual int& Func1() - { - ADD_STATE(State_Func1(&m_Var1)); - return m_Var1; - } - virtual const int& Func2(int p1) - { - ADD_STATE(State_Func2(p1, &m_Var2)); - m_Var2 = p1; - return m_Var2; - } - }; - - class Whatever : public Test - { - }; - - class CHook - { - public: - int m_Var; - virtual int& Func1_Pre1() - { - ADD_STATE(State_Func1_Pre1(&m_Var)); - RETURN_META_VALUE(MRES_OVERRIDE, m_Var); - } - virtual int &Func1_Pre2() - { - int &overrideret = META_RESULT_OVERRIDE_RET(int&); - overrideret = 1337; - ADD_STATE(State_Func1_Pre2(META_RESULT_STATUS, &overrideret, &g_Var)); - RETURN_META_VALUE(MRES_SUPERCEDE, g_Var); - } - virtual int& Func1_Post1() - { - ADD_STATE(State_Func1_Post1(&META_RESULT_ORIG_RET(int&), &META_RESULT_OVERRIDE_RET(int&))); - RETURN_META_NOREF(MRES_IGNORED, int&); - } - virtual int& Func1_Post2() - { - ADD_STATE(State_Func1_Post2(&m_Var)); - RETURN_META_VALUE(MRES_OVERRIDE, m_Var); - } - - virtual const int& Func2_Pre1(int p1) - { - ADD_STATE(State_Func2_Pre1(p1, &m_Var)); - RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, m_Var, static_cast(&Test::Func2), (1337)); - } - - virtual const int& Func2_Post1(int p1) - { - ADD_STATE(State_Func2_Post1(p1, &META_RESULT_ORIG_RET(int&), &META_RESULT_OVERRIDE_RET(int&))); - RETURN_META_NOREF(MRES_IGNORED, const int&); - } - }; - - SH_DECL_HOOK0(Test, Func1, SH_NOATTRIB, 0, int&); - SH_DECL_HOOK1(Test, Func2, SH_NOATTRIB, 0, const int&, int); -} - -bool TestRefRet(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1; - - Whatever test; - Test *pTest = &test; - CHook hook; - - int &ret1 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret1)); - - CHECK_STATES((&g_States, - new State_Func1(&test.m_Var1), - new State_Func1_Ret(&test.m_Var1), - NULL), "Part 1"); - - // Now add Func1_Pre1, which supercedes and returns hook.m_Var - SH_ADD_HOOK(Test, Func1, &test, SH_MEMBER(&hook, &CHook::Func1_Pre1), false); - - int &ret2 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret2)); - - CHECK_STATES((&g_States, - new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var - new State_Func1(&test.m_Var1), // Function says that it's going to return test.m_Var1 - new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned - NULL), "Part 2"); - - // Now add Func1_Post1, which only reports orig ret and override ret - SH_ADD_HOOK(Test, Func1, &test, SH_MEMBER(&hook, &CHook::Func1_Post1), true); - - int &ret3 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret3)); - - CHECK_STATES((&g_States, - new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var - new State_Func1(&test.m_Var1), // Function says that it's going to return test.m_Var1 - new State_Func1_Post1(&test.m_Var1, &hook.m_Var), // origret(=p1) is what it wanted to - // return, overrideret(=p2) is pre1's var - new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned - NULL), "Part 3"); - - // Now add Func1_Pre2, which supercedes and returns g_Var (it also sets the override ret from pre1 to 1337) - // and add Func1_Post2, which overrides and returns hook.m_Var again. - - SH_ADD_HOOK(Test, Func1, &test, SH_MEMBER(&hook, &CHook::Func1_Pre2), false); - SH_ADD_HOOK(Test, Func1, &test, SH_MEMBER(&hook, &CHook::Func1_Post2), true); - - int &ret4 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret4)); - - CHECK_STATES((&g_States, - new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var - new State_Func1_Pre2(MRES_OVERRIDE, // current status - &hook.m_Var, // override ret (which it set to 1337) - &g_Var), // what it's going to ret, AND supercede with - - new State_Func1_Post1(&g_Var, &g_Var), // origret(=p1) is what pre2 superceded with, - // so overrideret(=p2) has to be the same - new State_Func1_Post2(&hook.m_Var), // post2 is going to override with hook.m_Var again - new State_Func1_Ret(&hook.m_Var), // ==>>> hook.m_Var is returned - NULL), "Part 4"); - - CHECK_COND(hook.m_Var == 1337, "Part 4.1"); - - // Through a callclass - int &ret5 = SH_CALL(pTest, &Test::Func1)(); - ADD_STATE(State_Func1_Ret(&ret5)); - - CHECK_STATES((&g_States, - new State_Func1(&test.m_Var1), - new State_Func1_Ret(&test.m_Var1), - NULL), "Part 5"); - - - //////////////////////////////////////////////////////////////////////////////////////// - // Func2 tests - const int &ret21 = pTest->Func2(500); - ADD_STATE(State_Func2_Ret(&ret21)); - - CHECK_STATES((&g_States, - new State_Func2(500, &test.m_Var2), - new State_Func2_Ret(&test.m_Var2), - NULL), "Part 6"); - - SH_ADD_HOOK(Test, Func2, &test, SH_MEMBER(&hook, &CHook::Func2_Pre1), false); - SH_ADD_HOOK(Test, Func2, &test, SH_MEMBER(&hook, &CHook::Func2_Post1), true); - - const int &ret22 = pTest->Func2(500); - ADD_STATE(State_Func2_Ret(&ret22)); - - CHECK_STATES((&g_States, - new State_Func2_Pre1(500, &hook.m_Var), // p1 was 500; it's going to override with hook.m_Var; and also change p1 to 1337 - new State_Func2(1337, &test.m_Var2), // p1 was 1337; it's going to ret test.m_Var2 - new State_Func2_Post1(1337, // p1 was 1337 - &test.m_Var2, // orig ret was test.m_Var2 - &hook.m_Var), // override ret was hook.m_Var - new State_Func2_Ret(&hook.m_Var), // really returned hook.m_Var - NULL), "Part 7"); - - return true; -} diff --git a/sourcehook/test/testvphooks.cpp b/sourcehook/test/testvphooks.cpp deleted file mode 100644 index 8d03bfd..0000000 --- a/sourcehook/test/testvphooks.cpp +++ /dev/null @@ -1,347 +0,0 @@ -#include -#include "sourcehook.h" -#include "sourcehook_test.h" -#include "testevents.h" - -// TEST VP HOOKS -// Test vfnptr-wide hooks -// Also contains a test for removing hooks on deleted instances (by id) - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - class IBase; - - MAKE_STATE_1(State_D1_Func1, IBase *); - MAKE_STATE_1(State_D2_Func1, IBase *); - MAKE_STATE_1(State_Func1_Pre, IBase *); - MAKE_STATE_1(State_Func1_Post, IBase *); - - MAKE_STATE_1(State_D1_Func2, IBase *); - MAKE_STATE_1(State_D2_Func2, IBase *); - MAKE_STATE_1(State_Func2_Pre, IBase *); - MAKE_STATE_1(State_Func2_Post, IBase *); - - MAKE_STATE_2(State_D1_Func3, IBase *, int); - MAKE_STATE_2(State_D2_Func3, IBase *, int); - MAKE_STATE_2(State_Func3_Pre, IBase *, int); - MAKE_STATE_2(State_Func3_Post, IBase *, int); - - class IBase - { - public: - virtual void Func1() = 0; - virtual void Func2() = 0; - virtual void Func3(int x) = 0; - }; - - class CDerived1 : public IBase - { - public: - virtual void Func1() - { - ADD_STATE(State_D1_Func1(this)); - } - virtual void Func2() - { - ADD_STATE(State_D1_Func2(this)); - } - virtual void Func3(int x) - { - ADD_STATE(State_D1_Func3(this, x)); - } - }; - - class CDerived2 : public IBase - { - public: - virtual void Func1() - { - ADD_STATE(State_D2_Func1(this)); - } - virtual void Func2() - { - ADD_STATE(State_D2_Func2(this)); - } - virtual void Func3(int x) - { - ADD_STATE(State_D2_Func3(this, x)); - } - }; - - void Handler_Func1_Pre() - { - ADD_STATE(State_Func1_Pre(META_IFACEPTR(IBase))); - } - void Handler_Func1_Post() - { - ADD_STATE(State_Func1_Post(META_IFACEPTR(IBase))); - } - int g_F2_Pre_HookToRemove = 0; - void Handler_Func2_Pre() - { - ADD_STATE(State_Func2_Pre(META_IFACEPTR(IBase))); - SH_REMOVE_HOOK_ID(g_F2_Pre_HookToRemove); - } - void Handler_Func2_Post() - { - ADD_STATE(State_Func2_Post(META_IFACEPTR(IBase))); - } - - - void Handler_Func3_Pre(int x) - { - ADD_STATE(State_Func3_Pre(META_IFACEPTR(IBase), x)); - - RETURN_META_NEWPARAMS(MRES_IGNORED, &IBase::Func3, (x+1)); - } - void Handler_Func3_Post(int x) - { - ADD_STATE(State_Func3_Post(META_IFACEPTR(IBase), x)); - } - - SH_DECL_HOOK0_void(IBase, Func1, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(IBase, Func2, SH_NOATTRIB, 0); - SH_DECL_HOOK1_void(IBase, Func3, SH_NOATTRIB, 0, int); - - SH_DECL_MANUALHOOK1_void(IBase_Func3_Manual, 2, 0, 0, int); -} - -bool TestVPHooks(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - CDerived1 d1i1; - CDerived1 d1i2; - CDerived2 d2i1; - - IBase *p_d1i1 = &d1i1; - IBase *p_d1i2 = &d1i2; - IBase *p_d2i1 = &d2i1; - - int hook1 = SH_ADD_VPHOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); - - p_d1i1->Func1(); - p_d1i2->Func1(); - p_d2i1->Func1(); - - CHECK_STATES((&g_States, - new State_Func1_Pre(p_d1i1), - new State_D1_Func1(p_d1i1), - - new State_Func1_Pre(p_d1i2), - new State_D1_Func1(p_d1i2), - - new State_D2_Func1(p_d2i1), - NULL), "Part 1"); - - SH_CALL(p_d1i1, &IBase::Func1)(); - SH_CALL(p_d1i2, &IBase::Func1)(); - SH_CALL(p_d2i1, &IBase::Func1)(); - - CHECK_STATES((&g_States, - new State_D1_Func1(p_d1i1), - - new State_D1_Func1(p_d1i2), - - new State_D2_Func1(p_d2i1), - NULL), "Part 1.1"); - - SH_REMOVE_HOOK_ID(hook1); - - p_d1i1->Func1(); - p_d1i2->Func1(); - p_d2i1->Func1(); - - CHECK_STATES((&g_States, - new State_D1_Func1(p_d1i1), - - new State_D1_Func1(p_d1i2), - - new State_D2_Func1(p_d2i1), - NULL), "Part 2"); - - - - // Normal hook, then vp hook - - int hook2 = SH_ADD_HOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); - hook1 = SH_ADD_VPHOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); - - p_d1i1->Func1(); - p_d1i2->Func1(); - p_d2i1->Func1(); - - CHECK_STATES((&g_States, - new State_Func1_Pre(p_d1i1), - new State_Func1_Pre(p_d1i1), - new State_D1_Func1(p_d1i1), - - new State_Func1_Pre(p_d1i2), - new State_D1_Func1(p_d1i2), - - new State_D2_Func1(p_d2i1), - NULL), "Part 3"); - - SH_REMOVE_HOOK_ID(hook1); - - p_d1i1->Func1(); - p_d1i2->Func1(); - p_d2i1->Func1(); - - CHECK_STATES((&g_States, - new State_Func1_Pre(p_d1i1), - new State_D1_Func1(p_d1i1), - - new State_D1_Func1(p_d1i2), - - new State_D2_Func1(p_d2i1), - NULL), "Part 4"); - - SH_REMOVE_HOOK_ID(hook2); - - p_d1i1->Func1(); - p_d1i2->Func1(); - p_d2i1->Func1(); - - CHECK_STATES((&g_States, - new State_D1_Func1(p_d1i1), - - new State_D1_Func1(p_d1i2), - - new State_D2_Func1(p_d2i1), - NULL), "Part 5"); - - // Test this: - // Normal hook AND vp hook on Func2 - // Func2's pre handler removes the VP hook. It has to work anyway :) - - hook1 = SH_ADD_VPHOOK(IBase, Func2, p_d1i1, SH_STATIC(Handler_Func2_Pre), false); - hook2 = SH_ADD_HOOK(IBase, Func2, p_d1i1, SH_STATIC(Handler_Func2_Pre), false); - - g_F2_Pre_HookToRemove = hook1; - p_d1i1->Func2(); - p_d1i1->Func2(); - - CHECK_STATES((&g_States, - new State_Func2_Pre(p_d1i1), - new State_Func2_Pre(p_d1i1), - new State_D1_Func2(p_d1i1), - - new State_Func2_Pre(p_d1i1), - new State_D1_Func2(p_d1i1), - - NULL), "Part 6"); - - SH_REMOVE_HOOK_ID(hook1); - - // Hook function 3: - // Using manualhook, VP - hook1 = SH_ADD_MANUALVPHOOK(IBase_Func3_Manual, p_d1i1, SH_STATIC(Handler_Func3_Pre), false); - - // Normally, VP - hook2 = SH_ADD_VPHOOK(IBase, Func3, p_d1i1, SH_STATIC(Handler_Func3_Pre), false); - - // Normally, no VP - int hook3 = SH_ADD_HOOK(IBase, Func3, p_d1i1, SH_STATIC(Handler_Func3_Pre), false); - - p_d1i1->Func3(1); - - CHECK_STATES((&g_States, - new State_Func3_Pre(p_d1i1, 1), // manual vp hook - new State_Func3_Pre(p_d1i1, 2), // normal vp hook - new State_Func3_Pre(p_d1i1, 3), // normal non-vp hook - - new State_D1_Func3(p_d1i1, 4), // function - - NULL), "Part 7.1"); - - p_d1i2->Func3(1); - - CHECK_STATES((&g_States, - new State_Func3_Pre(p_d1i2, 1), // manual vp hook - new State_Func3_Pre(p_d1i2, 2), // normal vp hook - - new State_D1_Func3(p_d1i2, 3), // function - - NULL), "Part 7.2"); - - SH_REMOVE_HOOK_ID(hook1); - SH_REMOVE_HOOK_ID(hook2); - SH_REMOVE_HOOK_ID(hook3); - - // Test direct VP hook - - p_d1i1->Func1(); - p_d1i2->Func1(); - - // get vtable manually - void *pVtable = *reinterpret_cast(p_d1i1); - - hook1 = SH_ADD_DVPHOOK(IBase, Func1, pVtable, SH_STATIC(Handler_Func1_Pre), false); - - p_d1i1->Func1(); - p_d1i2->Func1(); - - CHECK_STATES((&g_States, - new State_D1_Func1(p_d1i1), - new State_D1_Func1(p_d1i2), - - new State_Func1_Pre(p_d1i1), - new State_D1_Func1(p_d1i1), - new State_Func1_Pre(p_d1i2), - new State_D1_Func1(p_d1i2), - NULL), "Part 8.1"); - - SH_REMOVE_HOOK_ID(hook1); - - // Now try manual dvp hooks - p_d1i1->Func3(1); - p_d1i2->Func3(1); - - hook1 = SH_ADD_MANUALDVPHOOK(IBase_Func3_Manual, pVtable, SH_STATIC(Handler_Func3_Pre), false); - - p_d1i1->Func3(1); - p_d1i2->Func3(1); - - CHECK_STATES((&g_States, - new State_D1_Func3(p_d1i1, 1), - new State_D1_Func3(p_d1i2, 1), - - new State_Func3_Pre(p_d1i1, 1), // manual vp hook - new State_D1_Func3(p_d1i1, 2), // function - - new State_Func3_Pre(p_d1i2, 1), // normal vp hook - new State_D1_Func3(p_d1i2, 2), // function - - NULL), "Part 8.2"); - - - // Test removing normal hooks even though the instance is deleted - IBase *pOther = new CDerived1; - SH_ADD_HOOK(IBase, Func1, pOther, SH_STATIC(Handler_Func1_Pre), false); - delete pOther; - // The following line may not crash! - SH_REMOVE_HOOK(IBase, Func1, pOther, SH_STATIC(Handler_Func1_Pre), false); - - - // Now test GetOrigVfnPtrEntry - void *origfuncptr = (*reinterpret_cast(p_d1i1))[0]; - - CHECK_COND(SH_GET_ORIG_VFNPTR_ENTRY(p_d1i1, &IBase::Func1) == origfuncptr, "Part 9.1"); - - SH_ADD_HOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); - - CHECK_COND(SH_GET_ORIG_VFNPTR_ENTRY(p_d1i1, &IBase::Func1) == origfuncptr, "Part 9.2"); - - SH_REMOVE_HOOK(IBase, Func1, p_d1i1, SH_STATIC(Handler_Func1_Pre), false); - - CHECK_COND(SH_GET_ORIG_VFNPTR_ENTRY(p_d1i1, &IBase::Func1) == origfuncptr, "Part 9.3"); - - return true; -} - diff --git a/sourcemm/IPluginManager.h b/sourcemm/IPluginManager.h deleted file mode 100644 index c528008..0000000 --- a/sourcemm/IPluginManager.h +++ /dev/null @@ -1,154 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_PLUGINMANAGER_H -#define _INCLUDE_PLUGINMANAGER_H - -/** - * @brief Plugin Manager interface - * @file IPluginManager.h - */ - -typedef int PluginId; - -#include "ISmmPlugin.h" - -/** - * @brief Load sources - */ -enum -{ - Pl_BadLoad=0, - Pl_Console=-1, - Pl_File=-2, - Pl_MinId=1, -}; - -/** - * @brief Status of a plugin at runtime - */ -enum Pl_Status -{ - Pl_NotFound=-4, - Pl_Error=-3, - Pl_Refused=-2, - Pl_Paused=-1, - Pl_Running=0, -}; - -typedef int PluginId; -struct factories; - -class ISmmPluginManager -{ -public: - /** - * @brief Loads a plugin and returns its id. If this is called before DLLInit(), - * then the plugin is considered to be "hot" - it might refuse its own load later! - * Also, a hot plugin might not have an error message. - * - * @param file String containing file name - * @param source Specifies who loaded the plugin - * @param status Status of the plugin - * @param ismm Pointer to Smm API - * @param error String buffer for error messages - * @param maxlen Maximum length of buffer - * @return Id of plugin - */ - virtual PluginId Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen) =0; - - /** - * @brief Unloads a plugin - * - * @param id Id of plugin - * @param error String buffer for error messages - * @param maxlen Maximum length of buffer - * @return True on success, false otherwise - */ - virtual bool Unload(PluginId id, bool force, char *error, size_t maxlen) =0; - - /** - * @brief Pauses a plugin - * - * @param id Id of plugin - * @param error String buffer for error messages - * @param maxlen Maximum length of buffer - * @return True on success, false otherwise - */ - virtual bool Pause(PluginId id, char *error, size_t maxlen) =0; - - /** - * @brief Unpauses a plugin - * - * @param id Id of plugin - * @param force If true, forces the plugin to unload - * @param error String buffer for error messages - * @param maxlen Maximum length of buffer - * @return True on success, false otherwise - */ - virtual bool Unpause(PluginId id, char *error, size_t maxlen) =0; - - /** - * @brief Unloads all plugins forcefully - * - * @return True on success, false otherwise - */ - virtual bool UnloadAll() =0; - - /** - * @brief Returns information about a plugin - * - * @param id Id of plugin - * @param file Pointer to file string by reference - * @param list Pointer to factories by reference - * @param status By reference status of plugin - * @param source By reference source of plugin - * @return True on success, false if not found - */ - virtual bool Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source) =0; - - /** - * @brief Checks another plugin's QueryRunning() status. - * - * @param id Id of plugin - * @param error Message buffer - * @param maxlen Size of error buffer - * @return Status value - */ - virtual bool QueryRunning(PluginId id, char *error, size_t maxlength) =0; - - /** - * @brief Returns the handle of a plugin (OS dependent meaning) - * - * @param id Id of plugin - * @param handle By reference handle of plugin, if any - * @return True if plugin id is valid, false otherwise - */ - virtual bool QueryHandle(PluginId id, void *&handle) =0; -}; - -#endif //_INCLUDE_PLUGINMANAGER_H diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h deleted file mode 100644 index b5719f5..0000000 --- a/sourcemm/ISmmAPI.h +++ /dev/null @@ -1,393 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_ISMM_API_H -#define _INCLUDE_ISMM_API_H - -/** - * @brief External API interface - * @file ISmmAPI.h - */ - -#include -#include -#include -#include "IPluginManager.h" - -#if defined __GNUC__ -#if ((__GNUC__ == 3) && (__GNUC_MINOR__ < 4)) || (__GNUC__ < 3) -#error "You must compile with at least GCC 3.4! If you know what you are doing, you can remove this message." -#endif //version check -#endif //__GNUC__ - -class IMetamodListener; -class ISmmPluginManager; -class ISmmPlugin; - -#define MMIFACE_SOURCEHOOK "ISourceHook" /**< ISourceHook Pointer */ -#define MMIFACE_PLMANAGER "IPluginManager" /**< SourceMM Plugin Functions */ -#define IFACE_MAXNUM 999 /**< Maximum interface version */ - -#define SOURCE_ENGINE_UNKNOWN 0 /**< Could not determine the engine version */ -#define SOURCE_ENGINE_ORIGINAL 1 /**< Original Source Engine (used by The Ship) */ -#define SOURCE_ENGINE_EPISODEONE 2 /**< Episode 1 Source Engine (second major SDK) */ -#define SOURCE_ENGINE_ORANGEBOX 3 /**< Orange Box Source Engine (third major SDK) */ - -class ISmmAPI -{ -public: - /** - * @brief Logs a message through the HL2 log system. - * Note: Newlines are appended automatically. - * - * @param pl Plugin API pointer (used for tagging message) - * @param msg Formatted string. - */ - virtual void LogMsg(ISmmPlugin *pl, const char *msg, ...) =0; -public: - /** - * @brief Returns an interface factory for the HL2 engine. - * - * @param syn If syn is true, the synthetic wrapper is returned. - * If syn is false, the true function is returned. - * @return CreateInterfaceFn function pointer. - */ - virtual CreateInterfaceFn engineFactory(bool syn=true) =0; - - /** - * @brief Returns an interface factory for the HL2 physics engine. - * - * @param syn If syn is true, the synthetic wrapper is returned. - * If syn is false, the true function is returned. - * @return CreateInterfaceFn function pointer. - */ - virtual CreateInterfaceFn physicsFactory(bool syn=true) =0; - - /** - * @brief Returns an interface factory for the HL2 file system. - * - * @param syn If syn is true, the synthetic wrapper is returned. - * If syn is false, the true function is returned. - * @return CreateInterfaceFn function pointer. - */ - virtual CreateInterfaceFn fileSystemFactory(bool syn=true) =0; - - /** - * @brief Returns an interface factory for the GameDLL. - * - * @param syn If syn is true, the synthetic wrapper is returned. - * If syn is false, the true function is returned. - * @return CreateInterfaceFn function pointer. - */ - virtual CreateInterfaceFn serverFactory(bool syn=true) =0; - - /** - * @brief Returns a CGlobalVars pointer from the HL2 Engine. - * - * @return CGlobalVars pointer. - */ - virtual CGlobalVars *pGlobals() =0; - - /** - * @brief Used with SourceHook, sets teh last meta return value. - * Note: Do not call this directly, use the Metamod macros. - * - * @param res META_RETURN value to set. - */ - virtual void SetLastMetaReturn(META_RES res) =0; - - /** - * @brief Used with SourceHook, returns the last meta return value. - * Note: This is only valid inside a hook function. - * - * @return Last META_RETURN value set by a plugin. - */ - virtual META_RES GetLastMetaReturn() =0; - -public: // Added in 1.00-RC2 (0:0) - /** - * @brief Allows access to Metamod's ConCommandBaseAccessor. - * - * @return Returns IConCommandBaseAccessor pointer. - */ - virtual IConCommandBaseAccessor *GetCvarBaseAccessor() =0; - - /** - * @brief Registers a ConCommandBase. - * - * @param plugin Parent plugin API pointer. - * @param pCommand ConCommandBase to register. - * @return True if successful, false otherwise. - */ - virtual bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) =0; - - /** - * @brief Unregisters a ConCommandBase. - * - * @param plugin Parent plugin API pointer. - * @param pCommand ConCommandBase to unlink. - */ - virtual void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) =0; - - /** - * @brief Prints an unformatted string to the remote server console. - * - * Note: Newlines are not added automatically. - * - * @param str Message string. - */ - virtual void ConPrint(const char *str) =0; - - /** - * @brief Prints a formatted message to the remote server console. - * - * Note: Newlines are not added automatically. - * - * @param fmt Formatted message. - */ - virtual void ConPrintf(const char *fmt, ...) =0; - -public: // Added in 1.1.0 (1:0) - /** - * @brief Checks if ConPrint/ConPrintf will mirror to rcon. - * - * @return True if remote printing available, false otherwise. - */ - virtual bool RemotePrintingAvailable() =0; - - /** - * @brief Returns the Metamod Version numbers as major version and minor (API) version. - * Changes to minor version are guaranteed to be backwards compatible. - * Changes to major version are not. - * - * @param major Filled with the major API version number. - * @param minor Filled with the minor API version number. - * @param plvers Filled with the current plugin API version number. - * @param plmin Filled with the minimum plugin API version number supported. - */ - virtual void GetApiVersions(int &major, int &minor, int &plvers, int &plmin) =0; - - /** - * @brief Returns sourcehook API version and implementation version. - * - * @param shvers Filled with the SourceHook API version number. - * @param shimpl Filled with the SourceHook implementation number. - */ - virtual void GetShVersions(int &shvers, int &shimpl) =0; - - /** - * @brief Adds a Metamod listener. - * - * @param plugin Plugin interface pointer. - * @param pListener Listener interface pointer to add. - */ - virtual void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener) =0; - - /** - * @brief Queries the metamod factory - * - * @param iface String containing interface name - * @param ret Optional pointer to store return status - * @param id Optional pointer to store id of plugin that overrode interface, 0 if none - * @return Returned pointer - */ - virtual void *MetaFactory(const char *iface, int *ret, PluginId *id) =0; - -public: // Added in 1.1.2 (1:1) - /** - * @brief Given a base interface name, such as ServerGameDLL or ServerGameDLL003, - * reformats the string to increase the number, then returns the new number. - * This is the base function to InterfaceSearch() and VInterfaceMatch(). - * - * @param iface Input/output interface name. Must be writable. - * @param maxlength Maximum length of iface buffer. Must be at least strlen(iface)+4 chars. - * @return The newly incremented iface version number. - */ - virtual int FormatIface(char iface[], unsigned int maxlength) =0; - -public: // Added in 1.2 (1:2) - /** - * @brief Searches for an interface, eliminating the need to loop through FormatIface(). - * - * @param fn InterfaceFactory function. - * @param iface Interface string name. - * @param max Maximum version to look up. - * @param ret Last return code from interface factory function. - * @return Interface pointer, or NULL if not found. - */ - virtual void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret) =0; - - /** - * @brief Returns the base directory of the game/server, equivalent to - * IVEngineServer::GetGameDir(), except the path is absolute. - * - * @return Static pointer to game's absolute basedir. - */ - virtual const char *GetBaseDir() =0; - - /** - * @brief Formats a file path to the local OS. - * - * Does not include any base directories. Note that all slashes and black - * slashes are reverted to the local OS's expectancy. - * - * @param buffer Destination buffer to store path. - * @param len Maximum length of buffer, including null terminator. - * @param fmt Formatted string. - */ - virtual void PathFormat(char *buffer, size_t len, const char *fmt, ...) =0; - -public: // Added in 1.2.2 (1:3) - /** - * @brief Prints text in the specified client's console. Same as - * IVEngineServer::ClientPrintf except that it allows for string formatting. - * - * @param client Client edict pointer. - * @param fmt Formatted string to print to the client. - */ - virtual void ClientConPrintf(edict_t *client, const char *fmt, ...) =0; - -public: // Added in 1.3 (1:4) - /** - * @brief Wrapper around InterfaceSearch(). Assumes no maximum. - * This is designed to replace the fact that searches only went upwards. - * The "V" is intended to convey that this is for Valve formatted interface strings. - * - * @param fn Interface factory function. - * @param iface Interface string. - * @param min Minimum value to search from. If zero, searching - * begins from the first available version regardless - * of the interface. Note that this can return - * interfaces EARLIER than the version specified. A - * value of -1 (default) specifies the string version - * as the minimum. Any other value specifices the - * minimum value to search from. - * @return Interface pointer, or NULL if not found. - */ - virtual void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1) =0; - -public: // Added in 1.4 (1:5) - /** - * @brief Tells SourceMM to add VSP hooking capability to plugins. - * - * Since this potentially uses more resources than it would otherwise, - * plugins have to explicitly enable the feature. Whether requested or - * not, if it is enabled, all plugins will get a pointer to the VSP - * listener through IMetamodListener. This will not be called more than - * once for a given plugin; if it is requested more than once, each - * successive call will only give the pointer to plugins which have not - * yet received it. - */ - virtual void EnableVSPListener() =0; - - /** - * @brief Returns the interface version of the GameDLL's IServerGameDLL - * implementation. - * - * @return Interface version of the loaded IServerGameDLL. - */ - virtual int GetGameDLLVersion() =0; - - /** - * @brief Returns the number of user messages in the GameDLL. - * - * @return Number of user messages, or -1 if SourceMM has - * failed to get user message list. - */ - virtual int GetUserMessageCount() =0; - - /** - * @brief Returns the index of the specified user message. - * - * @param name User message name. - * @param size Optional pointer to store size of user message. - * @return Message index, or -1 on failure. - */ - virtual int FindUserMessage(const char *name, int *size=NULL) =0; - - /** - * @brief Returns the name of the specified user message. - * - * @param index User message index. - * @param size Optional pointer to store size of user message. - * @return Message name, or NULL on failure. - */ - virtual const char *GetUserMessage(int index, int *size=NULL) =0; - -public: // Added in 1.5.0 (1:6) - /** - * @brief Returns the highest interface version of IServerPluginCallbacks - * that the engine supports. This is useful for games that run on older - * versions of the Source engine, such as The Ship. - * - * @return Highest interface version of IServerPluginCallbacks. - * Returns 0 if SourceMM's VSP listener isn't currently - * enabled. - */ - virtual int GetVSPVersion() =0; - -public: // Added in 1.6.0 (1:7) - /** - * @brief Returns the engine interface that MM:S is using as a backend. - * - * The values will be one of the SOURCE_ENGINE_* constants from the top - * of this file. - * - * @return A SOURCE_ENGINE_* constant value. - */ - virtual int GetSourceEngineBuild() =0; - - /** - * @brief Returns the VSP listener loaded. - * - * This is useful for late-loading plugins which need to decide whether - * to add a listener or not (or need to get the pointer at all). - * - * @param Optional pointer to store the VSP version. - * @return IServerPluginCallbacks pointer, or NULL if an - * IMetamodListener event has yet to occur for - * EnableVSPListener(). - */ - virtual IServerPluginCallbacks *GetVSPInfo(int *pVersion) =0; -}; - - -/** - * Version History - * - * 1.1.0 Bumped API to 1:0. The breaking changes occurred in SourceHook and the plugin API. - * 1.1.2 Added API call for generating iface names. - * 1.2 Added API more helper functions and new SourceHook version. - * 1.2.2 Added API for printing to client console (with string formatting). - * 1.3 Added new interface search API. - * 1.4 Added VSP listener and user message API. - * 1.5.0 Added API for getting highest supported version of IServerPluginCallbacks. - * 1.6.0 Added API for Orange Box. - */ - -#endif //_INCLUDE_ISMM_API_H - diff --git a/sourcemm/ISmmPlugin.h b/sourcemm/ISmmPlugin.h deleted file mode 100644 index 746eefe..0000000 --- a/sourcemm/ISmmPlugin.h +++ /dev/null @@ -1,455 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_ISMM_PLUGIN_H -#define _INCLUDE_ISMM_PLUGIN_H - -/** - * @brief Plugin API interface - * @file ISmmPlugin.h - */ - -#include -#include -#include "ISmmAPI.h" - -#define PLAPI_VERSION 12 -#define PLAPI_NAME "ISmmPlugin" - -class ISmmAPI; - -class ISmmPlugin -{ -public: - virtual int GetApiVersion() { return PLAPI_VERSION; } - virtual ~ISmmPlugin() { } -public: - /** - * @brief Called on plugin load. - * - * NOTE - As of API 7, this is called as DLLInit() executes - after the parameters are known, but before - * the original GameDLL function is called. Therefore, you cannot hook it, but you don't need to - - * Load() is basically your hook. - * NOTE - As of API 7, you can override factories before the engine and gamedll exchange them. - * However, take care to note that if your plugin is unloaded, and the gamedll/engine have cached - * an interface you've passed, something will definitely crash. Be careful. - * - * @param id Internal id of plugin. Saved globally by PLUGIN_SAVEVARS() - * @param ismm External API for SourceMM. Saved globally by PLUGIN_SAVEVARS() - * @param list Contains a list of factories. Hook a factory call by setting one equal to your own function. - * @param late Set to true if your plugin was loaded late (not at server load). - * @param error Error message buffer - * @param maxlen Size of error message buffer - * @return True if successful, return false to reject the load. - */ - virtual bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlength, bool late) =0; - - /** - * @brief Called when your plugin is "queried". - * - * This is useful for rejecting a loaded state. For example, if your plugin wants - * to stop operating, it can simply return false and copy an error message. This - * will notify other plugins or MM:S of something bad that happened. NOTE - MM:S - * will not cache the return state, so if you return false, your plugin will not - * actually be paused or unloaded. This callback will be called when: - * - Another plugin requests it - * - Someone types "meta list", it will show up as "REFUSED" - * - When Metamod need to re-check the plugin's status - * - If the plugin does something like overload a factory, Metamod will make sure the Query() returns true - * before calling it. - * Also note that this query will only override Metamod when the plugin is running and not paused. - * - * @param error Buffer for error message. This can be NULL! - * @param maxlen Maximum length of error buffer. - * @return Status code - true for okay, false for badness. - */ - virtual bool QueryRunning(char *error, size_t maxlen) - { - return true; - } - - /** - * @brief Called on plugin unload. You can return false if you know your plugin - * is not capable of restoring critical states it modifies. - * - * @param error Error message buffer - * @param maxlen Size of error message buffer - * @return True on success, return false to request no unload. - */ - virtual bool Unload(char *error, size_t maxlen) - { - return true; - } - - /** @brief Called on plugin pause. - * - * @param error Error message buffer - * @param maxlen Size of error message buffer - * @return True on success, return false to request no pause. - */ - virtual bool Pause(char *error, size_t maxlen) - { - return true; - } - - /** @brief Called on plugin unpause. - * - * @param error Error message buffer - * @param maxlen Size of error message buffer - * @return True on success, return false to request no unpause. - */ - virtual bool Unpause(char *error, size_t maxlen) - { - return true; - } -public: - /** @brief Return author as string */ - virtual const char *GetAuthor() =0; - - /** @brief Return plugin name as string */ - virtual const char *GetName() =0; - - /** @brief Return a description as string */ - virtual const char *GetDescription() =0; - - /** @brief Return a URL as string */ - virtual const char *GetURL() =0; - - /** @brief Return quick license code as string */ - virtual const char *GetLicense() =0; - - /** @brief Return version as string */ - virtual const char *GetVersion() =0; - - /** @brief Return author as string */ - virtual const char *GetDate() =0; - - /** @brief Return author as string */ - virtual const char *GetLogTag() =0; -public: - /** - * @brief Called when all plugins have been loaded. - * - * This is called after DLLInit(), and thus the mod has been mostly initialized. - * It is also safe to assume that all other (automatically loaded) plugins are now - * ready to start interacting, because they are all loaded. - */ - virtual void AllPluginsLoaded() - { - } -}; - -/** - * @brief Added in 1.1 so plugins could listen to specific events - */ -class IMetamodListener -{ -public: - virtual ~IMetamodListener() - { - } -public: - /** - * @brief Called when a plugin is loaded. - * - * @param id Id of the plugin. - */ - virtual void OnPluginLoad(PluginId id) - { - } - - /** - * @brief Called when a plugin is unloaded. - * - * @param id Id of the plugin. - */ - virtual void OnPluginUnload(PluginId id) - { - } - - /** - * @brief Called when a plugin is paused. - * - * @param id Id of the plugin. - */ - virtual void OnPluginPause(PluginId id) - { - } - - /** - * @brief Called when a plugin is unpaused. - * - * @param id Id of the plugin. - */ - virtual void OnPluginUnpause(PluginId id) - { - } - - /** - * @brief Called when the level is loaded (after GameInit, before ServerActivate). - * - * To override this, hook IServerGameDLL::LevelInit(). - * - * @param pMapName Name of the map. - * @param pMapEntities Lump string of the map entities, in KeyValue format. - * @param pOldLevel Unknown. - * @param pLandmarkName Unknown. - * @param loadGame Unknown. - * @param background Unknown. - */ - virtual void OnLevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background) { } - - /** - * @brief Called when the level is shut down. May be called more than once. - */ - virtual void OnLevelShutdown() - { - } - - /** - * @brief Called when engineFactory() is used through Metamod:Source's wrapper. - * This can be used to provide interfaces to other plugins or the GameDLL. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnEngineQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when the physics factory is used through Metamod:Source's wrapper. - * This can be used to provide interfaces to other plugins. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnPhysicsQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when the filesystem factory is used through Metamod:Source's wrapper. - * This can be used to provide interfaces to other plugins. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnFileSystemQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when the server DLL's factory is used through Metamod:Source's wrapper. - * This can be used to provide interfaces to other plugins. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnGameDLLQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when Metamod's own factory is invoked. - * This can be used to provide interfaces to other plugins. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnMetamodQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when Metamod:Source acquires a valid IServerPluginCallbacks - * pointer to be used for hooking by plugins. - * - * This will only be called after a call to ISmmAPI::EnableVSPListener(). - * If called before GameInit, this callback will occur before LevelInit. - * Otherwise, it will be called on the first call after that. - * - * This callback is provided to all plugins regardless of which (or how many) - * called EnableVSPListener(), but only if at least one did in fact enable it. - * - * This callback is only available for plugins using API v1:5 (Metamod:Source 1.4+). - * If a plugin loads lately, it may still call EnableVSPListener(). - * - * @param iface Interface pointer. If NULL, then the VSP listening construct - * failed to initialize and is not available. - */ - virtual void OnVSPListening(IServerPluginCallbacks *iface) - { - } - - /** - * @brief Called when Metamod:Source is about to remove a concommand or convar. - * This can also be called if ISmmAPI::UnregisterConCmdBase is used by a plugin. - * - * @param id Id of the plugin that created the concommand or convar. - * @param pCommand Pointer to concommand or convar that is being removed. - */ - virtual void OnUnlinkConCommandBase(PluginId id, ConCommandBase *pCommand) - { - } -}; - -#define PL_EXPOSURE CreateInterface -#define PL_EXPOSURE_C "CreateInterface" - -#define PLUGIN_EXPOSE(name, var) \ - ISmmAPI *g_SMAPI = NULL; \ - ISmmPlugin *g_PLAPI = NULL; \ - PluginId g_PLID = (PluginId)0; \ - SourceHook::ISourceHook *g_SHPtr = NULL; \ - SMM_API void *PL_EXPOSURE(const char *name, int *code) { \ - if (name && !strcmp(name, PLAPI_NAME)) { \ - return static_cast(&var); \ - } \ - return NULL; \ - } - -#define PLUGIN_GLOBALVARS() \ - extern SourceHook::ISourceHook *g_SHPtr; \ - extern ISmmAPI *g_SMAPI; \ - extern ISmmPlugin *g_PLAPI; \ - extern PluginId g_PLID; - -#define PLUGIN_SAVEVARS() \ - g_SMAPI = ismm; \ - g_SHPtr = static_cast(ismm->MetaFactory(MMIFACE_SOURCEHOOK, NULL, NULL)); \ - g_PLAPI = static_cast(this); \ - g_PLID = id; - -#define META_LOG g_SMAPI->LogMsg -#define META_REGCMD(name) g_SMAPI->RegisterConCmdBase(g_PLAPI, name##_command) -#define META_REGCVAR(var) g_SMAPI->RegisterConCmdBase(g_PLAPI, var) -#define META_UNREGCMD(name) g_SMAPI->UnregisterConCmdBase(g_PLAPI, name##_command) -#define META_UNREGCVAR(var) g_SMAPI->UnregisterConCmdBase(g_PLAPI, var) -#define META_CONPRINT g_SMAPI->ConPrint -#define META_CONPRINTF g_SMAPI->ConPrintf - -/* Probably should use this up above someday */ -#define CONCMD_VARNAME(name) name##_command - -#if !defined SMM_API -#if defined __WIN32__ || defined _WIN32 || defined WIN32 - #define SMM_API extern "C" __declspec(dllexport) -#elif defined __GNUC__ - #if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 1) - #define SMM_API extern "C" __attribute__ ((visibility("default"))) - #else - #define SMM_API extern "C" - #endif -#endif -#endif //!defined SMM_API - -/** - * @brief Macro for automatically getting a current or newer Valve interface. - * - * @param v_factory Factory method to use from ISmmAPI (such as engineFactory). - * @param v_var Variable name to store into. - * @param v_type Interface type (do not include the pointer/asterisk). - * @param v_name Interface name. - */ -#define GET_V_IFACE_CURRENT(v_factory, v_var, v_type, v_name) \ - v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name); \ - if (!v_var) \ - { \ - if (error && maxlen) \ - { \ - snprintf(error, maxlen, "Could not find interface: %s", v_name); \ - } \ - return false; \ - } - - /** - * @brief Same as GET_V_IFACE, except searches for any. - * - * @param v_factory Factory method to use from ISmmAPI (such as engineFactory). - * @param v_var Variable name to store into. - * @param v_type Interface type (do not include the pointer/asterisk). - * @param v_name Interface name. - */ -#define GET_V_IFACE_ANY(v_factory, v_var, v_type, v_name) \ - v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name, 0); \ - if (!v_var) \ - { \ - if (error && maxlen) \ - { \ - snprintf(error, maxlen, "Could not find interface: %s", v_name); \ - } \ - return false; \ - } - -#endif //_INCLUDE_ISMM_PLUGIN_H - diff --git a/sourcemm/LICENSE.txt b/sourcemm/LICENSE.txt deleted file mode 100644 index bf9f1fd..0000000 --- a/sourcemm/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -The software is Copyright (C) 2004-2007, Metamod:Source Development Team. - -Metamod:Source is distributed under the "zLib/libpng" license, which is reproduced -below: - ------------------------------------------------------------------------------ - -This software is provided "as-is", without any express or implied warranty. -In no event will the authors be held liable for any damages arising from -the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software in - a product, an acknowledgment in the product documentation would be - appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not - be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. - ------------------------------------------------------------------------------ - -The zLib/libpng license has been approved by the "Open Source Initiative" -organization. diff --git a/sourcemm/Makefile.ep1 b/sourcemm/Makefile.ep1 deleted file mode 100644 index 9f8e12b..0000000 --- a/sourcemm/Makefile.ep1 +++ /dev/null @@ -1,75 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson - -HL2SDK = ../../../hl2sdk -SMM_ROOT = .. -SRCDS = ~/srcds - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O2 -funroll-loops -s -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = server_i486.so - -HL2PUB = $(HL2SDK)/public -HL2LIB = $(HL2SDK)/linux_sdk - -OBJECTS = metamod.cpp metamod_util.cpp metamod_console.cpp metamod_oslink.cpp metamod_plugins.cpp \ - sourcehook.cpp episode1/console.cpp episode1/provider_ep1.cpp episode1/vsp_listener.cpp - -LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc - -INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ - -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp \ - -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca \ - -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - mkdir -p $(BIN_DIR)/episode1 - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - ln -sf $(SMM_ROOT)/sourcehook/sourcehook.cpp sourcehook.cpp - $(MAKE) -f Makefile.ep1 sourcemm - rm -rf $(BINARY) - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - -sourcemm: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) -f Makefile.ep1 all DEBUG=true - -default: all - -clean: - rm -rf Release/episode1/*.o - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/episode1/*.o - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) - diff --git a/sourcemm/Makefile.ep2 b/sourcemm/Makefile.ep2 deleted file mode 100644 index d9fe514..0000000 --- a/sourcemm/Makefile.ep2 +++ /dev/null @@ -1,78 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson - -HL2SDK = ../../../hl2sdk-ob -SMM_ROOT = .. -SRCDS = ~/srcds - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O2 -funroll-loops -s -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = server_i486.so - -HL2PUB = $(HL2SDK)/public -HL2LIB = $(HL2SDK)/linux_sdk - -OBJECTS = metamod.cpp metamod_util.cpp metamod_console.cpp metamod_oslink.cpp metamod_plugins.cpp \ - sourcehook.cpp episode2/console.cpp episode2/provider_ep2.cpp episode2/vsp_listener.cpp \ - episode2/convar.cpp - -LINK = vstdlib_i486.so tier0_i486.so -static-libgcc - -INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ - -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp \ - -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca \ - -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse \ - -fno-strict-aliasing - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - mkdir -p $(BIN_DIR)/episode2 - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - ln -sf $(SMM_ROOT)/sourcehook/sourcehook.cpp sourcehook.cpp - ln -sf $(HL2SDK)/tier1/convar.cpp episode2/convar.cpp - $(MAKE) -f Makefile.ep2 sourcemm - rm -rf $(BINARY) - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - -sourcemm: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) -f Makefile.ep2 all DEBUG=true - -default: all - -clean: - rm -rf Release/episode2/*.o - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/episode2/*.o - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) - diff --git a/sourcemm/changelog.txt b/sourcemm/changelog.txt deleted file mode 100644 index ada6263..0000000 --- a/sourcemm/changelog.txt +++ /dev/null @@ -1,148 +0,0 @@ -2007/??/?? 1.6.0: - - Metamod:Source has no received a large internal rewrite to improve coding - standards and to separate internal logic from engine specifics. - - Added API for getting highest supported IServerPluginCallbacks interface - version. - - Added OnUnlinkConCommandBase to IMetamodListner to notify when Metamod:Source - is about to remove a concommand or convar. - - The output of the "meta list" command has been reformatted in order to allow - more space for plugins' name, version, and author fields. - -2007/06/26 1.4.2: - - Fixed a bug where unloading all plugins could crash if one plugin had child - plugins. - -2007/05/16 1.4.1: - - The client version of the "meta" command should now work with games using the - latest Source beta (srcds0407). - - Fixed amb233 (VSP listener didn't work with Steam dedicated version). - - Fixed amb277 (failed to get user message list in Kreedz Climbing). - -2007/04/05 1.4.0: - - Added API functions for retrieving User Message info without potentially - crashing. - - Added API functions for letting SourceMM plugins use Valve Server Plugin - callbacks. - - Added plugin status to client version of "meta list" command. Previously, it - did not differentiate between running and paused plugins. - - An experimental automatic gameinfo.txt fixer is now available. - - Changed version numbering to include the build number (SVN revision). - - Fixed amb93 (improved mod path detection). - - Fixed various rare string inconsistencies. - -2006/11/29 1.3d: - - Updated Metamod:Source to recognize the latest Source Engine version - (ServerGameDLL006) - -2006/09/06 1.3a: - - Fixed a building issue on Linux which caused unresolved symbol errors when - trying to load Metamod:Source on a game using an older set of engine - libraries. This fix should now allow Metamod:Source to run with The Ship on - Linux. - -2006/08/16 1.3: - - Added SourceHook support for functions that return references. - - Added some extra information to the "meta game" command: Description and - Interface. For example, CS:S would display "Counter-Strike: Source" and - "ServerGameDLL004." - - Added some extra functionality to ISmmPluginManager. - - Added compiling support for MSVC 8.0 (Visual Studio 2005) and GCC 4.x. - - Added another API helper function for formatting and searching for - interfaces. - - Updated project files and source tree to use the latest HL2SDK. - - Updated the sample plugins to be a bit cleaner and use newer API. - - Fixed bug where Metamod:Source could load the wrong GameDLL and/or load more - than one GameDLL. This issue occured in HL2 CTF, SourceForts, or any other - mod that relied on files from another mod directory. - - Fixed bug where ISmmAPI::MetaFactory() would return the wrong interface when - trying to retrieve ISmmPluginManager. - - Fixed bug where returning false in Load() after adding a Metamod event - listener or hooking a function could cause a crash instead of rejecting the - plugin. - - Fixed bug where trying to load Metamod:Source a second time as a SourceMM or - Valve server plugin could cause a crash. - - Fixed a bug in FormatIface() that caused InterfaceSearch() to infinite loop. - -2006/06/14 1.2.3: - - Added SourceHook API for manual recalls: RETURN_META_(VALUE_)MNEWPARAMS - - Added support for ServerGameDLL005 (latest HL2DM update) - -2006/05/25 1.2.2: - - Added the ability to "alias" plugin names in metaplugins.ini. - - Added "meta alias" command. - - Added SourceHook API for manual callclasses. - - Added support for the latest Source engine (ServerGameDLL005). - - Added API for printing text in a client's console with ClientConPrintf. This - does the same thing as IVEngineServer::ClientPrintf except that it allows - string formatting. - - Added client version of "meta" command in order to allow clients to view - version information and a list of loaded plugins. - - Fixed a bug causing old mods on newer engines to fail loading. - - Fixed issues with SourceHook's SH_CALL and reference parameters. - - Fixed a bug where the mm_pluginsfile cvar was being ignored. - - Fixed a memory leak when using ISmmAPI::InterfaceSearch. - -2006/02/15 1.2.1: - - Fixed bug where returning newparams in a post hook would cause infinite - recursion. - - Fixed bug where "meta load" could load the same plugin multiple times. - - Fixed bug where unloading a plugin could crash internal hook states. - - Fixed bug where unhooking a single hook would clear the hook chain. - -2006/01/07 1.2: - - Added SourceHook API for modifying parameters in the hook chain. - - Added SourceHook API for declaring and hooking manual vtable hooks. - - Added better API for querying an interface factory. - - Added API for formatting an OS-independent path. - - Added Listen Server Launcher to the graphical installer. - - Fixed bug where failed plugins could crash the plugin list. - - NOTE: SourceHook changes may require plugins to be recompiled against the new - API. - -2005/12/06 1.1.2: - - Added interface overriding/sharing examples to sample plugins. - - Added API to help guessing at Valve interface versions. - - Fixed various memory leaks. - - Fixed memory corruption bug on vector copying. - - Fixed other various template bugs. - -2005/10/21 1.1.1: - - Fixed a bug where AllPluginsLoaded() was not called after DLLInit(). - -2005/10/21 1.1: - - Rewrote GameDLL loading code to be API version generic. As such, SourceMM - will now easily support new API releases without an SDK release, such as the - case with Day of Defeat:Source. - - Added more flexibility to plugin control by supplying an event system. - - Removed dependency on libstdc++.so by supplying a small template library. - - SourceHook internal API is now interface-based, meaning that future updates - to the API will not break older plugins. This update, however, breaks older - plugins. - - SourceHook is now re-entrant. - - Added a basic automated installer (by Basic-Master). - - Fixed a bug where games with changing game names would not work. - - Fixed various bugs, including a cvarlist corruption bug on unloading plugins. - -2005/07/07 1.00-RC2: - - Added API for dealing with ConCommandBase registration (cvars/concmds). This - is to fix the fact that Valve API provides no way to unlist a cvar/cmd. - - Added two new commands - "meta cmds" and "meta cvars". - - Added API calls for correctly printing to the console such that rcon will - also receive messages that a plugin prints. This problem was mentioned on - hlcoders and Valve offered no reply. - - Added event hooking and cvar samples to sample_mm. - - Added new cvar, mm_pluginsfile, which defaults to - "addons/metamod/metaplugins.ini". - - Fixed a bug where multiple vtable patches on the same hook were not - re-patched when removed. This caused a crash when two hooks were declared on - one function, the first was removed, and the original function was then - called. - - Fixed "meta clear" not unloading all plugins. - - Fixed Metamod:Source loading plugins with a higher current API version. - - Fixed whitespace being parsed in metaplugins.ini. - - Fixed bug where SourceHook tried to patch already destroyed/unavailable - memory. - - Bumped Plugin API version to 6. - -2005/05/06 1.00-RC1: - - Initial release. diff --git a/sourcemm/episode1/console.cpp b/sourcemm/episode1/console.cpp deleted file mode 100644 index 64cb498..0000000 --- a/sourcemm/episode1/console.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#include "console.h" -#include "provider_ep1.h" - -using namespace SourceHook; - -SMConVarAccessor g_SMConVarAccessor; - -class CAlwaysRegisterableCommand : public ConCommandBase -{ -public: - CAlwaysRegisterableCommand() - { - Create("metamod_eternal", NULL, FCVAR_UNREGISTERED|FCVAR_GAMEDLL); - } - bool IsRegistered( void ) const - { - return false; - } - void BringToFront() - { - // First, let's try to find us! - ConCommandBase *pPtr = icvar->GetCommands(); - - if (pPtr == this) - { - // We are already at the beginning; Nothing to do - return; - } - - while (pPtr) - { - if (pPtr == this) - { - break; - } - ConCommandBase *pPrev = NULL; - while (pPtr) - { - if (pPtr == this) - { - break; - } - pPrev = pPtr; - pPtr = const_cast(pPtr->GetNext()); - } - if (pPrev && pPtr == this) - { - pPrev->SetNext(m_pNext); // Remove us from the list - } - // Now, register us - SetNext(NULL); - icvar->RegisterConCommandBase(this); - } - } -} s_EternalCommand; - -bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) -{ - m_RegisteredCommands.push_back(pCommand); - pCommand->SetNext(NULL); - icvar->RegisterConCommandBase(pCommand); - - return true; -} - -bool SMConVarAccessor::Register(ConCommandBase *pCommand) -{ - pCommand->SetNext(NULL); - icvar->RegisterConCommandBase(pCommand); - - return true; -} - -void SMConVarAccessor::MarkCommandsAsGameDLL() -{ - for (List::iterator iter = m_RegisteredCommands.begin(); - iter != m_RegisteredCommands.end(); ++iter) - { - (*iter)->AddFlags(FCVAR_GAMEDLL); - } -} - -void SMConVarAccessor::UnregisterGameDLLCommands() -{ - ConCommandBase *begin = icvar->GetCommands(); - ConCommandBase *iter = begin; - ConCommandBase *prev = NULL; - while (iter) - { - /* Watch out for the ETERNAL COMMAND! */ - if (iter != &s_EternalCommand && iter->IsBitSet(FCVAR_GAMEDLL)) - { - /* Remove it! */ - if (iter == begin) - { - s_EternalCommand.BringToFront(); - iter = const_cast(iter->GetNext()); - s_EternalCommand.SetNext(iter); - prev = &s_EternalCommand; - continue; - } - else - { - iter = const_cast(iter->GetNext()); - prev->SetNext(iter); - continue; - } - } - prev = iter; - iter = const_cast(iter->GetNext()); - } -} - -void SMConVarAccessor::Unregister(ConCommandBase *pCommand) -{ - ConCommandBase *ptr = icvar->GetCommands(); - - if (ptr == pCommand) - { - s_EternalCommand.BringToFront(); - s_EternalCommand.SetNext(const_cast(pCommand->GetNext())); - } - else - { - /* Find us and unregister us */ - ConCommandBase *pPrev = NULL; - while (ptr) - { - if (ptr == pCommand) - { - break; - } - pPrev = ptr; - ptr = const_cast(ptr->GetNext()); - } - if (pPrev && ptr == pCommand) - { - pPrev->SetNext(const_cast(pCommand->GetNext())); - } - } -} - diff --git a/sourcemm/episode1/console.h b/sourcemm/episode1/console.h deleted file mode 100644 index a446be6..0000000 --- a/sourcemm/episode1/console.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_CONSOLE_MMS_H_ -#define _INCLUDE_CONSOLE_MMS_H_ - -#include -#include -#include "convar_smm.h" -#include - -class SMConVarAccessor : public IConCommandBaseAccessor -{ -public: - bool RegisterConCommandBase(ConCommandBase *pCommand); - bool Register(ConCommandBase *pCommand); - void MarkCommandsAsGameDLL(); - void Unregister(ConCommandBase *pCommand); - void UnregisterGameDLLCommands(); -private: - SourceHook::List m_RegisteredCommands; -}; - -extern SMConVarAccessor g_SMConVarAccessor; - -#endif //_INCLUDE_CONSOLE_MMS_H_ - diff --git a/sourcemm/episode1/convar_smm.h b/sourcemm/episode1/convar_smm.h deleted file mode 100644 index 8e5dd82..0000000 --- a/sourcemm/episode1/convar_smm.h +++ /dev/null @@ -1,523 +0,0 @@ -//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// -// -// Purpose: -// -// $Workfile: $ -// $Date: 2007-02-08 04:19:19 -0500 (Thu, 08 Feb 2007) $ -// -//----------------------------------------------------------------------------- -// $NoKeywords: $ -//=============================================================================// - -#ifndef CONVAR_H -#define CONVAR_H -#if _WIN32 -#pragma once -#endif - -#include "tier0/dbg.h" - -#ifdef _WIN32 -#define FORCEINLINE_CVAR FORCEINLINE -#elif _LINUX -#define FORCEINLINE_CVAR __inline__ FORCEINLINE -#else -#error "implement me" -#endif - -// The default, no flags at all -#define FCVAR_NONE 0 - -// Command to ConVars and ConCommands -// ConVar Systems -#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. -#define FCVAR_LAUNCHER (1<<1) // defined by launcher -#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL -#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL -#define FCVAR_MATERIAL_SYSTEM (1<<4) // Defined by the material system. -#define FCVAR_DATACACHE (1<<19) // Defined by the datacache system. -#define FCVAR_STUDIORENDER (1<<15) // Defined by the studiorender system. -#define FCVAR_FILESYSTEM (1<<21) // Defined by the file system. -#define FCVAR_PLUGIN (1<<18) // Defined by a 3rd party plugin. -#define FCVAR_TOOLSYSTEM (1<<20) // Defined by an IToolSystem library -#define FCVAR_SOUNDSYSTEM (1<<23) // Defined by the soundsystem library -#define FCVAR_INPUTSYSTEM (1<<25) // Defined by the inputsystem dll -#define FCVAR_NETWORKSYSTEM (1<<26) // Defined by the network system -// NOTE!! if you add a cvar system, add it here too!!!! -// the engine lacks a cvar flag, but needs it for xbox -// an engine cvar is thus a cvar not marked with any other system -#define FCVAR_NON_ENGINE ((FCVAR_LAUNCHER|FCVAR_GAMEDLL|FCVAR_CLIENTDLL|FCVAR_MATERIAL_SYSTEM|FCVAR_DATACACHE|FCVAR_STUDIORENDER|FCVAR_FILESYSTEM|FCVAR_PLUGIN|FCVAR_TOOLSYSTEM|FCVAR_SOUNDSYSTEM|FCVAR_INPUTSYSTEM|FCVAR_NETWORKSYSTEM)) - -// ConVar only -#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value -#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. -#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc -#define FCVAR_NOTIFY (1<<8) // notifies players when changed -#define FCVAR_USERINFO (1<<9) // changes the client's info string -#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats - -#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). -#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log -#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar - -// It's a ConVar that's shared between the client and the server. -// At signon, the values of all such ConVars are sent from the server to the client (skipped for local -// client, of course ) -// If a change is requested it must come from the console (i.e., no remote client changes) -// If a value is changed while a server is active, it's replicated to all connected clients -#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time -#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file -#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles - -#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server - -#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox - - -// #define FCVAR_AVAILABLE (1<<27) -// #define FCVAR_AVAILABLE (1<<28) -// #define FCVAR_AVAILABLE (1<<29) -// #define FCVAR_AVAILABLE (1<<30) -// #define FCVAR_AVAILABLE (1<<31) - - -class ConVar; -class ConCommand; -class ConCommandBase; - -// Any executable that wants to use ConVars need to implement one of -// these to hook up access to console variables. -class IConCommandBaseAccessor -{ -public: - // Flags is a combination of FCVAR flags in cvar.h. - // hOut is filled in with a handle to the variable. - virtual bool RegisterConCommandBase( ConCommandBase *pVar )=0; -}; - - -// You don't have to instantiate one of these, just call its -// OneTimeInit function when your executable is initializing. -class ConCommandBaseMgr -{ -public: - // Call this ONCE when the executable starts up. - static void OneTimeInit( IConCommandBaseAccessor *pAccessor ); -#ifdef _XBOX - static bool Fixup( ConCommandBase* pConCommandBase ); -#ifndef _RETAIL - static void PublishCommands( bool bForce ); -#endif -#endif -}; - -// Called when a ConVar changes value -typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString ); - -// Called when a ConCommand needs to execute -typedef void ( *FnCommandCallback )( void ); - -#define COMMAND_COMPLETION_MAXITEMS 64 -#define COMMAND_COMPLETION_ITEM_LENGTH 64 - -// Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings -typedef int ( *FnCommandCompletionCallback )( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); - -//----------------------------------------------------------------------------- -// Purpose: The base console invoked command/cvar interface -//----------------------------------------------------------------------------- -class ConCommandBase -{ - friend class ConCommandBaseMgr; - friend class CCvar; - friend class ConVar; - friend class ConCommand; - -public: - ConCommandBase( void ); - ConCommandBase( char const *pName, char const *pHelpString = 0, - int flags = 0 ); - - virtual ~ConCommandBase( void ); - - virtual bool IsCommand( void ) const; - - // Check flag - virtual bool IsBitSet( int flag ) const; - // Set flag - virtual void AddFlags( int flags ); - - // Return name of cvar - virtual char const *GetName( void ) const; - - // Return help text for cvar - virtual char const *GetHelpText( void ) const; - - // Deal with next pointer - const ConCommandBase *GetNext( void ) const; - void SetNext( ConCommandBase *next ); - - virtual bool IsRegistered( void ) const; - - // Global methods - static ConCommandBase const *GetCommands( void ); - static void AddToList( ConCommandBase *var ); - static void RemoveFlaggedCommands( int flag ); - static void RevertFlaggedCvars( int flag ); - static ConCommandBase const *FindCommand( char const *name ); - -protected: - virtual void Create( char const *pName, char const *pHelpString = 0, - int flags = 0 ); - - // Used internally by OneTimeInit to initialize. - virtual void Init(); - - // Internal copy routine ( uses new operator from correct module ) - char *CopyString( char const *from ); - - // Next ConVar in chain - ConCommandBase *m_pNext; - -private: - // Has the cvar been added to the global list? - bool m_bRegistered; - - // Static data - char const *m_pszName; - char const *m_pszHelpString; - - // ConVar flags - int m_nFlags; - -protected: - - // ConVars add themselves to this list for the executable. Then ConVarMgr::Init() runs through - // all the console variables and registers them. - static ConCommandBase *s_pConCommandBases; - - // ConVars in this executable use this 'global' to access values. - static IConCommandBaseAccessor *s_pAccessor; -}; - -//----------------------------------------------------------------------------- -// Purpose: The console invoked command -//----------------------------------------------------------------------------- -class ConCommand : public ConCommandBase -{ -friend class ConCommandBaseMgr; -friend class CCvar; -#ifdef _STATIC_LINKED -friend class G_ConCommand; -friend class C_ConCommand; -friend class M_ConCommand; -friend class S_ConCommand; -friend class D_ConCommand; -#endif - -public: - typedef ConCommandBase BaseClass; - - ConCommand( void ); - ConCommand( char const *pName, FnCommandCallback callback, - char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); - - virtual ~ConCommand( void ); - - virtual bool IsCommand( void ) const; - - virtual int AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); - - virtual bool CanAutoComplete( void ); - - // Invoke the function - virtual void Dispatch( void ); -private: - virtual void Create( char const *pName, FnCommandCallback callback, - char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); - - // Call this function when executing the command - FnCommandCallback m_fnCommandCallback; - - FnCommandCompletionCallback m_fnCompletionCallback; - bool m_bHasCompletionCallback; -public: - FnCommandCallback GetCallback() { return m_fnCommandCallback; } -}; - -//----------------------------------------------------------------------------- -// Purpose: A console variable -//----------------------------------------------------------------------------- -class ConVar : public ConCommandBase -{ -friend class ConCommandBaseMgr; -friend class CCvar; -friend class CDefaultCvar; -#ifdef _STATIC_LINKED -friend class G_ConVar; -friend class C_ConVar; -friend class M_ConVar; -friend class S_ConVar; -friend class D_ConVar; -#endif - -public: - typedef ConCommandBase BaseClass; - - ConVar( char const *pName, char const *pDefaultValue, int flags = 0); - - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, FnChangeCallback callback ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, - FnChangeCallback callback ); - - virtual ~ConVar( void ); - - virtual bool IsBitSet( int flag ) const; - virtual char const* GetHelpText( void ) const; - virtual bool IsRegistered( void ) const; - virtual char const *GetName( void ) const; - virtual void AddFlags( int flags ); - virtual bool IsCommand( void ) const; - - // Install a change callback (there shouldn't already be one....) - void InstallChangeCallback( FnChangeCallback callback ); - - // Retrieve value - FORCEINLINE_CVAR float GetFloat( void ) const; - FORCEINLINE_CVAR int GetInt( void ) const; - FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } - FORCEINLINE_CVAR char const *GetString( void ) const; - - // Any function that allocates/frees memory needs to be virtual or else you'll have crashes - // from alloc/free across dll/exe boundaries. - - // These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue). - virtual void SetValue( char const *value ); - virtual void SetValue( float value ); - virtual void SetValue( int value ); - - // Reset to default value - void Revert( void ); - - // True if it has a min/max setting - bool GetMin( float& minVal ) const; - bool GetMax( float& maxVal ) const; - char const *GetDefault( void ) const; - - static void RevertAll( void ); -private: - // Called by CCvar when the value of a var is changing. - virtual void InternalSetValue(char const *value); - // For CVARs marked FCVAR_NEVER_AS_STRING - virtual void InternalSetFloatValue( float fNewValue ); - virtual void InternalSetIntValue( int nValue ); - - virtual bool ClampValue( float& value ); - virtual void ChangeStringValue( char const *tempVal ); - - virtual void Create( char const *pName, char const *pDefaultValue, int flags = 0, - char const *pHelpString = 0, bool bMin = false, float fMin = 0.0, - bool bMax = false, float fMax = false, FnChangeCallback callback = 0 ); - - // Used internally by OneTimeInit to initialize. - virtual void Init(); - -private: - - // This either points to "this" or it points to the original declaration of a ConVar. - // This allows ConVars to exist in separate modules, and they all use the first one to be declared. - // m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar). - ConVar *m_pParent; - - // Static data - char const *m_pszDefaultValue; - - // Value - // Dynamically allocated - char *m_pszString; - int m_StringLength; - - // Values - float m_fValue; - int m_nValue; - - // Min/Max values - bool m_bHasMin; - float m_fMinVal; - bool m_bHasMax; - float m_fMaxVal; - - // Call this function when ConVar changes - FnChangeCallback m_fnChangeCallback; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as a float -// Output : float -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR float ConVar::GetFloat( void ) const -{ - return m_pParent->m_fValue; -} - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as an int -// Output : int -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR int ConVar::GetInt( void ) const -{ - return m_pParent->m_nValue; -} - - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. -// Output : char const * -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR char const *ConVar::GetString( void ) const -{ - if ( m_nFlags & FCVAR_NEVER_AS_STRING ) - { - return "FCVAR_NEVER_AS_STRING"; - } - - return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : ""; -} - - -#ifdef _STATIC_LINKED -// identifies subsystem via piggybacking constructors with flags -class G_ConCommand : public ConCommand -{ -public: - G_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_GAMEDLL, completionFunc) {} -}; - -class C_ConCommand : public ConCommand -{ -public: - C_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_CLIENTDLL, completionFunc) {} -}; - -class M_ConCommand : public ConCommand -{ -public: - M_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_MATERIAL_SYSTEM, completionFunc) {} -}; - -class S_ConCommand : public ConCommand -{ -public: - S_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_STUDIORENDER, completionFunc) {} -}; - -class D_ConCommand : public ConCommand -{ -public: - D_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_DATACACHE, completionFunc) {} -}; - -typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString ); -typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString ); -typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString ); -typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString ); -typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString ); - -class G_ConVar : public ConVar -{ -public: - G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, (FnChangeCallback)callback ) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class C_ConVar : public ConVar -{ -public: - C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, (FnChangeCallback)callback ) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class M_ConVar : public ConVar -{ -public: - M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, (FnChangeCallback)callback ) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class S_ConVar : public ConVar -{ -public: - S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, (FnChangeCallback)callback ) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, S_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class D_ConVar : public ConVar -{ -public: - D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, (FnChangeCallback)callback ) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, D_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -// redirect these declarations to their specific subsystem -#ifdef GAME_DLL -#define ConCommand G_ConCommand -#define ConVar G_ConVar -#endif -#ifdef CLIENT_DLL -#define ConCommand C_ConCommand -#define ConVar C_ConVar -#endif -#ifdef MATERIALSYSTEM_DLL -#define ConCommand M_ConCommand -#define ConVar M_ConVar -#endif -#ifdef STUDIORENDER_DLL -#define ConCommand S_ConCommand -#define ConVar S_ConVar -#endif -#ifdef DATACACHE_DLL -#define ConCommand D_ConCommand -#define ConVar D_ConVar -#endif -#endif // _STATIC_LINKED - -//----------------------------------------------------------------------------- -// Purpose: Utility to quicky generate a simple console command -//----------------------------------------------------------------------------- -#define CON_COMMAND( name, description ) \ - static void name(); \ - static ConCommand name##_command( #name, name, description ); \ - static void name() - -//----------------------------------------------------------------------------- -// Purpose: Utility to quicky generate a simple console command -//----------------------------------------------------------------------------- -#define CON_COMMAND_F( name, description, flags ) \ - static void name(); \ - static ConCommand name##_command( #name, name, description, flags ); \ - static void name() - - -#endif // CONVAR_H diff --git a/sourcemm/episode1/msvc8/sourcemm.sln b/sourcemm/episode1/msvc8/sourcemm.sln deleted file mode 100644 index b338452..0000000 --- a/sourcemm/episode1/msvc8/sourcemm.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.ActiveCfg = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.Build.0 = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.ActiveCfg = Release|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/sourcemm/episode1/msvc8/sourcemm.vcproj b/sourcemm/episode1/msvc8/sourcemm.vcproj deleted file mode 100644 index 2f620e3..0000000 --- a/sourcemm/episode1/msvc8/sourcemm.vcproj +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/episode1/provider_ep1.cpp b/sourcemm/episode1/provider_ep1.cpp deleted file mode 100644 index 8647dd6..0000000 --- a/sourcemm/episode1/provider_ep1.cpp +++ /dev/null @@ -1,590 +0,0 @@ - -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#include -#include "convar_smm.h" -#include -#include -#include -#include -#include -#include "../metamod_util.h" -#include "provider_ep1.h" -#include "console.h" -#include "metamod_console.h" -#include "vsp_listener.h" - -/* Types */ -typedef void (*CONPRINTF_FUNC)(const char *, ...); -struct UsrMsgInfo -{ - int size; - String name; -}; -/* Imports */ -#undef CommandLine -DLL_IMPORT ICommandLine *CommandLine(); -/* Functions */ -CONPRINTF_FUNC ExtractRemotePrinter(); -bool CacheUserMessages(); -void ClientCommand(edict_t *pEdict); -void _ServerCommand(); -/* Variables */ -bool usermsgs_extracted = false; -CVector usermsgs_list; -CONPRINTF_FUNC echo_msg_func = NULL; -ICvar *icvar = NULL; -ISmmAPI *metamod_api = NULL; -IVEngineServer *engine = NULL; -IServerGameClients *gameclients = NULL; -VSPListener g_VspListener; -BaseProvider g_Ep1Provider; -IMetamodSourceProvider *provider = &g_Ep1Provider; - -SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); - -void BaseProvider::ConsolePrint(const char *str) -{ - if (echo_msg_func != NULL) - { - echo_msg_func("%s", str); - } - else - { - Msg("%s", str); - } -} - -void BaseProvider::Notify_DLLInit_Pre(void *gamedll, - CreateInterfaceFn engineFactory, - CreateInterfaceFn serverFactory) -{ - server = (IServerGameDLL *)gamedll; - engine = (IVEngineServer *)((engineFactory)(INTERFACEVERSION_VENGINESERVER, NULL)); - if (!engine) - { - Error("Could not find IVEngineServer! Metamod cannot load."); - return; - } - icvar = (ICvar *)((engineFactory)(VENGINE_CVAR_INTERFACE_VERSION, NULL)); - if (!icvar) - { - Error("Could not find ICvar! Metamod cannot load."); - return; - } - - if ((gameclients = (IServerGameClients *)(serverFactory("ServerGameClients003", NULL))) - == NULL) - { - gameclients = (IServerGameClients *)(serverFactory("ServerGameClients004", NULL)); - } - - echo_msg_func = ExtractRemotePrinter(); - usermsgs_extracted = CacheUserMessages(); - - if (gameclients) - { - SH_ADD_HOOK_STATICFUNC(IServerGameClients, ClientCommand, gameclients, ClientCommand, false); - } - - ConCommandBaseMgr::OneTimeInit(&g_SMConVarAccessor); -} - -void BaseProvider::Notify_DLLShutdown_Pre() -{ - g_SMConVarAccessor.MarkCommandsAsGameDLL(); - g_SMConVarAccessor.UnregisterGameDLLCommands(); -} - -bool BaseProvider::IsRemotePrintingAvailable() -{ - return (echo_msg_func != NULL); -} - -void BaseProvider::ClientConsolePrint(edict_t *client, const char *message) -{ - engine->ClientPrintf(client, message); -} - -void BaseProvider::ServerCommand(const char *cmd) -{ - engine->ServerCommand(cmd); -} - -const char *BaseProvider::GetConVarString(ConVar *convar) -{ - return convar->GetString(); -} - -bool BaseProvider::IsConCommandBaseACommand(ConCommandBase *pCommand) -{ - return pCommand->IsCommand(); -} - - -bool BaseProvider::IsSourceEngineBuildCompatible(int build) -{ - return (build == SOURCE_ENGINE_ORIGINAL - || build == SOURCE_ENGINE_EPISODEONE); -} - -const char *BaseProvider::GetCommandLineValue(const char *key, const char *defval) -{ - if (key[0] == '-' || key[0] == '+') - { - return CommandLine()->ParmValue(key, defval); - } - else - { - const char *val; - if ((val = icvar->GetCommandLineValue(key)) == NULL) - { - return defval; - } - - return val; - } -} - -int BaseProvider::TryServerGameDLL(const char *iface) -{ - if (strncmp(iface, "ServerGameDLL", 13) != 0) - { - return 0; - } - - return atoi(&iface[13]); -} - -bool BaseProvider::LogMessage(const char *buffer) -{ - if (!engine) - { - return false; - } - - engine->LogPrint(buffer); - - return true; -} - -bool BaseProvider::GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo) -{ - SourceHook::MemFuncInfo mfi = {true, -1, 0, 0}; - - if (hook == ProvidedHook_LevelInit) - { - SourceHook::GetFuncInfo(&IServerGameDLL::LevelInit, mfi); - } - else if (hook == ProvidedHook_LevelShutdown) - { - SourceHook::GetFuncInfo(&IServerGameDLL::LevelShutdown, mfi); - } - else if (hook == ProvidedHook_GameInit) - { - SourceHook::GetFuncInfo(&IServerGameDLL::GameInit, mfi); - } - else if (hook == ProvidedHook_DLLShutdown) - { - SourceHook::GetFuncInfo(&IServerGameDLL::DLLShutdown, mfi); - } - else if (hook == ProvidedHook_DLLInit) - { - SourceHook::GetFuncInfo(&IServerGameDLL::DLLInit, mfi); - } - - *pInfo = mfi; - - return (mfi.thisptroffs >= 0); -} - -void BaseProvider::DisplayError(const char *fmt, ...) -{ - va_list ap; - char buffer[2048]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - Error(buffer); -} - -void BaseProvider::DisplayWarning(const char *fmt, ...) -{ - va_list ap; - char buffer[2048]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - Warning(buffer); -} - -IConCommandBaseAccessor *BaseProvider::GetConCommandBaseAccessor() -{ - return &g_SMConVarAccessor; -} - -bool BaseProvider::RegisterConCommandBase(ConCommandBase *pCommand) -{ - return g_SMConVarAccessor.Register(pCommand); -} - -void BaseProvider::UnregisterConCommandBase(ConCommandBase *pCommand) -{ - return g_SMConVarAccessor.Unregister(pCommand); -} - -int BaseProvider::GetUserMessageCount() -{ - if (!usermsgs_extracted) - { - return -1; - } - - return (int)usermsgs_list.size(); -} - -int BaseProvider::FindUserMessage(const char *name, int *size) -{ - for (size_t i = 0; i < usermsgs_list.size(); i++) - { - if (usermsgs_list[i].name.compare(name) == 0) - { - if (size) - { - *size = usermsgs_list[i].size; - } - return (int)i; - } - } - - return -1; -} - -const char *BaseProvider::GetUserMessage(int index, int *size) -{ - if (!usermsgs_extracted || index < 0 || index >= (int)usermsgs_list.size()) - { - return NULL; - } - - if (size) - { - *size = usermsgs_list[index].size; - } - - return usermsgs_list[index].name.c_str(); -} - -const char *BaseProvider::GetGameDescription() -{ - return server->GetGameDescription(); -} - -ConVar *BaseProvider::CreateConVar(const char *name, - const char *defval, - const char *help, - int flags) -{ - int newflags = 0; - if (flags & ConVarFlag_Notify) - { - newflags |= FCVAR_NOTIFY; - } - if (flags & ConVarFlag_Replicated) - { - newflags |= FCVAR_REPLICATED; - } - if (flags & ConVarFlag_SpOnly) - { - newflags |= FCVAR_SPONLY; - } - - return new ConVar(name, defval, newflags, help); -} - -IServerPluginCallbacks *BaseProvider::GetVSPCallbacks(const char *iface) -{ - g_VspListener.SetLoadable(true); - return &g_VspListener; -} - -class GlobCommand : public IMetamodSourceCommandInfo -{ -public: - unsigned int GetArgCount() - { - return engine->Cmd_Argc() - 1; - } - - const char *GetArg(unsigned int num) - { - return engine->Cmd_Argv(num); - } - - const char *GetArgString() - { - return engine->Cmd_Args(); - } -}; - -CON_COMMAND(meta, "Metamod:Source control commands") -{ - GlobCommand cmd; - Command_Meta(&cmd); -} - -void ClientCommand(edict_t *pEdict) -{ - GlobCommand cmd; - - if (strcmp(cmd.GetArg(0), "meta") == 0) - { - Command_ClientMeta(pEdict, &cmd); - } -} - -////////////////////////////////////////////////////////////////////////// -//THERE BE HAX HERE!!!! DON'T TELL ALFRED, BUT GABE WANTED IT THAT WAY. // -// (note: you can find the offset by looking for the text // -// "Echo text to console", you'll find the callback cmd pushed on the // -// stack.) // -////////////////////////////////////////////////////////////////////////// - -#define SIGLEN 8 -#define ENGINE486_SIG "\x55\x89\xE5\x53\x83\xEC\x14\xBB" -#define ENGINE486_OFFS 40 -#define ENGINE686_SIG "\x53\x83\xEC\x08\xBB\x01\x00\x00" -#define ENGINE686_OFFS 50 -#define ENGINEAMD_SIG "\x53\x51\xBB\x01\x00\x00\x00\x51" -#define ENGINEAMD_OFFS 47 -#define ENGINEW32_SIG "\xA1\x2A\x2A\x2A\x2A\x56\xBE\x01" -#define ENGINEW32_OFFS 38 -#define IA32_CALL 0xE8 - -bool vcmp(const void *_addr1, const void *_addr2, size_t len) -{ - unsigned char *addr1 = (unsigned char *)_addr1; - unsigned char *addr2 = (unsigned char *)_addr2; - - for (size_t i=0; iGetCommands(); - unsigned char *ptr = NULL; - FnCommandCallback callback = NULL; - int offs = 0; - - while (pBase) - { - if (strcmp(pBase->GetName(), "echo") == 0) - { - callback = ((ConCommand *)pBase)->GetCallback(); - ptr = (unsigned char *)callback; -#ifdef OS_LINUX - if (vcmp(ptr, ENGINE486_SIG, SIGLEN)) - { - offs = ENGINE486_OFFS; - } - else if (vcmp(ptr, ENGINE686_SIG, SIGLEN)) - { - offs = ENGINE686_OFFS; - } - else if (vcmp(ptr, ENGINEAMD_SIG, SIGLEN)) - { - offs = ENGINEAMD_OFFS; - } -#elif defined OS_WIN32 // Only one Windows engine binary so far... - if (vcmp(ptr, ENGINEW32_SIG, SIGLEN)) - { - offs = ENGINEW32_OFFS; - } -#endif - - if (!offs || ptr[offs - 1] != IA32_CALL) - { - return NULL; - } - //get the relative offset - void *addr = *((void **)(ptr + offs)); - //add the base offset, to the ip (which is the address+offset + 4 bytes for next instruction) - return (CONPRINTF_FUNC)((unsigned long)addr + (unsigned long)(ptr + offs) + 4); - } - pBase = const_cast(pBase->GetNext()); - } - - return NULL; -} - -////////////////////////////////////////////////////////////////////// -// EVEN MORE HACKS HERE! YOU HAVE BEEN WARNED! // -// Signatures necessary in finding the pointer to the CUtlDict that // -// stores user message information. // -// IServerGameDLL::GetUserMessageInfo() normally crashes with bad // -// message indices. This is our answer to it. Yuck! <:-( // -////////////////////////////////////////////////////////////////////// -#ifdef OS_WIN32 - /* General Windows sig */ - #define MSGCLASS_SIGLEN 7 - #define MSGCLASS_SIG "\x8B\x0D\x2A\x2A\x2A\x2A\x56" - #define MSGCLASS_OFFS 2 - - /* Dystopia Wimdows hack */ - #define MSGCLASS2_SIGLEN 16 - #define MSGCLASS2_SIG "\x56\x8B\x74\x24\x2A\x85\xF6\x7C\x2A\x3B\x35\x2A\x2A\x2A\x2A\x7D" - #define MSGCLASS2_OFFS 11 - - /* Windows frame pointer sig */ - #define MSGCLASS3_SIGLEN 18 - #define MSGCLASS3_SIG "\x55\x8B\xEC\x51\x89\x2A\x2A\x8B\x2A\x2A\x50\x8B\x0D\x2A\x2A\x2A\x2A\xE8" - #define MSGCLASS3_OFFS 13 -#elif defined OS_LINUX - /* No frame pointer sig */ - #define MSGCLASS_SIGLEN 14 - #define MSGCLASS_SIG "\x53\x83\xEC\x2A\x8B\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" - #define MSGCLASS_OFFS 9 - - /* Frame pointer sig */ - #define MSGCLASS2_SIGLEN 16 - #define MSGCLASS2_SIG "\x55\x89\xE5\x53\x83\xEC\x2A\x8B\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" - #define MSGCLASS2_OFFS 11 -#endif - -struct UserMessage -{ - int size; - const char *name; -}; - -typedef CUtlDict UserMsgDict; - -/* This is the ugliest function in all of SourceMM */ -bool CacheUserMessages() -{ - /* Get address of original GetUserMessageInfo() */ - char *vfunc = (char *)SH_GET_ORIG_VFNPTR_ENTRY(server, &IServerGameDLL::GetUserMessageInfo); - - /* Oh dear, we have a relative jump on our hands - * PVK II on Windows made me do this, but I suppose it doesn't hurt to check this on Linux too... - */ - if (*vfunc == '\xE9') - { - /* Get address from displacement... - * - * Add 5 because it's relative to next instruction: - * Opcode <1 byte> + 32-bit displacement <4 bytes> - */ - vfunc += *reinterpret_cast(vfunc + 1) + 5; - } - - CUtlDict *dict = NULL; - - if (vcmp(vfunc, MSGCLASS_SIG, MSGCLASS_SIGLEN)) - { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - } - else if (vcmp(vfunc, MSGCLASS2_SIG, MSGCLASS2_SIGLEN)) - { - #ifdef OS_WIN32 - /* If we get here, the code is possibly inlined like in Dystopia */ - - /* Get the address of the CUtlRBTree */ - char *rbtree = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* CUtlDict should be 8 bytes before the CUtlRBTree (hacktacular!) */ - dict = reinterpret_cast(rbtree - 8); - #elif defined OS_LINUX - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - #ifdef OS_WIN32 - } - else if (vcmp(vfunc, MSGCLASS3_SIG, MSGCLASS3_SIGLEN)) - { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS3_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - } - - if (dict) - { - int msg_count = dict->Count(); - - /* Ensure that count is within bounds of an unsigned byte, because that's what engine supports */ - if (msg_count < 0 || msg_count > 255) - { - return false; - } - - UserMessage *msg; - UsrMsgInfo u_msg; - - /* Cache messages in our CUtlDict */ - for (int i = 0; i < msg_count; i++) - { - msg = dict->Element(i); - u_msg.name = msg->name; - u_msg.size = msg->size; - usermsgs_list.push_back(u_msg); - } - - return true; - } - - return false; -} - diff --git a/sourcemm/episode1/provider_ep1.h b/sourcemm/episode1/provider_ep1.h deleted file mode 100644 index 0a22f10..0000000 --- a/sourcemm/episode1/provider_ep1.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ -#define _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ - -#include -#include -#include -#include "ISmmAPI.h" -#include "metamod_provider.h" -#include "metamod_oslink.h" - -using namespace SourceMM; -using namespace SourceHook; - -class BaseProvider : public IMetamodSourceProvider -{ -public: - virtual bool IsSourceEngineBuildCompatible(int build); - virtual bool GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo); - virtual bool LogMessage(const char *buffer); - virtual const char *GetCommandLineValue(const char *key, const char *defval); - virtual void ConsolePrint(const char *msg); - virtual bool IsRemotePrintingAvailable(); - virtual void ClientConsolePrint(edict_t *client, const char *msg); - virtual IServerPluginCallbacks *GetVSPCallbacks(const char *iface); - virtual void DisplayError(const char *fmt, ...); - virtual void DisplayWarning(const char *fmt, ...); - virtual int TryServerGameDLL(const char *iface); - virtual void Notify_DLLInit_Pre(void *gamedll, - CreateInterfaceFn engineFactory, - CreateInterfaceFn serverFactory); - void Notify_DLLShutdown_Pre(); - virtual void ServerCommand(const char *cmd); - virtual ConVar *CreateConVar(const char *name, - const char *defval, - const char *help, - int flags); - virtual const char *GetConVarString(ConVar *convar); - virtual const char *GetGameDescription(); - virtual IConCommandBaseAccessor *GetConCommandBaseAccessor(); - virtual bool RegisterConCommandBase(ConCommandBase *pCommand); - virtual void UnregisterConCommandBase(ConCommandBase *pCommand); - virtual bool IsConCommandBaseACommand(ConCommandBase *pCommand); - virtual int GetUserMessageCount(); - virtual int FindUserMessage(const char *name, int *size=NULL); - virtual const char *GetUserMessage(int index, int *size=NULL); -}; - -extern IVEngineServer *engine; -extern IServerGameDLL *server; -extern IServerGameClients *gameclients; -extern ICvar *icvar; - -#endif //_INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ - diff --git a/sourcemm/episode1/vsp_listener.cpp b/sourcemm/episode1/vsp_listener.cpp deleted file mode 100644 index 370a66d..0000000 --- a/sourcemm/episode1/vsp_listener.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#include "vsp_listener.h" -#include "svn_version.h" -#include "metamod.h" - -using namespace SourceMM; - -VSPListener::VSPListener() -{ - m_bLoaded = false; - m_bLoadable = false; -} - -void VSPListener::ClientActive(edict_t *pEntity) -{ -} - -PLUGIN_RESULT VSPListener::ClientCommand(edict_t *pEntity) -{ - return PLUGIN_CONTINUE; -} - -PLUGIN_RESULT VSPListener::ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::ClientDisconnect(edict_t *pEntity) -{ -} - -void VSPListener::ClientPutInServer(edict_t *pEntity, char const *playername) -{ -} - -void VSPListener::ClientSettingsChanged(edict_t *pEdict) -{ -} - -void VSPListener::SetCommandClient(int index) -{ -} - -void VSPListener::GameFrame(bool simulating) -{ -} - -const char *VSPListener::GetPluginDescription() -{ - return "Metamod:Source Interface v" SVN_FILE_VERSION_STRING; -} - -bool VSPListener::IsLoaded() -{ - return m_bLoaded; -} - -void VSPListener::LevelInit(char const *pMapName) -{ -} - -void VSPListener::LevelShutdown() -{ -} - -PLUGIN_RESULT VSPListener::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::Pause() -{ -} - -void VSPListener::UnPause() -{ -} - -void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) -{ -} - -void VSPListener::Unload() -{ -} - -void VSPListener::SetLoadable(bool set) -{ - m_bLoadable = set; -} - -bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) -{ - if (!m_bLoadable) - { - Warning("Do not manually load Metamod:Source as a Valve Server Plugin\n"); - return false; - } - - if (m_bLoaded) - { - return false; - } - - m_bLoaded = true; - SetLoadable(false); - - g_Metamod.NotifyVSPListening(this); - - return true; -} - diff --git a/sourcemm/episode1/vsp_listener.h b/sourcemm/episode1/vsp_listener.h deleted file mode 100644 index 8b5af85..0000000 --- a/sourcemm/episode1/vsp_listener.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ -#define _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ - -#include "iserverplugin.h" - -class VSPListener : public IServerPluginCallbacks -{ -public: - VSPListener(); -public: - virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory); - virtual void Unload(); - virtual void Pause(); - virtual void UnPause(); - virtual const char *GetPluginDescription(); - virtual void LevelInit(char const *pMapName); - virtual void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); - virtual void GameFrame(bool simulating); - virtual void LevelShutdown(void); - virtual void ClientActive(edict_t *pEntity); - virtual void ClientDisconnect(edict_t *pEntity); - virtual void ClientPutInServer(edict_t *pEntity, char const *playername); - virtual void SetCommandClient(int index); - virtual void ClientSettingsChanged(edict_t *pEdict); - virtual PLUGIN_RESULT ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); - virtual PLUGIN_RESULT ClientCommand(edict_t *pEntity); - virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID); -public: - bool IsLoaded(); - void SetLoadable(bool loadable); -private: - bool m_bLoaded; - bool m_bLoadable; -}; - -#endif //_INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ - diff --git a/sourcemm/episode2/console.cpp b/sourcemm/episode2/console.cpp deleted file mode 100644 index ca0e9db..0000000 --- a/sourcemm/episode2/console.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#include "console.h" -#include "provider_ep2.h" - -using namespace SourceHook; - -SMConVarAccessor g_SMConVarAccessor; - -bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) -{ - pCommand->SetNext(NULL); - icvar->RegisterConCommand(pCommand); - - return true; -} - -bool SMConVarAccessor::Register(ConCommandBase *pCommand) -{ - pCommand->SetNext(NULL); - icvar->RegisterConCommand(pCommand); - - return true; -} - -void SMConVarAccessor::Unregister(ConCommandBase *pCommand) -{ - icvar->UnregisterConCommand(pCommand); -} - diff --git a/sourcemm/episode2/console.h b/sourcemm/episode2/console.h deleted file mode 100644 index 004cb8f..0000000 --- a/sourcemm/episode2/console.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_CONSOLE_MMS_H_ -#define _INCLUDE_CONSOLE_MMS_H_ - -#if defined _DEBUG -#define DEBUG2 -#undef _DEBUG -#endif -#include -#include -#include "convar.h" -#include -#if defined DEBUG2 -#undef DEBUG2 -#define _DEBUG -#endif - -class SMConVarAccessor : public IConCommandBaseAccessor -{ -public: - bool RegisterConCommandBase(ConCommandBase *pCommand); - bool Register(ConCommandBase *pCommand); - void Unregister(ConCommandBase *pCommand); -}; - -extern SMConVarAccessor g_SMConVarAccessor; - -#endif //_INCLUDE_CONSOLE_MMS_H_ - diff --git a/sourcemm/episode2/msvc8/sourcemm.sln b/sourcemm/episode2/msvc8/sourcemm.sln deleted file mode 100644 index b338452..0000000 --- a/sourcemm/episode2/msvc8/sourcemm.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.ActiveCfg = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.Build.0 = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.ActiveCfg = Release|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/sourcemm/episode2/msvc8/sourcemm.vcproj b/sourcemm/episode2/msvc8/sourcemm.vcproj deleted file mode 100644 index db2ff0d..0000000 --- a/sourcemm/episode2/msvc8/sourcemm.vcproj +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/episode2/provider_ep2.cpp b/sourcemm/episode2/provider_ep2.cpp deleted file mode 100644 index 00dd8f6..0000000 --- a/sourcemm/episode2/provider_ep2.cpp +++ /dev/null @@ -1,548 +0,0 @@ - -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#if defined _DEBUG -#define DEBUG2 -#undef _DEBUG -#endif -#include -#include -#include -#include -#include -#include -#include -#include "../metamod_util.h" -#include "provider_ep2.h" -#include "console.h" -#include "metamod_console.h" -#include "vsp_listener.h" -#if defined DEBUG2 -#undef DEBUG2 -#define _DEBUG -#endif - -/* Types */ -typedef void (*CONPRINTF_FUNC)(const char *, ...); -struct UsrMsgInfo -{ - int size; - String name; -}; -/* Imports */ -#undef CommandLine -DLL_IMPORT ICommandLine *CommandLine(); -/* Functions */ -bool CacheUserMessages(); -void ClientCommand(edict_t *pEdict, const CCommand &args); -void LocalCommand_Meta(const CCommand &args); -void _ServerCommand(); -/* Variables */ -bool usermsgs_extracted = false; -CVector usermsgs_list; -ICvar *icvar = NULL; -ISmmAPI *metamod_api = NULL; -IVEngineServer *engine = NULL; -IServerGameClients *gameclients = NULL; -VSPListener g_VspListener; -BaseProvider g_Ep1Provider; -IMetamodSourceProvider *provider = &g_Ep1Provider; -List conbases_unreg; -ConCommand meta_local_cmd("meta", LocalCommand_Meta, "Metamod:Source control options"); - -SH_DECL_HOOK2_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *, const CCommand &); - -void BaseProvider::ConsolePrint(const char *str) -{ - ConMsg("%s", str); -} - -void BaseProvider::Notify_DLLInit_Pre(void *gamedll, - CreateInterfaceFn engineFactory, - CreateInterfaceFn serverFactory) -{ - server = (IServerGameDLL *)gamedll; - engine = (IVEngineServer *)((engineFactory)(INTERFACEVERSION_VENGINESERVER, NULL)); - if (!engine) - { - DisplayError("Could not find IVEngineServer! Metamod cannot load."); - return; - } - icvar = (ICvar *)((engineFactory)(CVAR_INTERFACE_VERSION, NULL)); - if (!icvar) - { - DisplayError("Could not find ICvar! Metamod cannot load."); - return; - } - - if ((gameclients = (IServerGameClients *)(serverFactory("ServerGameClients003", NULL))) - == NULL) - { - gameclients = (IServerGameClients *)(serverFactory("ServerGameClients004", NULL)); - } - - RegisterConCommandBase(&meta_local_cmd); - conbases_unreg.push_back(&meta_local_cmd); - - usermsgs_extracted = CacheUserMessages(); - - if (gameclients) - { - SH_ADD_HOOK_STATICFUNC(IServerGameClients, ClientCommand, gameclients, ClientCommand, false); - } -} - -void BaseProvider::Notify_DLLShutdown_Pre() -{ - List::iterator iter; - - for (iter = conbases_unreg.begin(); - iter != conbases_unreg.end(); - iter++) - { - UnregisterConCommandBase((*iter)); - } -} - -bool BaseProvider::IsRemotePrintingAvailable() -{ - return true; -} - -void BaseProvider::ClientConsolePrint(edict_t *client, const char *message) -{ - engine->ClientPrintf(client, message); -} - -void BaseProvider::ServerCommand(const char *cmd) -{ - engine->ServerCommand(cmd); -} - -const char *BaseProvider::GetConVarString(ConVar *convar) -{ - if (convar == NULL) - { - return NULL; - } - - return convar->GetString(); -} - -bool BaseProvider::IsConCommandBaseACommand(ConCommandBase *pCommand) -{ - return pCommand->IsCommand(); -} - - -bool BaseProvider::IsSourceEngineBuildCompatible(int build) -{ - return (build == SOURCE_ENGINE_ORIGINAL - || build == SOURCE_ENGINE_EPISODEONE); -} - -const char *BaseProvider::GetCommandLineValue(const char *key, const char *defval) -{ - if (key[0] == '-' || key[0] == '+') - { - return CommandLine_Tier0()->ParmValue(key, defval); - } - else if (icvar) - { - const char *val; - if ((val = icvar->GetCommandLineValue(key)) == NULL) - { - return defval; - } - - return val; - } - - return NULL; -} - -int BaseProvider::TryServerGameDLL(const char *iface) -{ - if (strncmp(iface, "ServerGameDLL", 13) != 0) - { - return 0; - } - - return atoi(&iface[13]); -} - -bool BaseProvider::LogMessage(const char *buffer) -{ - if (!engine) - { - return false; - } - - engine->LogPrint(buffer); - - return true; -} - -bool BaseProvider::GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo) -{ - SourceHook::MemFuncInfo mfi = {true, -1, 0, 0}; - - if (hook == ProvidedHook_LevelInit) - { - SourceHook::GetFuncInfo(&IServerGameDLL::LevelInit, mfi); - } - else if (hook == ProvidedHook_LevelShutdown) - { - SourceHook::GetFuncInfo(&IServerGameDLL::LevelShutdown, mfi); - } - else if (hook == ProvidedHook_GameInit) - { - SourceHook::GetFuncInfo(&IServerGameDLL::GameInit, mfi); - } - else if (hook == ProvidedHook_DLLShutdown) - { - SourceHook::GetFuncInfo(&IServerGameDLL::DLLShutdown, mfi); - } - else if (hook == ProvidedHook_DLLInit) - { - SourceHook::GetFuncInfo(&IServerGameDLL::DLLInit, mfi); - } - - *pInfo = mfi; - - return (mfi.thisptroffs >= 0); -} - -void BaseProvider::DisplayError(const char *fmt, ...) -{ - va_list ap; - char buffer[2048]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - Error(buffer); -} - -void BaseProvider::DisplayWarning(const char *fmt, ...) -{ - va_list ap; - char buffer[2048]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - Warning(buffer); -} - -IConCommandBaseAccessor *BaseProvider::GetConCommandBaseAccessor() -{ - return &g_SMConVarAccessor; -} - -bool BaseProvider::RegisterConCommandBase(ConCommandBase *pCommand) -{ - return g_SMConVarAccessor.Register(pCommand); -} - -void BaseProvider::UnregisterConCommandBase(ConCommandBase *pCommand) -{ - return g_SMConVarAccessor.Unregister(pCommand); -} - -int BaseProvider::GetUserMessageCount() -{ - if (!usermsgs_extracted) - { - return -1; - } - - return (int)usermsgs_list.size(); -} - -int BaseProvider::FindUserMessage(const char *name, int *size) -{ - for (size_t i = 0; i < usermsgs_list.size(); i++) - { - if (usermsgs_list[i].name.compare(name) == 0) - { - if (size) - { - *size = usermsgs_list[i].size; - } - return (int)i; - } - } - - return -1; -} - -const char *BaseProvider::GetUserMessage(int index, int *size) -{ - if (!usermsgs_extracted || index < 0 || index >= (int)usermsgs_list.size()) - { - return NULL; - } - - if (size) - { - *size = usermsgs_list[index].size; - } - - return usermsgs_list[index].name.c_str(); -} - -const char *BaseProvider::GetGameDescription() -{ - return server->GetGameDescription(); -} - -ConVar *BaseProvider::CreateConVar(const char *name, - const char *defval, - const char *help, - int flags) -{ - int newflags = 0; - if (flags & ConVarFlag_Notify) - { - newflags |= FCVAR_NOTIFY; - } - if (flags & ConVarFlag_Replicated) - { - newflags |= FCVAR_REPLICATED; - } - if (flags & ConVarFlag_SpOnly) - { - newflags |= FCVAR_SPONLY; - } - - ConVar *pVar = new ConVar(name, defval, newflags, help); - - RegisterConCommandBase(pVar); - conbases_unreg.push_back(pVar); - - return pVar; -} - -IServerPluginCallbacks *BaseProvider::GetVSPCallbacks(const char *iface) -{ - g_VspListener.SetLoadable(true); - return &g_VspListener; -} - -class GlobCommand : public IMetamodSourceCommandInfo -{ -public: - GlobCommand(const CCommand *cmd) : m_cmd(cmd) - { - } -public: - unsigned int GetArgCount() - { - return m_cmd->ArgC(); - } - - const char *GetArg(unsigned int num) - { - return m_cmd->Arg(num); - } - - const char *GetArgString() - { - return m_cmd->ArgS(); - } -private: - const CCommand *m_cmd; -}; - -void LocalCommand_Meta(const CCommand &args) -{ - GlobCommand cmd(&args); - Command_Meta(&cmd); -} - -void ClientCommand(edict_t *pEdict, const CCommand &_cmd) -{ - GlobCommand cmd(&_cmd); - - if (strcmp(cmd.GetArg(0), "meta") == 0) - { - Command_ClientMeta(pEdict, &cmd); - } -} - -bool vcmp(const void *_addr1, const void *_addr2, size_t len) -{ - unsigned char *addr1 = (unsigned char *)_addr1; - unsigned char *addr2 = (unsigned char *)_addr2; - - for (size_t i=0; i UserMsgDict; - -/* This is the ugliest function in all of SourceMM */ -bool CacheUserMessages() -{ - /* Get address of original GetUserMessageInfo() */ - char *vfunc = (char *)SH_GET_ORIG_VFNPTR_ENTRY(server, &IServerGameDLL::GetUserMessageInfo); - - /* Oh dear, we have a relative jump on our hands - * PVK II on Windows made me do this, but I suppose it doesn't hurt to check this on Linux too... - */ - if (*vfunc == '\xE9') - { - /* Get address from displacement... - * - * Add 5 because it's relative to next instruction: - * Opcode <1 byte> + 32-bit displacement <4 bytes> - */ - vfunc += *reinterpret_cast(vfunc + 1) + 5; - } - - CUtlDict *dict = NULL; - - if (vcmp(vfunc, MSGCLASS_SIG, MSGCLASS_SIGLEN)) - { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - } - else if (vcmp(vfunc, MSGCLASS2_SIG, MSGCLASS2_SIGLEN)) - { - #ifdef OS_WIN32 - /* If we get here, the code is possibly inlined like in Dystopia */ - - /* Get the address of the CUtlRBTree */ - char *rbtree = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* CUtlDict should be 8 bytes before the CUtlRBTree (hacktacular!) */ - dict = reinterpret_cast(rbtree - 8); - #elif defined OS_LINUX - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - #ifdef OS_WIN32 - } - else if (vcmp(vfunc, MSGCLASS3_SIG, MSGCLASS3_SIGLEN)) - { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS3_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - } - - if (dict) - { - int msg_count = dict->Count(); - - /* Ensure that count is within bounds of an unsigned byte, because that's what engine supports */ - if (msg_count < 0 || msg_count > 255) - { - return false; - } - - UserMessage *msg; - UsrMsgInfo u_msg; - - /* Cache messages in our CUtlDict */ - for (int i = 0; i < msg_count; i++) - { - msg = dict->Element(i); - u_msg.name = msg->name; - u_msg.size = msg->size; - usermsgs_list.push_back(u_msg); - } - - return true; - } - - return false; -} - diff --git a/sourcemm/episode2/provider_ep2.h b/sourcemm/episode2/provider_ep2.h deleted file mode 100644 index c042e11..0000000 --- a/sourcemm/episode2/provider_ep2.h +++ /dev/null @@ -1,89 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ -#define _INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ - -#if defined _DEBUG -#define DEBUG2 -#undef _DEBUG -#endif -#include -#include -#include -#include "ISmmAPI.h" -#include "metamod_provider.h" -#include "metamod_oslink.h" -#if defined DEBUG2 -#undef DEBUG2 -#define _DEBUG -#endif - -using namespace SourceMM; -using namespace SourceHook; - -class BaseProvider : public IMetamodSourceProvider -{ -public: - virtual bool IsSourceEngineBuildCompatible(int build); - virtual bool GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo); - virtual bool LogMessage(const char *buffer); - virtual const char *GetCommandLineValue(const char *key, const char *defval); - virtual void ConsolePrint(const char *msg); - virtual bool IsRemotePrintingAvailable(); - virtual void ClientConsolePrint(edict_t *client, const char *msg); - virtual IServerPluginCallbacks *GetVSPCallbacks(const char *iface); - virtual void DisplayError(const char *fmt, ...); - virtual void DisplayWarning(const char *fmt, ...); - virtual int TryServerGameDLL(const char *iface); - virtual void Notify_DLLInit_Pre(void *gamedll, - CreateInterfaceFn engineFactory, - CreateInterfaceFn serverFactory); - void Notify_DLLShutdown_Pre(); - virtual void ServerCommand(const char *cmd); - virtual ConVar *CreateConVar(const char *name, - const char *defval, - const char *help, - int flags); - virtual const char *GetConVarString(ConVar *convar); - virtual const char *GetGameDescription(); - virtual IConCommandBaseAccessor *GetConCommandBaseAccessor(); - virtual bool RegisterConCommandBase(ConCommandBase *pCommand); - virtual void UnregisterConCommandBase(ConCommandBase *pCommand); - virtual bool IsConCommandBaseACommand(ConCommandBase *pCommand); - virtual int GetUserMessageCount(); - virtual int FindUserMessage(const char *name, int *size=NULL); - virtual const char *GetUserMessage(int index, int *size=NULL); -}; - -extern IVEngineServer *engine; -extern IServerGameDLL *server; -extern IServerGameClients *gameclients; -extern ICvar *icvar; - -#endif //_INCLUDE_METAMOD_SOURCE_BASE_PROVIDER_H_ - diff --git a/sourcemm/episode2/vsp_listener.cpp b/sourcemm/episode2/vsp_listener.cpp deleted file mode 100644 index 3adf2b5..0000000 --- a/sourcemm/episode2/vsp_listener.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#include "vsp_listener.h" -#include "svn_version.h" -#include "metamod.h" - -using namespace SourceMM; - -VSPListener::VSPListener() -{ - m_bLoaded = false; - m_bLoadable = false; -} - -void VSPListener::ClientActive(edict_t *pEntity) -{ -} - -PLUGIN_RESULT VSPListener::ClientCommand(edict_t *pEntity, const CCommand &cmd) -{ - return PLUGIN_CONTINUE; -} - -PLUGIN_RESULT VSPListener::ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::ClientDisconnect(edict_t *pEntity) -{ -} - -void VSPListener::ClientPutInServer(edict_t *pEntity, char const *playername) -{ -} - -void VSPListener::ClientSettingsChanged(edict_t *pEdict) -{ -} - -void VSPListener::SetCommandClient(int index) -{ -} - -void VSPListener::GameFrame(bool simulating) -{ -} - -const char *VSPListener::GetPluginDescription() -{ - return "Metamod:Source Interface v" SVN_FILE_VERSION_STRING; -} - -bool VSPListener::IsLoaded() -{ - return m_bLoaded; -} - -void VSPListener::LevelInit(char const *pMapName) -{ -} - -void VSPListener::LevelShutdown() -{ -} - -PLUGIN_RESULT VSPListener::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::Pause() -{ -} - -void VSPListener::UnPause() -{ -} - -void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) -{ -} - -void VSPListener::Unload() -{ -} - -void VSPListener::SetLoadable(bool set) -{ - m_bLoadable = set; -} - -bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) -{ - if (!m_bLoadable) - { - provider->DisplayWarning("Do not manually load Metamod:Source as a Valve Server Plugin\n"); - return false; - } - - if (m_bLoaded) - { - return false; - } - - m_bLoaded = true; - SetLoadable(false); - - g_Metamod.NotifyVSPListening(this); - - return true; -} - -void VSPListener::OnQueryCvarValueFinished(QueryCvarCookie_t iCookie, edict_t *pPlayerEntity, EQueryCvarValueStatus eStatus, const char *pCvarName, const char *pCvarValue ) -{ -} diff --git a/sourcemm/episode2/vsp_listener.h b/sourcemm/episode2/vsp_listener.h deleted file mode 100644 index 443606f..0000000 --- a/sourcemm/episode2/vsp_listener.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ -#define _INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ - -#if defined _DEBUG -#define DEBUG2 -#undef _DEBUG -#endif -#include "iserverplugin.h" -#if defined DEBUG2 -#undef DEBUG2 -#define _DEBUG -#endif - -class VSPListener : public IServerPluginCallbacks -{ -public: - VSPListener(); -public: - virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory); - virtual void Unload(); - virtual void Pause(); - virtual void UnPause(); - virtual const char *GetPluginDescription(); - virtual void LevelInit(char const *pMapName); - virtual void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); - virtual void GameFrame(bool simulating); - virtual void LevelShutdown(void); - virtual void ClientActive(edict_t *pEntity); - virtual void ClientDisconnect(edict_t *pEntity); - virtual void ClientPutInServer(edict_t *pEntity, char const *playername); - virtual void SetCommandClient(int index); - virtual void ClientSettingsChanged(edict_t *pEdict); - virtual PLUGIN_RESULT ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); - virtual PLUGIN_RESULT ClientCommand(edict_t *pEntity, const CCommand &cmd); - virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID); - virtual void OnQueryCvarValueFinished( QueryCvarCookie_t iCookie, edict_t *pPlayerEntity, EQueryCvarValueStatus eStatus, const char *pCvarName, const char *pCvarValue ); -public: - bool IsLoaded(); - void SetLoadable(bool loadable); -private: - bool m_bLoaded; - bool m_bLoadable; -}; - -#endif //_INCLUDE_METAMOD_SOURCE_VSP_LISTENER_H_ - diff --git a/sourcemm/metamod.cpp b/sourcemm/metamod.cpp deleted file mode 100644 index 8097f4d..0000000 --- a/sourcemm/metamod.cpp +++ /dev/null @@ -1,1244 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#if defined _DEBUG -#define DEBUG2 -#undef _DEBUG -#endif -#include -#include -#include "metamod.h" -#include "metamod_provider.h" -#include "metamod_plugins.h" -#include "metamod_util.h" -#include "metamod_console.h" -#include "metamod_oslink.h" -#if defined DEBUG2 -#undef DEBUG2 -#define _DEBUG -#endif - -using namespace SourceMM; -using namespace SourceHook; - -/** - * @brief Implementation of main SourceMM GameDLL functionality - * @file sourcemm.cpp - */ - -SH_DECL_MANUALHOOK4(SGD_DLLInit, 0, 0, 0, bool, CreateInterfaceFn, CreateInterfaceFn, CreateInterfaceFn, CGlobalVars *); -SH_DECL_MANUALHOOK0(SGD_GameInit, 0, 0, 0, bool); -SH_DECL_MANUALHOOK6(SGD_LevelInit, 0, 0, 0, bool, const char *, const char *, const char *, const char *, bool, bool); -SH_DECL_MANUALHOOK0_void(SGD_LevelShutdown, 0, 0, 0); -SH_DECL_MANUALHOOK0_void(SGD_DLLShutdown, 0, 0, 0); - -bool Handler_DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); -bool Handler_DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); -void Handler_DLLShutdown(); -void Handler_LevelShutdown(); -bool Handler_LevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background); -bool Handler_GameInit(); -void InitializeVSP(); - -struct game_dll_t -{ - HINSTANCE lib; - CreateInterfaceFn factory; -}; - -String mod_path; -String metamod_path; -String full_bin_path; -bool parsed_game_info = false; -int vsp_version = 0; -int gamedll_version = 0; -int engine_build = SOURCE_ENGINE_UNKNOWN; -List gamedll_list; -bool is_gamedll_loaded = false; -bool in_first_level = true; -bool is_game_init = false; -bool vsp_load_attempted = false; -bool vsp_load_requested = false; -bool vsp_loaded = false; -game_dll_t gamedll_info; -ConVar *metamod_version = NULL; -ConVar *mm_pluginsfile = NULL; -IServerGameDLL *server = NULL; -CreateInterfaceFn engine_factory = NULL; -CreateInterfaceFn physics_factory = NULL; -CreateInterfaceFn filesystem_factory = NULL; -CGlobalVars *gpGlobals = NULL; -SourceHook::CSourceHookImpl g_SourceHook; -SourceHook::ISourceHook *g_SHPtr = &g_SourceHook; -PluginId g_PLID = Pl_Console; -META_RES last_meta_res; -IServerPluginCallbacks *vsp_callbacks = NULL; - -MetamodSource g_Metamod; - -void ClearGamedllList(); - -/* Helper Macro */ -#define IFACE_MACRO(orig,nam) \ - CPluginManager::CPlugin *pl; \ - SourceHook::List::iterator event; \ - IMetamodListener *api; \ - int mret = 0; \ - void *val = NULL; \ - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ - pl = (*iter); \ - for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ - api = (*event); \ - mret = IFACE_FAILED; \ - if ( (val=api->On##nam##Query(iface, &mret)) != NULL ) { \ - if (ret) *ret = mret; \ - return val; \ - } \ - } \ - } \ - return (orig)(iface, ret); - -#define ITER_EVENT(evn, args) \ - CPluginManager::CPlugin *pl; \ - SourceHook::List::iterator event; \ - IMetamodListener *api; \ - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ - pl = (*iter); \ - for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ - api = (*event); \ - api->evn args; \ - } \ - } - -/* Initialize everything here */ -void InitMainStates() -{ - char full_path[PATH_SIZE] = {0}; - GetFileOfAddress((void *)gamedll_info.factory, full_path, sizeof(full_path)); - full_bin_path.assign(full_path); - - /* Like Metamod, reload plugins at the end of the map. - * This is so plugins can hook everything on load, BUT, new plugins will be reloaded - * if the server is shut down (silly, but rare case). - */ - in_first_level = true; - - SourceHook::MemFuncInfo info; - - if (!provider->GetHookInfo(ProvidedHook_DLLInit, &info)) - { - provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::DLLInit"); - } - SH_MANUALHOOK_RECONFIGURE(SGD_DLLInit, info.vtblindex, info.vtbloffs, info.thisptroffs); - SH_ADD_MANUALHOOK_STATICFUNC(SGD_DLLInit, server, Handler_DLLInit, false); - SH_ADD_MANUALHOOK_STATICFUNC(SGD_DLLInit, server, Handler_DLLInit_Post, true); - - if (!provider->GetHookInfo(ProvidedHook_GameInit, &info)) - { - provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::GameInit"); - } - SH_MANUALHOOK_RECONFIGURE(SGD_GameInit, info.vtblindex, info.vtbloffs, info.thisptroffs); - SH_ADD_MANUALHOOK_STATICFUNC(SGD_GameInit, server, Handler_GameInit, false); - - if (!provider->GetHookInfo(ProvidedHook_LevelInit, &info)) - { - provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::LevelInit"); - } - SH_MANUALHOOK_RECONFIGURE(SGD_LevelInit, info.vtblindex, info.vtbloffs, info.thisptroffs); - SH_ADD_MANUALHOOK_STATICFUNC(SGD_LevelInit, server, Handler_LevelInit, true); - - if (!provider->GetHookInfo(ProvidedHook_LevelShutdown, &info)) - { - provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::LevelShutdown"); - } - SH_MANUALHOOK_RECONFIGURE(SGD_LevelShutdown, info.vtblindex, info.vtbloffs, info.thisptroffs); - SH_ADD_MANUALHOOK_STATICFUNC(SGD_LevelShutdown, server, Handler_LevelShutdown, true); - - if (!provider->GetHookInfo(ProvidedHook_DLLShutdown, &info)) - { - provider->DisplayError("Metamod:Source could not find a valid hook for IServerGameDLL::DLLShutdown"); - } - SH_MANUALHOOK_RECONFIGURE(SGD_DLLShutdown, info.vtblindex, info.vtbloffs, info.thisptroffs); - SH_ADD_MANUALHOOK_STATICFUNC(SGD_DLLShutdown, server, Handler_DLLShutdown, false); -} - -/* This is where the magic happens */ -SMM_API void *CreateInterface(const char *iface, int *ret) -{ - /* Prevent loading of self as a SourceMM plugin or Valve server plugin :x */ - if (strcmp(iface, PLAPI_NAME) == 0) - { - provider->DisplayWarning("Do not try loading Metamod:Source as a plugin.\n"); - - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - if (strncmp(iface, "ISERVERPLUGINCALLBACKS", 22) == 0) - { - vsp_callbacks = provider->GetVSPCallbacks(iface); - - if (vsp_callbacks != NULL && vsp_version == 0) - { - vsp_version = atoi(&iface[22]); - } - - if (ret) - { - *ret = (vsp_callbacks != NULL) ? IFACE_OK : IFACE_FAILED; - } - - return vsp_callbacks; - } - - if (!parsed_game_info) - { - parsed_game_info = true; - const char *game_dir = NULL; - char game_path[PATH_SIZE]; - char mm_path[PATH_SIZE]; - - /* Get path to SourceMM DLL */ - if (!GetFileOfAddress((void *)CreateInterface, mm_path, sizeof(mm_path))) - { - provider->DisplayError("GetFileOfAddress() failed! Metamod cannot load.\n"); - return NULL; - } - - metamod_path.assign(mm_path); - - /* Get value of -game from command line, defaulting to hl2 as engine seems to do */ - game_dir = provider->GetCommandLineValue("-game", "hl2"); - - engine_build = SOURCE_ENGINE_ORANGEBOX; - - /* Get absolute path */ - abspath(game_path, game_dir); - mod_path.assign(game_path); - - char temp_path[PATH_SIZE]; - - /* Path to gameinfo.txt */ - g_Metamod.PathFormat(temp_path, PATH_SIZE, "%s/%s", mod_path.c_str(), "gameinfo.txt"); - - FILE *fp = fopen(temp_path, "rt"); - - if (!fp) - { - provider->DisplayError("Unable to open gameinfo.txt! Metamod cannot load.\n"); - return NULL; - } - - char buffer[255]; - char key[128], val[128]; - bool search = false; - bool gamebin = false; - char *ptr; - const char *lptr; - char cur_path[PATH_SIZE]; - - getcwd(cur_path, PATH_SIZE); - - while (!feof(fp) && fgets(buffer, sizeof(buffer), fp) != NULL) - { - UTIL_TrimComments(buffer); - UTIL_TrimLeft(buffer); - UTIL_TrimRight(buffer); - - if (stricmp(buffer, "SearchPaths") == 0) - { - search = true; - } - - if (!search) - { - continue; - } - - UTIL_KeySplit(buffer, key, sizeof(key) - 1, val, sizeof(val) - 1); - if (stricmp(key, "Game") == 0 || stricmp(key, "GameBin") == 0) - { - if (stricmp(key, "Game") == 0) - { - gamebin = false; - } - else - { - gamebin = true; - } - - if (strncmp(val, "|gameinfo_path|", sizeof("|gameinfo_path|") - 1) == 0) - { - ptr = &(val[sizeof("|gameinfo_path|") - 1]); - if (ptr[0] == '.') - { - ptr++; - } - lptr = mod_path.c_str(); - } else { - ptr = val; - lptr = cur_path; - } - - size_t ptr_len = strlen(ptr); - if (ptr[ptr_len] == '/' || ptr[ptr_len] == '\\') - { - ptr[--ptr_len] = '\0'; - } - - /* No need to append "bin" if key is GameBin */ - if (gamebin) - { - g_Metamod.PathFormat(temp_path, PATH_SIZE, "%s/%s/%s", lptr, ptr, SERVER_DLL); - } - else if (!ptr[0]) - { - g_Metamod.PathFormat(temp_path, PATH_SIZE, "%s/%s/%s", lptr, "bin", SERVER_DLL); - } - else - { - g_Metamod.PathFormat(temp_path, PATH_SIZE, "%s/%s/%s/%s", lptr, ptr, "bin", SERVER_DLL); - } - - /* If not path to SourceMM... */ - if (!UTIL_PathCmp(mm_path, temp_path)) - { - FILE *temp_fp = fopen(temp_path, "rb"); - if (!temp_fp) - { - continue; - } - fclose(temp_fp); - - /* Search for a matching game dll */ - List::iterator iter; - game_dll_t *pCheck; - bool found = false; - for (iter = gamedll_list.begin(); iter != gamedll_list.end(); iter++) - { - pCheck = (*iter); - if (GetFileOfAddress((void *)pCheck->factory, buffer, sizeof(buffer))) - { - if (UTIL_PathCmp(temp_path, buffer)) - { - found = true; - break; - } - } - } - - if (found) - { - continue; - } - - HINSTANCE gamedll = dlmount(temp_path); - if (gamedll == NULL) - { - continue; - } - - CreateInterfaceFn fn = (CreateInterfaceFn)dlsym(gamedll, "CreateInterface"); - if (fn == NULL) - { - dlclose(gamedll); - continue; - } - - game_dll_t *pInfo = new game_dll_t; - pInfo->factory = fn; - pInfo->lib = gamedll; - gamedll_list.push_back(pInfo); - break; - } - } - } - fclose(fp); - } - - if (!is_gamedll_loaded) - { - if (strncmp(iface, "ServerGameDLL", 13) == 0) - { - List::iterator iter; - game_dll_t *pInfo; - for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) - { - pInfo = (*iter); - if ((server = (IServerGameDLL *)((pInfo->factory)(iface, ret))) != NULL) - { - if ((gamedll_version = provider->TryServerGameDLL(iface)) != 0) - { - /* We have a match. Erase us from the list and save our info. */ - gamedll_list.erase(iter); - gamedll_info = *pInfo; - delete pInfo; - is_gamedll_loaded = true; - break; - } - /* :TODO: error otherwise? */ - } - } - - if (is_gamedll_loaded) - { - ClearGamedllList(); - InitMainStates(); - } - else - { - if (ret) - { - *ret = IFACE_FAILED; - } - return NULL; - } - } - else - { - /* wtf do we do... */ - /* :TODO: .. something a bit more intelligent? */ - provider->DisplayError("Engine requested unknown interface before GameDLL was known!\n"); - return NULL; - } - } - - /* If we got here, there's definitely a GameDLL */ - IFACE_MACRO(gamedll_info.factory, GameDLL); -} - -void ClearGamedllList() -{ - List::iterator iter; - - game_dll_t *pInfo; - for (iter = gamedll_list.begin(); iter != gamedll_list.end(); iter++) - { - pInfo = (*iter); - dlclose(pInfo->lib); - delete pInfo; - } - - gamedll_list.clear(); -} - -int LoadPluginsFromFile(const char *_file) -{ - FILE *fp; - int total = 0, skipped=0; - PluginId id; - bool already; - - fp = fopen(_file, "rt"); - if (!fp) - { - LogMessage("[META] Could not open plugins file %s\n", _file); - return -1; - } - - char buffer[255], error[255], full_path[255]; - const char *ptr, *ext, *file; - size_t length; - while (!feof(fp) && fgets(buffer, sizeof(buffer), fp) != NULL) - { - UTIL_TrimLeft(buffer); - UTIL_TrimRight(buffer); - - length = strlen(buffer); - if (!length) - { - continue; - } - - if (buffer[0] == '\0' || buffer[0] == ';' || strncmp(buffer, "//", 2) == 0) - { - continue; - } - - file = buffer; - if (buffer[0] == '"') - { - char *cptr = buffer; - file = ++cptr; - - while (*cptr) - { - if (*cptr == '"') - { - *cptr = '\0'; - break; - } - cptr++; - } - } - else - { - char *cptr = buffer; - while (*cptr) - { - if (isspace(*cptr)) - { - char *optr = cptr; - while (*cptr && isspace(*cptr)) - { - cptr++; - } - *optr = '\0'; - UTIL_TrimRight(cptr); - if (*cptr && isalpha(*cptr)) - { - g_PluginMngr.SetAlias(buffer, cptr); - file = cptr; - } - break; - } - cptr++; - } - } - if (!file[0]) - { - continue; - } - /* First find if it's an absolute path or not... */ - if (file[0] == '/' || strncmp(&(file[1]), ":\\", 2) == 0) - { - /* If we're in an absolute path, ignore our normal heuristics */ - id = g_PluginMngr.Load(file, Pl_File, already, error, sizeof(error)); - if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) - { - LogMessage("[META] Failed to load plugin %s. %s", buffer, error); - } - else - { - if (already) - { - skipped++; - } - else - { - total++; - } - } - } - else - { - /* Attempt to find a file extension */ - ptr = UTIL_GetExtension(file); - /* Add an extension if there's none there */ - if (!ptr) - { -#if defined WIN32 || defined _WIN32 - ext = ".dll"; -#else - ext = "_i486.so"; -#endif - } - else - { - ext = ""; - } - /* Format the new path */ - g_Metamod.PathFormat(full_path, sizeof(full_path), "%s/%s%s", mod_path.c_str(), file, ext); - id = g_PluginMngr.Load(full_path, Pl_File, already, error, sizeof(error)); - if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) - { - LogMessage("[META] Failed to load plugin %s. %s", buffer, error); - } - else - { - if (already) - { - skipped++; - } - else - { - total++; - } - } - } - } - fclose(fp); - - if (skipped) - { - LogMessage("[META] Loaded %d plugins from file (%d already loaded)", total, skipped); - } - else - { - LogMessage("[META] Loaded %d plugins from file.", total); - } - - return total; -} - -void InitializeVSP() -{ - size_t len; - char engine_file[PATH_SIZE]; - char engine_path[PATH_SIZE]; - char rel_path[PATH_SIZE * 2]; - - GetFileOfAddress((void *)engine_factory, engine_file, sizeof(engine_file)); - - /* Chop off the "engine" file part */ - len = strlen(engine_file); - for (size_t i = len - 1; i >= 0 && i < len; i--) - { - if (engine_file[i] == '/' || engine_file[i] == '\\') - { - engine_file[i] = '\0'; - break; - } - } - abspath(engine_path, engine_file); - - const char *usepath = metamod_path.c_str(); - if (UTIL_Relatize(rel_path, sizeof(rel_path), engine_path, metamod_path.c_str())) - { - usepath = rel_path; - } - - char command[PATH_SIZE * 2]; - UTIL_Format(command, sizeof(command), "plugin_load \"%s\"\n", usepath); - provider->ServerCommand(command); -} - -/* Wrapper function. This is called when the GameDLL thinks it's using - * the engine's real engineFactory. - */ -void *EngineFactory(const char *iface, int *ret) -{ - IFACE_MACRO(engine_factory, Engine); -} - -/* Wrapper function. This is called when the GameDLL thinks it's using - * the engine's real physicsFactory. - */ -void *PhysicsFactory(const char *iface, int *ret) -{ - IFACE_MACRO(physics_factory, Physics); -} - -/* Wrapper function. This is called when the GameDLL thinks it's using - * the engine's real fileSystemFactory. - */ -void *FileSystemFactory(const char *iface, int *ret) -{ - IFACE_MACRO(filesystem_factory, FileSystem); -} - -void LogMessage(const char *msg, ...) -{ - va_list ap; - static char buffer[2048]; - - va_start(ap, msg); - size_t len = vsnprintf(buffer, sizeof(buffer) - 2, msg, ap); - va_end(ap); - - buffer[len++] = '\n'; - buffer[len] = '\0'; - - if (!provider->LogMessage(buffer)) - { - fprintf(stdout, "%s", buffer); - } -} - -bool Handler_DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) -{ - engine_factory = engineFactory; - filesystem_factory = filesystemFactory; - physics_factory = physicsFactory; - gpGlobals = pGlobals; - - provider->Notify_DLLInit_Pre(server, engineFactory, gamedll_info.factory); - - metamod_version = provider->CreateConVar("metamod_version", - SOURCEMM_VERSION, - "Metamod:Source Version", - ConVarFlag_Notify|ConVarFlag_Replicated|ConVarFlag_SpOnly); - - mm_pluginsfile = provider->CreateConVar("mm_pluginsfile", -#if defined WIN32 || defined _WIN32 - "addons\\metamod\\metaplugins.ini", -#else - "addons/metamod/metaplugins.ini", -#endif - "Metamod:Source Plugins File", - ConVarFlag_SpOnly); - - const char *pluginFile = provider->GetCommandLineValue("mm_pluginsfile", NULL); - if (!pluginFile) - { - pluginFile = provider->GetConVarString(mm_pluginsfile); - if (pluginFile == NULL) - { - pluginFile = "addons/metamod/metaplugins.ini"; - } - } - - char full_path[260]; - g_Metamod.PathFormat(full_path, sizeof(full_path), "%s/%s", mod_path.c_str(), pluginFile); - - LoadPluginsFromFile(full_path); - - in_first_level = true; - - RETURN_META_VALUE(MRES_IGNORED, true); -} - -bool Handler_GameInit() -{ - if (is_game_init) - { - return true; - } - - if (vsp_load_requested) - { - InitializeVSP(); - } - - is_game_init = true; - - RETURN_META_VALUE(MRES_IGNORED, true); -} - -bool Handler_DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) -{ - g_PluginMngr.SetAllLoaded(); - RETURN_META_VALUE(MRES_IGNORED, true); -} - -void Handler_DLLShutdown() -{ - /* Unload plugins */ - g_PluginMngr.UnloadAll(); - - provider->Notify_DLLShutdown_Pre(); - - SH_CALL(server, &IServerGameDLL::DLLShutdown)(); - - g_SourceHook.CompleteShutdown(); - - if (is_gamedll_loaded && gamedll_info.lib) - { - dlclose(gamedll_info.lib); - is_gamedll_loaded = false; - } - - RETURN_META(MRES_SUPERCEDE); -} - -void Handler_LevelShutdown(void) -{ - if (!in_first_level) - { - char full_path[255]; - g_Metamod.PathFormat(full_path, - sizeof(full_path), - "%s/%s", - mod_path.c_str(), - provider->GetConVarString(mm_pluginsfile)); - - LoadPluginsFromFile(full_path); - } - else - { - in_first_level = false; - } - - ITER_EVENT(OnLevelShutdown, ()); - - RETURN_META(MRES_IGNORED); -} - -bool Handler_LevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background) -{ - ITER_EVENT(OnLevelInit, (pMapName, pMapEntities, pOldLevel, pLandmarkName, loadGame, background)); - - RETURN_META_VALUE(MRES_IGNORED, false); -} - -void MetamodSource::LogMsg(ISmmPlugin *pl, const char *msg, ...) -{ - va_list ap; - char buffer[2048]; - - va_start(ap, msg); - UTIL_FormatArgs(buffer, sizeof(buffer), msg, ap); - va_end(ap); - - LogMessage("[%s] %s", pl->GetLogTag(), buffer); -} - -CreateInterfaceFn MetamodSource::engineFactory(bool syn/* =true */) -{ - if (syn) - { - return EngineFactory; - } - - return engine_factory; -} - -CreateInterfaceFn MetamodSource::physicsFactory(bool syn/* =true */) -{ - if (syn) - { - return PhysicsFactory; - } - - return physics_factory; -} - -CreateInterfaceFn MetamodSource::fileSystemFactory(bool syn/* =true */) -{ - if (syn) - { - return FileSystemFactory; - } - - return filesystem_factory; -} - -CreateInterfaceFn MetamodSource::serverFactory(bool syn/* =true */) -{ - if (syn) - { - return CreateInterface; - } - - return gamedll_info.factory; -} - -CGlobalVars *MetamodSource::pGlobals() -{ - return gpGlobals; -} - -void MetamodSource::SetLastMetaReturn(META_RES res) -{ - last_meta_res = res; -} - -META_RES MetamodSource::GetLastMetaReturn() -{ - return last_meta_res; -} - -void MetamodSource::ConPrint(const char *str) -{ - provider->ConsolePrint(str); -} - -void MetamodSource::ConPrintf(const char *fmt, ...) -{ - va_list ap; - char buffer[2048]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - provider->ConsolePrint(buffer); -} - -void MetamodSource::GetApiVersions(int &major, int &minor, int &plvers, int &plmin) -{ - major = SM_VERS_API_MAJOR; - minor = SM_VERS_API_MINOR; - plvers = PLAPI_VERSION; - plmin = PLAPI_MIN_VERSION; -} - -void MetamodSource::GetShVersions(int &shvers, int &shimpl) -{ - shvers = SH_IFACE_VERSION; - shimpl = SH_IMPL_VERSION; -} - -int MetamodSource::FormatIface(char iface[], unsigned int maxlength) -{ - int length = (int)strlen(iface); - int i; - int num = 0; - - for (i = length - 1; i >= 0; i--) - { - if (!isdigit(iface[i])) - { - if (i != length - 1) - { - num = 1; - } - break; - } - } - - if ( (num && ((int)maxlength <= length)) || (!num && ((int)maxlength <= length + 3)) ) - { - return -1; - } - - if (i != length - 1) - { - num = atoi(&(iface[++i])); - } - - num++; - - snprintf(&(iface[i]), 4, "%03d", num); - - return num; -} - -void *MetamodSource::InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret) -{ - char _if[256]; /* assume no interface goes beyond this */ - size_t len = strlen(iface); - int num = 0; - void *pf = NULL; - - if (max > 999) - { - max = 999; - } - - if (len + 4 > sizeof(_if)) - { - if (ret) - { - *ret = IFACE_FAILED; - } - return NULL; - } - - strcpy(_if, iface); - - do - { - if ((pf = (fn)(_if, ret)) != NULL) - { - break; - } - if (num > max) - { - break; - } - } while ((num = FormatIface(_if, len+1))); - - return pf; -} - -void *MetamodSource::VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min) -{ - char buffer[256]; /* assume no interface will go beyond this */ - size_t len = strlen(iface); - int ret; /* just in case something doesn't handle NULL properly */ - - if (len > sizeof(buffer) - 4) - { - return NULL; - } - - strcpy(buffer, iface); - - if (min != -1) - { - char *ptr = &buffer[len - 1]; - int digits = 0; - while (isdigit(*ptr) && digits <=3) - { - *ptr = '\0'; - digits++; - ptr--; - } - if (digits != 3) - { - /* for now, assume this is an error */ - strcpy(buffer, iface); - } - else - { - char num[4]; - min = (min == 0) ? 1 : min; - snprintf(num, sizeof(num), "%03d", min); - strcat(buffer, num); - } - } - - return InterfaceSearch(fn, buffer, IFACE_MAXNUM, &ret); -} - -const char *MetamodSource::GetBaseDir() -{ - return mod_path.c_str(); -} - -void MetamodSource::PathFormat(char *buffer, size_t len, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - size_t mylen = UTIL_FormatArgs(buffer, len, fmt, ap); - va_end(ap); - - for (size_t i = 0; i < mylen; i++) - { - if (buffer[i] == ALT_SEP_CHAR) - { - buffer[i] = PATH_SEP_CHAR; - } - } -} - -void MetamodSource::ClientConPrintf(edict_t *client, const char *fmt, ...) -{ - va_list ap; - char buffer[2048]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - provider->ClientConsolePrint(client, buffer); -} - -void MetamodSource::EnableVSPListener() -{ - if (is_game_init && !vsp_load_requested && !vsp_loaded) - { - InitializeVSP(); - } - - vsp_load_requested = true; -} - -int MetamodSource::GetVSPVersion() -{ - return vsp_version; -} - -int MetamodSource::GetGameDLLVersion() -{ - return gamedll_version; -} - -bool MetamodSource::RemotePrintingAvailable() -{ - return provider->IsRemotePrintingAvailable(); -} - -void *MetamodSource::MetaFactory(const char *iface, int *ret, PluginId *id) -{ - if (id) - { - *id = 0; - } - - if (!iface) - { - return NULL; - } - - /* First check ours... we get first chance! */ - if (strcmp(iface, MMIFACE_SOURCEHOOK) == 0) - { - if (ret) - { - *ret = IFACE_OK; - } - return static_cast(static_cast(&g_SourceHook)); - } - else if (strcmp(iface, MMIFACE_PLMANAGER) == 0) - { - if (ret) - { - *ret = IFACE_OK; - } - return static_cast(static_cast(&g_PluginMngr)); - } - - CPluginManager::CPlugin *pl; - List::iterator event; - IMetamodListener *api; - void *value; - - int subret = 0; - for (PluginIter iter = g_PluginMngr._begin(); - iter != g_PluginMngr._end(); - iter++) - { - pl = (*iter); - for (event = pl->m_Events.begin(); event != pl->m_Events.end(); event++) - { - api = (*event); - subret = IFACE_FAILED; - if ((value = api->OnMetamodQuery(iface, &subret)) != NULL) - { - if (ret) - { - *ret = subret; - } - if (id) - { - *id = pl->m_Id; - } - return value; - } - } - } - - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; -} - -void MetamodSource::AddListener(ISmmPlugin *plugin, IMetamodListener *pListener) -{ - CPluginManager::CPlugin *pl = g_PluginMngr.FindByAPI(plugin); - - pl->m_Events.push_back(pListener); -} - -const char *MetamodSource::GetGameBinaryPath() -{ - return full_bin_path.c_str(); -} - -const char *MetamodSource::GetPluginsFile() -{ - return provider->GetConVarString(mm_pluginsfile); -} - -IConCommandBaseAccessor *MetamodSource::GetCvarBaseAccessor() -{ - return provider->GetConCommandBaseAccessor(); -} - -bool MetamodSource::RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) -{ - if (provider->IsConCommandBaseACommand(pCommand)) - { - g_PluginMngr.AddPluginCmd(plugin, pCommand); - } - else - { - g_PluginMngr.AddPluginCvar(plugin, pCommand); - } - - return provider->RegisterConCommandBase(pCommand); -} - -void MetamodSource::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) -{ - if (provider->IsConCommandBaseACommand(pCommand)) - { - g_PluginMngr.RemovePluginCmd(plugin, pCommand); - } - else - { - g_PluginMngr.RemovePluginCvar(plugin, pCommand); - } - - CPluginManager::CPlugin *pOrig = g_PluginMngr.FindByAPI(plugin); - UnregisterConCommandBase(pOrig ? pOrig->m_Id : 0, pCommand); -} - -void MetamodSource::UnregisterConCommandBase(PluginId id, ConCommandBase *pCommand) -{ - PluginIter iter; - CPluginManager::CPlugin *pPlugin; - List::iterator event; - IMetamodListener *pML; - for (iter=g_PluginMngr._begin(); iter!=g_PluginMngr._end(); iter++) - { - pPlugin = (*iter); - if (pPlugin->m_Status < Pl_Paused) - { - continue; - } - /* Only valid for plugins >= 12 (v1:6, SourceMM 1.5) */ - if (pPlugin->m_API->GetApiVersion() < 12) - { - continue; - } - for (event=pPlugin->m_Events.begin(); - event!=pPlugin->m_Events.end(); - event++) - { - pML = (*event); - pML->OnUnlinkConCommandBase(id, pCommand); - } - } - - return provider->UnregisterConCommandBase(pCommand); -} - -int MetamodSource::GetUserMessageCount() -{ - return provider->GetUserMessageCount(); -} - -int MetamodSource::FindUserMessage(const char *name, int *size/* =NULL */) -{ - return provider->FindUserMessage(name, size); -} - -const char *MetamodSource::GetUserMessage(int index, int *size/* =NULL */) -{ - return provider->GetUserMessage(index, size); -} - -int MetamodSource::GetSourceEngineBuild() -{ - return engine_build; -} - -void MetamodSource::NotifyVSPListening(IServerPluginCallbacks *callbacks) -{ - ITER_EVENT(OnVSPListening, (callbacks)); -} - -IServerPluginCallbacks *MetamodSource::GetVSPInfo(int *pVersion) -{ - if (pVersion) - { - *pVersion = vsp_version; - } - - return vsp_callbacks; -} - diff --git a/sourcemm/metamod.h b/sourcemm/metamod.h deleted file mode 100644 index 291101c..0000000 --- a/sourcemm/metamod.h +++ /dev/null @@ -1,105 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_SOURCEMM_H -#define _INCLUDE_SOURCEMM_H - -/** - * @brief SourceMM main functionality for GameDLL interception - * @file sourcemm.h - */ - -#include -#include -#include -#include -#include -#include "ISmmAPI.h" -#include "metamod_provider.h" -#include "svn_version.h" - -using namespace SourceMM; - -/** - * Versioning - * increase api_major when API breaks - * increase api_minor when new functions are added (non-breaking) - */ -#define SOURCEMM_VERSION SVN_FILE_VERSION_STRING -#define SOURCEMM_DATE __DATE__ -#define SM_VERS_API_MAJOR 1 //increase this on a breaking change -#define SM_VERS_API_MINOR 7 //increase this on a non-breaking API change - -class MetamodSource : public ISmmAPI -{ -public: - void LogMsg(ISmmPlugin *pl, const char *msg, ...); - CreateInterfaceFn engineFactory(bool syn=true); - CreateInterfaceFn physicsFactory(bool syn=true); - CreateInterfaceFn fileSystemFactory(bool syn=true); - CreateInterfaceFn serverFactory(bool syn=true); - CGlobalVars *pGlobals(); - void SetLastMetaReturn(META_RES res); - META_RES GetLastMetaReturn(); - IConCommandBaseAccessor *GetCvarBaseAccessor(); - bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); - void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); - void ConPrint(const char *str); - void ConPrintf(const char *fmt, ...); - bool RemotePrintingAvailable(); - void GetApiVersions(int &major, int &minor, int &plvers, int &plmin); - void GetShVersions(int &shvers, int &shimpl); - void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener); - void *MetaFactory(const char *iface, int *ret, PluginId *id); - int FormatIface(char iface[], unsigned int maxlength); - void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret); - const char *GetBaseDir(); - void PathFormat(char *buffer, size_t len, const char *fmt, ...); - void ClientConPrintf(edict_t *client, const char *fmt, ...); - void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1); - void EnableVSPListener(); - int GetGameDLLVersion(); - int GetUserMessageCount(); - int FindUserMessage(const char *name, int *size=NULL); - const char *GetUserMessage(int index, int *size=NULL); - int GetVSPVersion(); - int GetSourceEngineBuild(); - IServerPluginCallbacks *GetVSPInfo(int *pVersion); -public: - const char *GetGameBinaryPath(); - const char *GetPluginsFile(); - void UnregisterConCommandBase(PluginId id, ConCommandBase *pCommand); - void NotifyVSPListening(IServerPluginCallbacks *callbacks); -}; - -void LogMessage(const char *msg, ...); -int LoadPluginsFromFile(const char *_file); - -extern SourceHook::CSourceHookImpl g_SourceHook; -extern MetamodSource g_Metamod; - -#endif //_INCLUDE_SOURCEMM_H diff --git a/sourcemm/metamod_console.cpp b/sourcemm/metamod_console.cpp deleted file mode 100644 index d84b8fa..0000000 --- a/sourcemm/metamod_console.cpp +++ /dev/null @@ -1,733 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#if defined _DEBUG -#define DEBUG2 -#undef _DEBUG -#endif -#include -#include "metamod.h" -#include "metamod_util.h" -#include "metamod_console.h" -#include "metamod_plugins.h" -#if defined DEBUG2 -#undef DEBUG2 -#define _DEBUG -#endif - -using namespace SourceMM; -using namespace SourceHook; - -/** - * @brief Console Command Implementations - * @file concommands.cpp - */ - -#define CONMSG g_Metamod.ConPrintf -#define CLIENT_CONMSG g_Metamod.ClientConPrintf - -bool Command_Meta(IMetamodSourceCommandInfo *info) -{ - unsigned int args = info->GetArgCount(); - - if (args >= 1) - { - const char *command = info->GetArg(1); - if (strcmp(command, "credits") == 0) - { - CONMSG("Metamod:Source was developed by:\n"); - CONMSG(" SourceHook: Pavol \"PM OnoTo\" Marko\n"); - CONMSG(" GameDLL/Plugins: David \"BAILOPAN\" Anderson\n"); - CONMSG(" GameDLL: Scott \"Damaged Soul\" Ehlert\n"); - CONMSG("For more information, see the official website\n"); - CONMSG("http://www.sourcemm.net/\n"); - - return true; - } - else if (strcmp(command, "version") == 0) - { - CONMSG("Metamod:Source version %s\n", SOURCEMM_VERSION); - CONMSG("Compiled on: %s\n", SOURCEMM_DATE); - CONMSG("Plugin interface version: %d:%d\n", PLAPI_VERSION, PLAPI_MIN_VERSION); - CONMSG("SourceHook version: %d:%d\n", g_SourceHook.GetIfaceVersion(), g_SourceHook.GetImplVersion()); - CONMSG("http://www.sourcemm.net/\n"); - - return true; - } - else if (strcmp(command, "game") == 0) - { - CONMSG("GameDLL Information\n"); - CONMSG(" Description: %s\n", provider->GetGameDescription()); - CONMSG(" Mod Path: %s\n", g_Metamod.GetBaseDir()); - CONMSG(" DLL Path: %s\n", g_Metamod.GetGameBinaryPath()); - CONMSG(" Interface: ServerGameDLL%03d\n", g_Metamod.GetGameDLLVersion()); - - // Display user messages - int messages = g_Metamod.GetUserMessageCount(); - if (messages != -1) - { - const char *msgname; - int msgsize; - - if (messages > 0) - { - CONMSG(" User Messages: %-32.31s %-5s %-5s\n", "Name", "Index", "Size"); - - for (int i = 0; i < messages; i++) - { - msgname = g_Metamod.GetUserMessage(i, &msgsize); - - CONMSG(" %-32.31s %-5d %-5d\n", msgname, i, msgsize); - } - - CONMSG(" %d user message%s in total\n", messages, (messages > 1) ? "s" : ""); - } - else - { - CONMSG(" User Messages: None\n"); - } - } - else - { - CONMSG(" User Messages: Failed to get list of user messages\n"); - } - - return true; - } - else if (strcmp(command, "refresh") == 0) - { - char full_path[255]; - g_Metamod.PathFormat(full_path, - sizeof(full_path), - "%s/%s", - g_Metamod.GetBaseDir(), - g_Metamod.GetPluginsFile()); - - LoadPluginsFromFile(full_path); - - return true; - } - else if (strcmp(command, "list") == 0) - { - CPluginManager::CPlugin *pl; - ISmmPlugin *plapi; - const char *plname; - PluginIter i; - char buffer[256]; - int len; - int plnum = g_PluginMngr.GetPluginCount(); - - if (!plnum) - { - CONMSG("No plugins loaded.\n"); - return true; - } else { - CONMSG("Listing %d plugin%s:\n", plnum, (plnum > 1) ? "s" : ""); - } - - for (i = g_PluginMngr._begin(); i != g_PluginMngr._end(); i++) - { - pl = (*i); - if (!pl) - { - break; - } - - len = 0; - - if (pl->m_Status != Pl_Running) - { - len += UTIL_Format(buffer, sizeof(buffer), " [%02d] <%s>", pl->m_Id, g_PluginMngr.GetStatusText(pl)); - } else { - len += UTIL_Format(buffer, sizeof(buffer), " [%02d]", pl->m_Id); - } - - if ((plapi = pl->m_API)) - { - plname = IS_STR_FILLED(plapi->GetName()) ? plapi->GetName() : pl->m_File.c_str(); - len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " %s", plname); - - if (IS_STR_FILLED(plapi->GetVersion())) - { - len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " (%s)", plapi->GetVersion()); - } - if (IS_STR_FILLED(plapi->GetAuthor())) - { - UTIL_Format(&buffer[len], sizeof(buffer)-len, " by %s", plapi->GetAuthor()); - } - } - - CONMSG("%s\n", buffer); - } - - return true; - } - else if (strcmp(command, "cmds") == 0) - { - if (args >= 2) - { - int id = atoi(info->GetArg(2)); - CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); - - if (!pl) - { - CONMSG("Plugin %d not found.\n", id); - return true; - } - - if (!pl->m_API) - { - CONMSG("Plugin %d is not loaded.\n", id); - } - else - { - CONMSG("Console commands for %s:\n", pl->m_API->GetName()); - List::iterator ci; - size_t count = 0; - - for (ci=pl->m_Cmds.begin(); ci!=pl->m_Cmds.end(); ci++) - { - count++; - CONMSG(" [%5d] %-s\n", count, (*ci)->GetName()); - } - } - } - else - { - CONMSG("Usage: meta cmds \n"); - } - - return true; - } - else if (strcmp(command, "cvars") == 0) - { - if (args >= 2) - { - int id = atoi(info->GetArg(2)); - CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); - - if (!pl) - { - CONMSG("Plugin %d not found.\n", id); - return true; - } - - if (!pl->m_API) - { - CONMSG("Plugin %d is not loaded.\n", id); - } - else - { - CONMSG("Registered cvars for %s:\n", pl->m_API->GetName()); - List::iterator ci; - size_t count = 0; - - for (ci=pl->m_Cvars.begin(); ci!=pl->m_Cvars.end(); ci++) - { - count++; - CONMSG(" [%5d] %-s\n", count, (*ci)->GetName()); - } - } - } - else - { - CONMSG("Usage: meta cvars \n"); - } - - return true; - } - else if (strcmp(command, "info") == 0) - { - if (args >= 2) - { - int id = atoi(info->GetArg(2)); - CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); - if (!pl) - { - CONMSG("Plugin %d not found.\n", id); - return true; - } - - if (!pl->m_API) - { - CONMSG("Plugin %d is not loaded.\n", id); - } - else - { - if (pl->m_Status == Pl_Paused) - { - CONMSG("Plugin %d is paused.\n", id); - } - else if (pl->m_Status == Pl_Running) - { - char run_msg[255]; - bool run = false; - if (pl->m_API && pl->m_API->QueryRunning(run_msg, sizeof(run_msg)-1)) - { - run = true; - } - if (run) - { - CONMSG("Plugin %d is running.\n", id); - } - else - { - CONMSG("Plugin %d is stopped: %s\n", id, run_msg); - } - } - CONMSG(" Name: \"%s\" by %s\n", pl->m_API->GetName(), pl->m_API->GetAuthor()); - CONMSG(" Version: %s\n", pl->m_API->GetVersion()); - CONMSG(" Description: %s\n", pl->m_API->GetDescription()); - CONMSG(" License: %s\n", pl->m_API->GetLicense()); - CONMSG(" URL: %s\n", pl->m_API->GetURL()); - CONMSG(" Details: API %03d, Date: %s\n", pl->m_API->GetApiVersion(), pl->m_API->GetDate()); - } - CONMSG("File: %s\n\n", pl->m_File.c_str()); - - return true; - } - else - { - CONMSG("Usage: meta info \n"); - - return true; - } - } - else if (strcmp(command, "pause") == 0) - { - if (args >= 2) - { - int id = atoi(info->GetArg(2)); - - char error[255]; - - if (!g_PluginMngr.Pause(id, error, sizeof(error))) - { - CONMSG("Pause failed: %s\n", error); - return true; - } - - CONMSG("Plugin %d has been paused.\n", id); - - return true; - } - else - { - CONMSG("Usage: meta pause \n"); - - return true; - } - } - else if (strcmp(command, "unpause") == 0) - { - if (args >= 2) - { - int id = atoi(info->GetArg(2)); - char error[255]; - - if (!g_PluginMngr.Unpause(id, error, sizeof(error))) - { - CONMSG("Unpause failed: %s\n", error); - return true; - } - - CONMSG("Plugin %d has been unpaused.\n", id); - - return true; - } - else - { - CONMSG("Usage: meta unpause \n"); - - return true; - } - } - else if (strcmp(command, "load") == 0) - { - if (args >= 2) - { - const char *file = info->GetArg(2); - char full_path[255]; - - const char *alias = g_PluginMngr.LookupAlias(file); - if (alias) - { - file = alias; - } - - if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0) - { - g_Metamod.PathFormat(full_path, sizeof(full_path), "%s", file); - } - else - { - const char *ext = UTIL_GetExtension(file); -#if defined WIN32 || defined _WIN32 - ext = ext ? "" : ".dll"; -#else - ext = ext ? "" : "_i486.so"; -#endif - g_Metamod.PathFormat(full_path, - sizeof(full_path), - "%s/%s%s", - g_Metamod.GetBaseDir(), - file, - ext); - } - - char error[255]={0}; - bool already; - CPluginManager::CPlugin *pl; - - PluginId id = g_PluginMngr.Load(full_path, Pl_Console, already, error, sizeof(error)); - pl = g_PluginMngr.FindById(id); - if (!pl || id < Pl_MinId || (pl->m_Status < Pl_Paused)) - { - CONMSG("Failed to load plugin %s (%s).\n", file, error); - return true; - } - - if (!already) - { - CONMSG("Plugin \"%s\" loaded with id %d.\n", pl->m_API->GetName(), pl->m_Id); - } else { - CONMSG("Plugin \"%s\" is already loaded as %d.\n", pl->m_API->GetName(), pl->m_Id); - } - - return true; - } - else - { - CONMSG("Usage: meta load \n"); - - return true; - } - } - else if ( (strcmp(command, "alias") == 0) || - (strcmp(command, "aliases") == 0) ) - { - if (args >= 3) - { - const char *alias = info->GetArg(2); - const char *value = info->GetArg(3); - - g_PluginMngr.SetAlias(alias, value); - if (value == NULL || value[0] == '\0') - { - CONMSG("Deleted alias: %s.\n", alias); - } else { - CONMSG("Set alias \"%s\" to: %s\n", alias, value); - } - } - else if (args >= 2) - { - const char *alias = info->GetArg(2); - const char *value = g_PluginMngr.LookupAlias(alias); - if (value) - { - CONMSG("Alias \"%s\" is set to: %s\n", alias, value); - } else { - CONMSG("Alias \"%s\" was not found.\n", alias); - } - } - else - { - List::iterator iter, end; - CNameAlias *p; - - iter = g_PluginMngr._alias_begin(); - end = g_PluginMngr._alias_end(); - size_t total = 0; - if (iter != end) - { - CONMSG("%-10.9s %s\n", "Alias", "File"); - CONMSG(" --- \n"); - for (; iter!=end; iter++) - { - p = (*iter); - CONMSG("%-10.9s %s\n", p->alias.c_str(), p->value.c_str()); - total++; - } - CONMSG(" --- \n"); - CONMSG("%d aliases total.\n", total); - } - else - { - CONMSG("No aliases found.\n"); - } - } - return true; - } - else if (strcmp(command, "unload") == 0) - { - if (args >= 2) - { - const char *file = info->GetArg(2); - int id = atoi(file); - char error[255]={0}; - - if (id == 0 && isalpha(file[0])) - { - char full_path[255]; - const char *alias = g_PluginMngr.LookupAlias(file); - - if (alias) - { - file = alias; - } - - /* first check if it's a known filename */ - if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0) - { - g_Metamod.PathFormat(full_path, sizeof(full_path), "%s", file); - } - else - { - const char *ext = UTIL_GetExtension(file); -#if defined WIN32 || defined _WIN32 - ext = ext ? "" : ".dll"; -#else - ext = ext ? "" : "_i486.so"; -#endif - g_Metamod.PathFormat(full_path, - sizeof(full_path), - "%s/%s%s", - g_Metamod.GetBaseDir(), - file, - ext); - } - - List::iterator iter, end; - CPluginManager::CPlugin *pl; - iter = g_PluginMngr._begin(); - end = g_PluginMngr._end(); - for (; iter!=end; iter++) - { - pl = (*iter); - if (strcmp(pl->m_File.c_str(), full_path) == 0) - { - id = pl->m_Id; - break; - } - } - if (id == 0) - { - CONMSG("Plugin \"%s\" not found.\n", full_path); - return true; - } - } - - if (!g_PluginMngr.Unload(id, false, error, sizeof(error))) - { - CONMSG("Unload failed: %s\n", error); - return true; - } - - CONMSG("Plugin %d unloaded.\n", id); - } - else - { - CONMSG("Usage: meta unload \n"); - } - return true; - } - else if (strcmp(command, "force_unload") == 0) - { - if (args >= 2) - { - int id = atoi(info->GetArg(2)); - char error[255]={0}; - - if (!g_PluginMngr.Unload(id, false, error, sizeof(error))) - { - CONMSG("Force unload failed: %s\n", error); - return true; - } - - CONMSG("Plugin %d force unloaded.\n", id); - - return true; - } - else - { - CONMSG("Usage: meta force_unload \n"); - - return true; - } - } - else if (strcmp(command, "clear") == 0) - { - if (!g_PluginMngr.UnloadAll()) - { - CONMSG("One or more plugins resisted removal (cleaned anyway).\n"); - return true; - } - - CONMSG("All plugins unloaded.\n"); - - return true; - } - else if (strcmp(command, "retry") == 0) - { - if (args >= 2) - { - int id = atoi(info->GetArg(2)); - char error[255]; - - if (!g_PluginMngr.Retry(id, error, sizeof(error))) - { - CONMSG("Error reloading plugin: %s\n", error); - return true; - } - - CONMSG("Plugin %d successfully reloaded.\n", id); - - return true; - } - else - { - CONMSG("Usage: meta retry \n"); - - return true; - } - } - } - - CONMSG("Metamod:Source Menu\n"); - CONMSG("usage: meta [arguments]\n"); - CONMSG(" alias - List or set an alias\n"); - CONMSG(" clear - Unload all plugins forcefully\n"); - CONMSG(" cmds - Show plugin commands\n"); - CONMSG(" cvars - Show plugin cvars\n"); - CONMSG(" credits - About Metamod:Source\n"); - CONMSG(" force_unload - Forcefully unload a plugin\n"); - CONMSG(" game - Information about GameDLL\n"); - CONMSG(" info - Information about a plugin\n"); - CONMSG(" list - List plugins\n"); - CONMSG(" load - Load a plugin\n"); - CONMSG(" pause - Pause a running plugin\n"); - CONMSG(" refresh - Reparse plugins file\n"); - CONMSG(" retry - Attempt to reload a plugin\n"); - CONMSG(" unload - Unload a loaded plugin\n"); - CONMSG(" unpause - Unpause a paused plugin\n"); - CONMSG(" version - Version information\n"); - - return true; -} - -bool Command_ClientMeta(edict_t *client, IMetamodSourceCommandInfo *info) -{ - const char *cmd = info->GetArg(0); - - if (strcmp(cmd, "meta") == 0) - { - unsigned int args = info->GetArgCount(); - if (args == 1) - { - const char *subcmd = info->GetArg(1); - - if (strcmp(subcmd, "credits") == 0) - { - CLIENT_CONMSG(client, "Metamod:Source was developed by:\n"); - CLIENT_CONMSG(client, " SourceHook: Pavol \"PM OnoTo\" Marko\n"); - CLIENT_CONMSG(client, " GameDLL/Plugins: David \"BAILOPAN\" Anderson\n"); - CLIENT_CONMSG(client, " GameDLL: Scott \"Damaged Soul\" Ehlert\n"); - CLIENT_CONMSG(client, "For more information, see the official website\n"); - CLIENT_CONMSG(client, "http://www.sourcemm.net/\n"); - - return true; - } - else if(strcmp(subcmd, "version") == 0) - { - CLIENT_CONMSG(client, "Metamod:Source version %s\n", SOURCEMM_VERSION); - CLIENT_CONMSG(client, "Compiled on: %s\n", SOURCEMM_DATE); - CLIENT_CONMSG(client, "Plugin interface version: %d:%d\n", PLAPI_VERSION, PLAPI_MIN_VERSION); - CLIENT_CONMSG(client, "SourceHook version: %d:%d\n", g_SourceHook.GetIfaceVersion(), g_SourceHook.GetImplVersion()); - CLIENT_CONMSG(client, "http://www.sourcemm.net/\n"); - - return true; - } - else if(strcmp(subcmd, "list") == 0) - { - CPluginManager::CPlugin *pl; - ISmmPlugin *plapi; - const char *plname; - PluginIter i; - char buffer[256]; - int len = 0; - int plnum = 0; - - for (i = g_PluginMngr._begin(); i != g_PluginMngr._end(); i++, len=0) - { - pl = (*i); - if (pl && pl->m_Status == Pl_Running) - { - plapi = pl->m_API; - if (!plapi || !plapi->QueryRunning(NULL, 0)) - { - continue; - } - plnum++; - - len += UTIL_Format(buffer, sizeof(buffer), " [%02d]", plnum); - - plname = IS_STR_FILLED(plapi->GetName()) ? plapi->GetName() : pl->m_File.c_str(); - len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " %s", plname); - - if (IS_STR_FILLED(plapi->GetVersion())) - { - len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " (%s)", plapi->GetVersion()); - } - if (IS_STR_FILLED(plapi->GetAuthor())) - { - UTIL_Format(&buffer[len], sizeof(buffer)-len, " by %s", plapi->GetAuthor()); - } - - CLIENT_CONMSG(client, "%s\n", buffer); - } - } - - if (!plnum) - { - CLIENT_CONMSG(client, "No active plugins loaded.\n"); - } - - return true; - } - } - - CLIENT_CONMSG(client, "Metamod:Source Menu\n"); - CLIENT_CONMSG(client, "usage: meta \n"); - CLIENT_CONMSG(client, " credits - About Metamod:Source\n"); - CLIENT_CONMSG(client, " list - List plugins\n"); - CLIENT_CONMSG(client, " version - Version information\n"); - - return true; - } - - return false; -} diff --git a/sourcemm/metamod_console.h b/sourcemm/metamod_console.h deleted file mode 100644 index de5c868..0000000 --- a/sourcemm/metamod_console.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_CONCOMMANDS_H -#define _INCLUDE_CONCOMMANDS_H - -#include "metamod_provider.h" - -bool Command_Meta(IMetamodSourceCommandInfo *info); -bool Command_ClientMeta(edict_t *client, IMetamodSourceCommandInfo *info); - -#endif //_INCLUDE_CONCOMMANDS_H diff --git a/sourcemm/metamod_oslink.cpp b/sourcemm/metamod_oslink.cpp deleted file mode 100644 index 42f1517..0000000 --- a/sourcemm/metamod_oslink.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#include "metamod_oslink.h" -#include -#ifdef __linux -#include -#include -#endif - -#if defined __WIN32__ || defined _WIN32 || defined WIN32 -const char *dlerror() -{ - static char buf[1024]; - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buf, 0, NULL); - return buf; -} -#endif - -#if defined __linux__ -int GetLastError() -{ - return errno; -} - -extern "C" void __cxa_guard_acquire(void) -{ -} - -extern "C" void __cxa_guard_release(void) -{ -} -#endif - -bool GetFileOfAddress(void *pAddr, char *buffer, size_t maxlength) -{ -#if defined WIN32 || defined _WIN32 - MEMORY_BASIC_INFORMATION mem; - if (!VirtualQuery(pAddr, &mem, sizeof(mem))) - return false; - if (mem.AllocationBase == NULL) - return false; - HMODULE dll = (HMODULE)mem.AllocationBase; - GetModuleFileName(dll, (LPTSTR)buffer, maxlength); -#elif defined __linux__ - Dl_info info; - if (!dladdr(pAddr, &info)) - return false; - if (!info.dli_fbase || !info.dli_fname) - return false; - const char *dllpath = info.dli_fname; - snprintf(buffer, maxlength, "%s", dllpath); -#endif - return true; -} - -#if defined __GNUC__ && (__GNUC__ == 3 || __GNUC__ == 4) -void * operator new(size_t size) { - return malloc(size); -} - -void * operator new[](size_t size) { - return malloc(size); -} - -void operator delete(void * ptr) { - free(ptr); -} - -void operator delete[](void * ptr) { - free(ptr); -} -#endif - diff --git a/sourcemm/metamod_oslink.h b/sourcemm/metamod_oslink.h deleted file mode 100644 index 8dcf4ca..0000000 --- a/sourcemm/metamod_oslink.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_OSLINK_H -#define _INCLUDE_OSLINK_H - -/** - * @brief Defines OS-independent information - * @file oslink.h - */ - -#if defined __WIN32__ || defined _WIN32 || defined WIN32 - #define WIN32_LEAN_AND_MEAN - #define OS_WIN32 - #if defined _MSC_VER && _MSC_VER >= 1400 - #undef ARRAYSIZE - #else - #define mkdir(a) _mkdir(a) - #endif - #include - #include - #include - #define dlmount(x) LoadLibrary(x) - #define dlsym(x, s) GetProcAddress(x, s) - #define dlclose(x) FreeLibrary(x) - const char* dlerror(); - #define abspath(x, s) _fullpath(x, s, sizeof(x)) - #define PATH_SEP_STR "\\" - #define PATH_SEP_CHAR '\\' - #define ALT_SEP_CHAR '/' - #define PATH_SIZE MAX_PATH - #define SERVER_DLL "server.dll" - #define strcasecmp stricmp -#elif defined __linux__ - #define OS_LINUX - #include - #include - #include - #include - typedef void* HINSTANCE; - #define dlmount(x) dlopen(x,RTLD_NOW) - #define abspath(x, s) realpath(s, x) - #define PATH_SEP_STR "/" - #define PATH_SEP_CHAR '/' - #define ALT_SEP_CHAR '\\' - #define PATH_SIZE PATH_MAX - #define stricmp strcasecmp - #define strnicmp strncasecmp - #define SERVER_DLL "server_i486.so" -#endif - -#if defined __linux__ - extern int errno; - int GetLastError(); -#endif - -bool GetFileOfAddress(void *pAddr, char *buffer, size_t maxlength); - -#if defined __WIN32__ || defined _WIN32 || defined WIN32 - #define SMM_API extern "C" __declspec(dllexport) -#elif defined __GNUC__ - #if (__GNUC__ == 4) - #define SMM_API extern "C" __attribute__ ((visibility("default"))) - #else - #define SMM_API extern "C" - #endif -#endif - -#if defined __WIN32__ || defined _WIN32 || defined WIN32 - typedef __int64 int64_t; - typedef unsigned __int64 uint64_t; -#elif defined __GNUC__ -#include -#if !__GLIBC_HAVE_LONG_LONG - typedef long long int64_t; - typedef unsigned long long uint64_t; -#endif -#endif - -#ifndef __linux__ - #define snprintf _snprintf - #define vsnprintf _vsnprintf -#endif - -#endif //_INCLUDE_OSLINK_H diff --git a/sourcemm/metamod_plugins.cpp b/sourcemm/metamod_plugins.cpp deleted file mode 100644 index 4bb0bbe..0000000 --- a/sourcemm/metamod_plugins.cpp +++ /dev/null @@ -1,747 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#if defined _DEBUG -#define DEBUG2 -#undef _DEBUG -#endif -#include "metamod.h" -#include "metamod_plugins.h" -#include "metamod_util.h" -#if defined DEBUG2 -#undef DEBUG2 -#define _DEBUG -#endif - -/** - * @brief Implements functions from CPlugin.h - * @file CPlugin.cpp - */ - -using namespace SourceMM; - -#define ITER_PLEVENT(evn, plid) \ - CPluginManager::CPlugin *_Xpl; \ - SourceHook::List::iterator event; \ - IMetamodListener *api; \ - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ - _Xpl = (*iter); \ - if (_Xpl->m_Id == plid) \ - continue; \ - for (event=_Xpl->m_Events.begin(); event!=_Xpl->m_Events.end(); event++) { \ - api = (*event); \ - api->evn(plid); \ - } \ - } - -CPluginManager g_PluginMngr; - -CPluginManager::CPluginManager() -{ - m_LastId = Pl_MinId; - m_AllLoaded = false; -} - -CPluginManager::~CPluginManager() -{ - SourceHook::List::iterator iter; - - for (iter = m_Aliases.begin(); iter != m_Aliases.end(); iter++) - { - delete (*iter); - } - - m_Aliases.clear(); -} - -const char *CPluginManager::LookupAlias(const char *alias) -{ - SourceHook::List::iterator iter; - CNameAlias *p; - - for (iter = m_Aliases.begin(); iter != m_Aliases.end(); iter++) - { - p = (*iter); - if (p->alias.compare(alias) == 0) - { - return p->value.c_str(); - } - } - - return NULL; -} - -SourceHook::List::iterator CPluginManager::_alias_begin() -{ - return m_Aliases.begin(); -} - -SourceHook::List::iterator CPluginManager::_alias_end() -{ - return m_Aliases.end(); -} - -void CPluginManager::SetAlias(const char *alias, const char *value) -{ - SourceHook::List::iterator iter; - CNameAlias *p; - - for (iter = m_Aliases.begin(); iter != m_Aliases.end(); iter++) - { - p = (*iter); - if (p->alias.compare(alias) == 0) - { - if (value[0] == '\0') - { - iter = m_Aliases.erase(iter); - return; - } - else - { - p->value.assign(value); - return; - } - } - } - - if (value[0] != '\0') - { - p = new CNameAlias; - - p->alias.assign(alias); - p->value.assign(value); - - m_Aliases.push_back(p); - } -} - -CPluginManager::CPlugin::CPlugin() : m_Id(0), m_Source(0), m_API(NULL), m_Lib(NULL) -{ - -} - -PluginId CPluginManager::Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen) -{ - already = false; - //Check if we're about to reload an old plugin - PluginIter i = m_Plugins.begin(); - while (i != m_Plugins.end()) - { - if ((*i) && UTIL_PathCmp(file, (*i)->m_File.c_str())) - { - if ((*i)->m_Status < Pl_Paused) - { - //Attempt to load the plugin again - already = true; - i = m_Plugins.erase(i); - continue; - } - else - { - //No need to load it - already = true; - return (*i)->m_Id; - } - } - i++; - } - - CPlugin *pl = _Load(file, source, error, maxlen); - - if (!pl) - { - return Pl_BadLoad; - } - - ITER_PLEVENT(OnPluginLoad, pl->m_Id); - - return pl->m_Id; -} - -CPluginManager::CPlugin *CPluginManager::FindById(PluginId id) -{ - PluginIter i; - - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_Id == id )\ - { - return (*i); - } - } - - return NULL; -} - -void CPluginManager::SetAllLoaded() -{ - m_AllLoaded = true; - PluginIter i; - - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i) && (*i)->m_Status == Pl_Running && (*i)->m_API ) - { - //API 4 is when we added this callback - //Min version is now 5, so we ignore this check - //if ( (*i)->m_API->GetApiVersion() >= 004 ) - (*i)->m_API->AllPluginsLoaded(); - } - } -} - -bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - UTIL_Format(error, maxlen, "Plugin id not found"); - return false; - } - - bool ret; - - if ((ret=_Pause(pl, error, maxlen)) == true) - { - ITER_PLEVENT(OnPluginPause, pl->m_Id); - } - - return ret; -} - -bool CPluginManager::Unpause(PluginId id, char *error, size_t maxlen) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - UTIL_Format(error, maxlen, "Plugin id not found"); - return false; - } - - bool ret; - - if ( (ret=_Unpause(pl, error, maxlen)) == true ) - { - ITER_PLEVENT(OnPluginUnpause, pl->m_Id); - } - - return ret; -} - -bool CPluginManager::Unload(PluginId id, bool force, char *error, size_t maxlen) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - UTIL_Format(error, maxlen, "Plugin %d not found", id); - return false; - } - - bool ret; - PluginId old_id = pl->m_Id; - if ( (ret=_Unload(pl, force, error, maxlen)) == true ) - { - ITER_PLEVENT(OnPluginUnload, old_id); - } - - return ret; -} - -bool CPluginManager::Retry(PluginId id, char *error, size_t len) -{ - PluginIter i; - char buffer[64]; - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i) && (*i)->m_Id == id ) - { - if ( (*i)->m_Status >= Pl_Paused) - { - UTIL_Format(error, len, "Plugin %d is already running.", id); - return false; - } - CPlugin *pl = _Load((*i)->m_File.c_str(), Pl_Console, error, len); - if (!pl) - { - return false; - } - if (pl->m_Status >= Pl_Paused) - { - //Now it gets crazy... unload the original copy. - _Unload( (*i), true, buffer, sizeof(buffer)-1 ); - - //Set the new copy's id - pl->m_Id = id; - - //We just wasted an id... reclaim it - m_LastId--; - - return true; - } - else - { - //don't really care about the buffer here - _Unload(pl, true, buffer, sizeof(buffer)-1); - - //We just wasted an id... reclaim it - m_LastId--; - return false; - } - } - } - - UTIL_Format(error, len, "Plugin %d not found,", id); - return false; -} - -CPluginManager::CPlugin *CPluginManager::FindByAPI(ISmmPlugin *api) -{ - PluginIter i; - - //don't find bad plugins! - if (!api) - { - return NULL; - } - - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ((*i)->m_API == api) - { - return (*i); - } - } - - return NULL; -} - -int CPluginManager::GetPluginCount() -{ - return (int)m_Plugins.size(); -} - -const char *CPluginManager::GetStatusText(CPlugin *pl) -{ - switch (pl->m_Status) - { - case Pl_NotFound: - return "NOFILE"; - case Pl_Error: - return "ERROR"; - case Pl_Refused: - return "FAILED"; - case Pl_Paused: - return "PAUSED"; - case Pl_Running: - { - if (pl->m_API && pl->m_API->QueryRunning(NULL, 0)) - { - return "STOPPED"; - } else { - return "RUNNING"; - } - } - default: - return "-"; - } -} - -CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source, char *error, size_t maxlen) -{ - FILE *fp; - CPlugin *pl; - - pl = new CPlugin(); - *error = '\0'; - - //Add plugin to list - pl->m_Id = m_LastId; - pl->m_File.assign(file); - m_Plugins.push_back(pl); - m_LastId++; - - //Check if the file even exists - fp = fopen(file, "r"); - if (!fp) - { - if (error) - { - UTIL_Format(error, maxlen, "File not found: %s", file); - } - pl->m_Status = Pl_NotFound; - } - - if (fp) - { - fclose(fp); - fp = NULL; - - //Load the file - pl->m_Lib = dlmount(file); - if (!pl->m_Lib) - { - if (error) - { - UTIL_Format(error, maxlen, "%s", dlerror()); - } - pl->m_Status = Pl_Error; - } - else - { - CreateInterfaceFn pfn = (CreateInterfaceFn)(dlsym(pl->m_Lib, PL_EXPOSURE_C)); - if (!pfn) - { - if (error) - { - UTIL_Format(error, maxlen, "Function %s not found", PL_EXPOSURE_C); - } - pl->m_Status = Pl_Error; - } - else - { - pl->m_API = static_cast((pfn)(PLAPI_NAME, NULL)); - if (!pl->m_API) - { - if (error) - { - UTIL_Format(error, maxlen, "Failed to get API"); - } - pl->m_Status = Pl_Error; - } - else - { - int api = pl->m_API->GetApiVersion(); - if (api < PLAPI_MIN_VERSION) - { - if (error) - { - UTIL_Format(error, maxlen, "Plugin API %d is out of date with required minimum (%d)", api, PLAPI_MIN_VERSION); - } - pl->m_Status = Pl_Error; - } - else if (api > PLAPI_VERSION) - { - if (error) - { - UTIL_Format(error, maxlen, "Plugin API %d is newer than internal version (%d)", api, PLAPI_VERSION); - } - pl->m_Status = Pl_Error; - } - else - { - if (pl->m_API->Load(pl->m_Id, &g_Metamod, error, maxlen, m_AllLoaded)) - { - pl->m_Status = Pl_Running; - if (m_AllLoaded) - { - //API 4 is when we added this callback - //Removing this code as the min version is now 5 - //if (pl->m_API->GetApiVersion() >= 4) - pl->m_API->AllPluginsLoaded(); - } - } - else - { - pl->m_Status = Pl_Refused; - } - } - } - } - } - } - - if (pl->m_Lib && (pl->m_Status < Pl_Paused)) - { - pl->m_Events.clear(); - g_SourceHook.UnloadPlugin(pl->m_Id); - UnregAllConCmds(pl); - - dlclose(pl->m_Lib); - pl->m_Lib = NULL; - pl->m_API = NULL; - } - - return pl; -} - -bool CPluginManager::_Unload(CPluginManager::CPlugin *pl, bool force, char *error, size_t maxlen) -{ - if (error) - { - *error = '\0'; - } - - if (pl->m_API && pl->m_Lib) - { - //Note, we'll always tell the plugin it will be unloading... - if (pl->m_API->Unload(error, maxlen) || force) - { - //Make sure to detach it from sourcehook! - g_SourceHook.UnloadPlugin(pl->m_Id); - - pl->m_Events.clear(); - - UnregAllConCmds(pl); - - //Clean up the DLL - dlclose(pl->m_Lib); - pl->m_Lib = NULL; - pl->m_API = NULL; - - //Remove the plugin from the list - PluginIter i; - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_Id == pl->m_Id ) - { - i = m_Plugins.erase(i); - break; - } - } - //Free its memory - delete pl; - - return true; - } - } else { - //The plugin is not valid, and let's just remove it from the list anyway - PluginIter i; - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_Id == pl->m_Id ) - { - i = m_Plugins.erase(i); - break; - } - } - delete pl; - - return true; - } - - return false; -} - -bool CPluginManager::_Pause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) -{ - if (error) - { - *error = '\0'; - } - - if (pl->m_Status != Pl_Running || !pl->m_API) - { - if (error) - { - UTIL_Format(error, maxlen, "Plugin cannot be paused"); - } - } - else - { - if (pl->m_API->Pause(error, maxlen)) - { - g_SourceHook.PausePlugin(pl->m_Id); - pl->m_Status = Pl_Paused; - - return true; - } - } - - return false; -} - -bool CPluginManager::_Unpause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) -{ - if (error) - { - *error = '\0'; - } - - if (pl->m_Status != Pl_Paused || !pl->m_API) - { - if (error) - { - UTIL_Format(error, maxlen, "Plugin cannot be unpaused"); - } - } - else - { - if (pl->m_API->Unpause(error, maxlen)) - { - g_SourceHook.UnpausePlugin(pl->m_Id); - pl->m_Status = Pl_Running; - - return true; - } - } - - return false; -} - -bool CPluginManager::UnloadAll() -{ - PluginIter i; - - char error[128]; - bool status = true; - - while ((i = m_Plugins.begin()) != m_Plugins.end()) - { - if ( !_Unload( (*i), true, error, sizeof(error)) ) - { - status = false; - } - } - - return status; -} - -bool CPluginManager::Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - return false; - } - - file = pl->m_File.c_str(); - status = pl->m_Status; - source = pl->m_Source; - - return true; -} - -bool CPluginManager::QueryRunning(PluginId id, char *error, size_t maxlength) -{ - CPlugin *pl = FindById(id); - - if (!pl || !pl->m_API) - { - if (error) - { - UTIL_Format(error, maxlength, "Plugin not valid"); - } - return false; - } - - return pl->m_API->QueryRunning(error, maxlength); -} - -bool CPluginManager::QueryHandle(PluginId id, void *&handle) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - return false; - } - - handle = static_cast(pl->m_Lib); - - return true; -} - -PluginIter CPluginManager::_begin() -{ - return m_Plugins.begin(); -} - -PluginIter CPluginManager::_end() -{ - return m_Plugins.end(); -} - -void CPluginManager::AddPluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - { - return; - } - - pl->m_Cvars.push_back(pCvar); -} - -void CPluginManager::AddPluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - { - return; - } - - pl->m_Cmds.push_back(pCmd); -} - -void CPluginManager::RemovePluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - { - return; - } - - pl->m_Cvars.remove(pCvar); -} - -void CPluginManager::RemovePluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - { - return; - } - - pl->m_Cmds.remove(pCmd); -} - -void CPluginManager::UnregAllConCmds(CPlugin *pl) -{ - SourceHook::List::iterator i; - - /* :TODO: */ - for (i=pl->m_Cvars.begin(); i!=pl->m_Cvars.end(); i++) - { - g_Metamod.UnregisterConCommandBase(pl->m_Id, (*i) ); - } - pl->m_Cvars.clear(); - - for (i=pl->m_Cmds.begin(); i!=pl->m_Cmds.end(); i++) - { - g_Metamod.UnregisterConCommandBase(pl->m_Id, (*i) ); - } - pl->m_Cmds.clear(); -} - diff --git a/sourcemm/metamod_plugins.h b/sourcemm/metamod_plugins.h deleted file mode 100644 index f2e11c3..0000000 --- a/sourcemm/metamod_plugins.h +++ /dev/null @@ -1,167 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_CPLUGIN_H -#define _INCLUDE_CPLUGIN_H - -/** - * @brief Implementation of Plugin API and Management routines - * @file CPlugin.cpp - */ - -#include -#include -#include -#include -#include "IPluginManager.h" -#include "metamod_oslink.h" - -/** - * History of plugin versions: (M=min, C=current) - * 1: Initial interface - * 2: Added GetLogTag() - * 3: Moved GetApiVersion() to top (2005-04-16) - * 4: Added AllPluginsLoaded() callback (2005-04-18) - * 5: Bumped version for SourceHook V4 (2005-05-01) - * 6: Added functions for console printing (2005-05-26) - * M 7: Changed template libraries (2005-08-11) - * New loading structure mechanism - * New SourceHook version - * 8: New SourceHook version (2005-12-23) - * New ISmmAPI additions - * 9: New ISmmPluginManager additions - * C 10: Added VSP listen functions to ISmmAPI and IMetamodListener (2007-02-09) - * C 11: New SourceHook version V5 (May, 2007) - */ - -#define PLAPI_MIN_VERSION 7 - -namespace SourceMM -{ - struct CNameAlias - { - SourceHook::String alias; - SourceHook::String value; - }; - /** - * @brief Implements Plugin Manager API - */ - class CPluginManager : public ISmmPluginManager - { - public: - /** - * @brief Internal structure for holding plugin data - */ - class CPlugin - { - public: - CPlugin(); - public: - PluginId m_Id; - SourceHook::String m_File; - Pl_Status m_Status; - PluginId m_Source; - ISmmPlugin *m_API; - HINSTANCE m_Lib; - SourceHook::List m_Cvars; - SourceHook::List m_Cmds; - SourceHook::List m_Events; - }; - public: - CPluginManager(); - ~CPluginManager(); - void SetAllLoaded(); - public: - PluginId Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen); - bool Unload(PluginId id, bool force, char *error, size_t maxlen); - bool Pause(PluginId id, char *error, size_t maxlen); - bool Unpause(PluginId id, char *error, size_t maxlen); - bool UnloadAll(); - void SetAlias(const char *alias, const char *value); - public: - bool Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source); - bool QueryRunning(PluginId id, char *error, size_t maxlength); - bool QueryHandle(PluginId id, void *&handle); - - void AddPluginCvar(ISmmPlugin *api, ConCommandBase *pCvar); - void AddPluginCmd(ISmmPlugin *api, ConCommandBase *pCmd); - void RemovePluginCvar(ISmmPlugin *api, ConCommandBase *pCvar); - void RemovePluginCmd(ISmmPlugin *api, ConCommandBase *pCmd); - - /** - * @brief Finds a plugin by Id - * - * @param id Id of plugin - * @return CPlugin on success, NULL otherwise - */ - CPlugin *FindById(PluginId id); - - CPlugin *FindByAPI(ISmmPlugin *api); - - /** - * @brief Attempts to reload a failed plugin - * - * @param id Id of plugin - * @param error Error message buffer - * @param len Maximum length of buffer - * @return True on success, false otherwise - */ - bool Retry(PluginId id, char *error, size_t len); - - int GetPluginCount(); - const char *GetStatusText(CPlugin *pl); - - //get alias info - const char *LookupAlias(const char *alias); - SourceHook::List::iterator _alias_begin(); - SourceHook::List::iterator _alias_end(); - - //Internal iterators - SourceHook::List::iterator _begin(); - SourceHook::List::iterator _end(); - private: - //These are identical internal functions for the wrappers above. - CPlugin *_Load(const char *file, PluginId source, char *error, size_t maxlen); - bool _Unload(CPlugin *pl, bool force, char *error, size_t maxlen); - bool _Pause(CPlugin *pl, char *error, size_t maxlen); - bool _Unpause(CPlugin *pl, char *error, size_t maxlen); - void UnregAllConCmds(CPlugin *pl); - private: - PluginId m_LastId; - SourceHook::List m_Plugins; - SourceHook::List m_Aliases; - bool m_AllLoaded; - }; -}; - -typedef SourceHook::List::iterator PluginIter; - -/** @brief Singleton for plugin manager */ -extern SourceMM::CPluginManager g_PluginMngr; - -#endif //_INCLUDE_CPLUGIN_H - diff --git a/sourcemm/metamod_provider.h b/sourcemm/metamod_provider.h deleted file mode 100644 index f7f324e..0000000 --- a/sourcemm/metamod_provider.h +++ /dev/null @@ -1,294 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_METAMOD_SOURCE_SUPPORT_H_ -#define _INCLUDE_METAMOD_SOURCE_SUPPORT_H_ - -namespace SourceMM -{ - enum - { - ConVarFlag_None, - ConVarFlag_Notify, - ConVarFlag_Replicated, - ConVarFlag_SpOnly - }; - - enum ProvidedHooks - { - ProvidedHook_LevelInit = 0, /**< IServerGameDLL::LevelInit */ - ProvidedHook_LevelShutdown = 1, /**< IServerGameDLL::LevelShutdown */ - ProvidedHook_DLLInit = 2, /**< IServerGameDLL::DLLInit */ - ProvidedHook_DLLShutdown = 3, /**< IServerGameDLL::DLLShutdown */ - ProvidedHook_GameInit = 4, /**< IServerGameDLL::GameInit */ - }; - - /** - * @brief Abstracts command information, since the new engine fixes the - * re-entrancy problems in the tokenization system. - */ - class IMetamodSourceCommandInfo - { - public: - /** - * @brief Returns the argument count such that arguments - * 1 to N are valid arguments, and 0 is the command name. - * - * @return Argument count. - */ - virtual unsigned int GetArgCount() =0; - - /** - * @brief Returns the string of an argument number. - * - * @param num Argument number. - * @return Argument text. - */ - virtual const char *GetArg(unsigned int num) =0; - - /** - * @brief Returns the entire command argument string. - * - * @return Argument string. - */ - virtual const char *GetArgString() =0; - }; - - class IMetamodSourceProvider - { - public: - /** - * @brief Returns whether source engine build is compatible. - * - * @param build Source engine build. - * @return True if compatible, false otherwise. - */ - virtual bool IsSourceEngineBuildCompatible(int build) =0; - - /** - * @brief Retrieves hook information for each callback. Each hook - * must be implemented. - * - * @param hook Hook information to provide. - * @param pInfo Non-NULL pointer to fill with information - * about the hook's virtual location. - * @return True if supported, false to fail, which - * will cause Metamod:Source to fail. - */ - virtual bool GetHookInfo(ProvidedHooks hook, SourceHook::MemFuncInfo *pInfo) =0; - - /** - * @brief Logs a message via IVEngineServer::LogPrint. - * - * @param buffer Buffer to print. - * @return True on success, false if not supported, - * or IVEngineServer is not yet known. - */ - virtual bool LogMessage(const char *buffer) =0; - - /** - * @brief Returns the command line value of a parameter. If ICvar - * is not yet loaded, this uses an equivalent function. - * - * @param key Parameter to look up. - * @param val Default string to return if none found. - * @return Parameter value. - */ - virtual const char *GetCommandLineValue(const char *key, const char *defval) =0; - - /** - * @brief Prints a string to the remote server console. - * - * Note: new lines are not appended. - * - * @param msg Message string. - */ - virtual void ConsolePrint(const char *msg) =0; - - /** - * @brief Returns whether remote printing is available. - * - * @return True if remote printing is available, - * otherwise returns false. - */ - virtual bool IsRemotePrintingAvailable() =0; - - /** - * @brief Prints text in the specified client's console. - * - * @param client Client edict pointer. - * @param msg Message string. - */ - virtual void ClientConsolePrint(edict_t *client, const char *msg) =0; - - /** - * @brief Returns a server plugin helper for the given interface - * string. - * - * @param iface Interface version - * @return IServerPluginCallbacks pointer. - */ - virtual IServerPluginCallbacks *GetVSPCallbacks(const char *iface) =0; - - /** - * @brief Halts the server with a fatal error message. - * - * No newline is appended. - * - * @param fmt Formatted message string. - * @param ... Format parameters. - */ - virtual void DisplayError(const char *fmt, ...) =0; - - /** - * @brief Sends the server a warning message. - * - * No newline is appended. - * - * @param fmt Formatted message string. - * @param ... Format parameters. - */ - virtual void DisplayWarning(const char *fmt, ...) =0; - - /** - * @brief Attempts to notify the provider of the gamedll version being - * used. - * - * @param iface Interface string. - * @return Version number on success, 0 otherwise. - */ - virtual int TryServerGameDLL(const char *iface) =0; - - /** - * @brief Notifies the provider that the DLLInit pre-hook is almost done. - */ - virtual void Notify_DLLInit_Pre(void *gamedll, - CreateInterfaceFn engineFactory, - CreateInterfaceFn serverFactory) =0; - - virtual void Notify_DLLShutdown_Pre() =0; - - /** - * @brief Wrapper around IVEngineServer::ServerCommand() - * - * @param cmd Command string. - */ - virtual void ServerCommand(const char *cmd) =0; - - /** - * @brief Creates a ConVar pointer. - * - * @param name ConVar name. - * @param defval Default value string. - * @param flags ConVar flags. - * @param help Help text. - * @return ConVar pointer. - */ - virtual ConVar *CreateConVar(const char *name, - const char *defval, - const char *help, - int flags) =0; - - /** - * @brief Returns the string value of a ConVar. - * - * @param convar ConVar pointer. - * @return String value. - */ - virtual const char *GetConVarString(ConVar *convar) =0; - - /** - * @brief Retrieves the game description. - * - * @return Game description. - */ - virtual const char *GetGameDescription() =0; - - /** - * @brief Returns the ConCommandBase accessor. - * - * @return An IConCommandBaseAccessor pointer. - */ - virtual IConCommandBaseAccessor *GetConCommandBaseAccessor() =0; - - /** - * @brief Registers a ConCommandBase. - * - * @param pCommand ConCommandBase to register. - * @return True if successful, false otherwise. - */ - virtual bool RegisterConCommandBase(ConCommandBase *pCommand) =0; - - /** - * @brief Unregisters a ConCommandBase. - * - * @param pCommand ConCommandBase to unlink. - */ - virtual void UnregisterConCommandBase(ConCommandBase *pCommand) =0; - - /** - * @brief Returns whether a ConCommandBase is a command or not. - * - * @param pCommand ConCommandBase pointer. - * @return True if a command, false otherwise. - */ - virtual bool IsConCommandBaseACommand(ConCommandBase *pCommand) =0; - - /** - * @brief Returns the number of user messages in the GameDLL. - * - * @return Number of user messages, or -1 if SourceMM has - * failed to get user message list. - */ - virtual int GetUserMessageCount() =0; - - /** - * @brief Returns the index of the specified user message. - * - * @param name User message name. - * @param size Optional pointer to store size of user message. - * @return Message index, or -1 on failure. - */ - virtual int FindUserMessage(const char *name, int *size=NULL) =0; - - /** - * @brief Returns the name of the specified user message. - * - * @param index User message index. - * @param size Optional pointer to store size of user message. - * @return Message name, or NULL on failure. - */ - virtual const char *GetUserMessage(int index, int *size=NULL) =0; - }; -}; - -extern PluginId g_PLID; -extern SourceHook::ISourceHook *g_SHPtr; -extern SourceMM::IMetamodSourceProvider *provider; - -#endif //_INCLUDE_METAMOD_SOURCE_SUPPORT_H_ - diff --git a/sourcemm/metamod_util.cpp b/sourcemm/metamod_util.cpp deleted file mode 100644 index 730eddf..0000000 --- a/sourcemm/metamod_util.cpp +++ /dev/null @@ -1,425 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#include -#include -#include -#include "metamod_util.h" -#include "metamod_oslink.h" - -/** - * @brief Utility functions - * @file util.cpp - */ - -const char *UTIL_GetExtension(const char *file) -{ - int len = strlen(file); - int i = 0; - - for (i = len - 1; i >= 0; i--) - { - if (file[i] == '/' || file[i] == '\\') - { - return NULL; - } - - if ((file[i] == '.') && (i != len - 1)) - { - return (const char *)&(file[i + 1]); - } - } - - return NULL; -} - -void UTIL_TrimLeft(char *buffer) -{ - /* Let's think of this as our iterator */ - char *i = buffer; - - /* Make sure the buffer isn't null */ - if (i && *i) - { - /* Add up number of whitespace characters */ - while(isspace((unsigned char) *i)) - { - i++; - } - - /* If whitespace chars in buffer then adjust string so first non-whitespace char is at start of buffer */ - if (i != buffer) - { - memmove(buffer, i, (strlen(i) + 1) * sizeof(char)); - } - } -} - -void UTIL_TrimRight(char *buffer) -{ - /* Make sure buffer isn't null */ - if (buffer) - { - size_t len = strlen(buffer); - - /* Loop through buffer backwards while replacing whitespace chars with null chars */ - for (size_t i = len - 1; i >= 0; i--) - { - if (isspace((unsigned char) buffer[i])) - { - buffer[i] = '\0'; - } else { - break; - } - } - } -} - -/* :TODO: this should skip string literals */ -void UTIL_TrimComments(char *buffer) -{ - int num_sc = 0; - size_t len = strlen(buffer); - if (buffer) - { - for (int i = len - 1; i >= 0; i--) - { - if (buffer[i] == '/') - { - if (++num_sc >= 2 && i==0) - { - buffer[i] = '\0'; - return; - } - } else { - if (num_sc >= 2) - { - buffer[i] = '\0'; - return; - } - num_sc = 0; - } - /* size_t won't go below 0, manually break out */ - if (i == 0) - { - break; - } - } - } -} - -void UTIL_KeySplit(const char *str, char *buf1, size_t len1, char *buf2, size_t len2) -{ - size_t start; - size_t len = strlen(str); - - for (start = 0; start < len; start++) - { - if (!isspace(str[start])) - { - break; - } - } - - size_t end; - for (end = start; end < len; end++) - { - if (isspace(str[end])) - { - break; - } - } - - size_t i, c = 0; - for (i = start; i < end; i++, c++) - { - if (c >= len1) - { - break; - } - buf1[c] = str[i]; - } - buf1[c] = '\0'; - - for (start = end; start < len; start++) - { - if (!isspace(str[start])) - { - break; - } - } - - for (c = 0; start < len; start++, c++) - { - if (c >= len2) - { - break; - } - buf2[c] = str[start]; - } - buf2[c] = '\0'; -} - -bool UTIL_PathCmp(const char *path1, const char *path2) -{ - size_t pos1 = 0, pos2 = 0; - - while (true) - { - if (path1[pos1] == '\0' || path2[pos2] == '\0') - { - return (path1[pos1] == path2[pos2]); - } - - if (path1[pos1] == PATH_SEP_CHAR) - { - if (path2[pos2] != PATH_SEP_CHAR) - { - return false; - } - - /* Look for extra path chars */ - while (path1[++pos1]) - { - if (path1[pos1] != PATH_SEP_CHAR) - { - break; - } - } - while (path2[++pos2]) - { - if (path2[pos2] != PATH_SEP_CHAR) - { - break; - } - } - continue; - } - - /* If we're at a different non-alphanumeric, the next character MUST match */ - if (!isalpha(path1[pos1]) && (path1[pos1] != path2[pos2])) - { - return false; - } - - #ifdef WIN32 - if (toupper(path1[pos1]) != toupper(path2[pos2])) - #else - if (path1[pos1] != path2[pos2]) - #endif - { - return false; - } - - pos1++; - pos2++; - } -} - -size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - size_t len = vsnprintf(buffer, maxlength, fmt, ap); - va_end(ap); - - if (len >= maxlength) - { - len = maxlength - 1; - buffer[len] = '\0'; - } - - return len; -} - -size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params) -{ - size_t len = vsnprintf(buffer, maxlength, fmt, params); - - if (len >= maxlength) - { - len = maxlength - 1; - buffer[len] = '\0'; - } - - return len; -} - -inline bool pathchar_isalpha(char a) -{ - return (((a & 1<<7) == 0) && isalpha(a)); -} - -inline bool pathchar_sep(char a) -{ -#if defined WIN32 - return (a == '/' || a == '\\'); -#elif defined __linux__ - return (a == '/'); -#endif -} - -inline bool pathstr_isabsolute(const char *str) -{ -#if defined WIN32 - return (pathchar_isalpha(str[0]) - && str[1] == ':' - && pathchar_sep(str[2])); -#elif defined __linux__ - return (str[0] == '/'); -#endif -} - -inline bool pathchar_cmp(char a, char b) -{ -#if defined WIN32 - if (pathchar_isalpha(a) && pathchar_isalpha(b)) - { - return (tolower(a) == tolower(b)); - } - /* Either path separator is acceptable */ - if (pathchar_sep(a)) - { - return pathchar_sep(b); - } -#endif - return (a == b); -} - -/** - * @brief Forms a relative path given two absolute paths. - * - * @param buffer Buffer to store relative path in. - * @param maxlength Maximum length of the output buffer. - * @param relTo Destination folder to use as a working directory. - * Final folder name should not be pathchar-terminated. - * @param relFrom Source file or folder to use as a target. - * @return True on success, false on failure. - */ -bool UTIL_Relatize(char buffer[], - size_t maxlength, - const char *relTo, - const char *relFrom) -{ - /* We don't allow relative paths in here, force - * the user to resolve these himself! - */ - if (!pathstr_isabsolute(relTo) - || !pathstr_isabsolute(relFrom)) - { - return false; - } - -#if defined WIN32 - /* Relative paths across drives are not possible */ - if (!pathchar_cmp(relTo[0], relFrom[0])) - { - return false; - } - /* Get rid of the drive and semicolon part */ - relTo = &relTo[2]; - relFrom = &relFrom[2]; -#endif - - /* Eliminate the common root between the paths */ - const char *rootTo = NULL; - const char *rootFrom = NULL; - while (*relTo != '\0' && *relFrom != '\0') - { - /* If we get to a new path sequence, start over */ - if (pathchar_sep(*relTo) - && pathchar_sep(*relFrom)) - { - rootTo = relTo; - rootFrom = relFrom; - /* If the paths don't compare, stop looking for a common root */ - } else if (!pathchar_cmp(*relTo, *relFrom)) { - break; - } - relTo++; - relFrom++; - } - - /* NULLs shouldn't happen! */ - if (rootTo == NULL - || rootFrom == NULL) - { - return false; - } - - size_t numLevels = 0; - - /* The root case is special! - * Don't count anything from it. - */ - if (*(rootTo + 1) != '\0') - { - /* Search for how many levels we need to go up. - * Since the root pointer points to a '/', we increment - * the initial pointer by one. - */ - while (*rootTo != '\0') - { - if (pathchar_sep(*rootTo)) - { - /* Check for an improper trailing slash, - * just to be nice even though the user - * should NOT have done this! - */ - if (*(rootTo + 1) == '\0') - { - break; - } - numLevels++; - } - rootTo++; - } - } - - /* Now build the new relative path. */ - size_t len, total = 0; - while (numLevels--) - { - len = _snprintf(&buffer[total], maxlength - total, ".." PATH_SEP_STR); - if (len >= maxlength - total) - { - /* Not enough space in the buffer */ - return false; - } - total += len; - } - - /* Add the absolute path. */ - len = _snprintf(&buffer[total], maxlength - total, "%s", &rootFrom[1]); - if (len >= maxlength - total) - { - return false; - } - - return true; -} diff --git a/sourcemm/metamod_util.h b/sourcemm/metamod_util.h deleted file mode 100644 index de507ee..0000000 --- a/sourcemm/metamod_util.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * vim: set ts=4 : - * ====================================================== - * Metamod:Source - * Copyright (C) 2004-2007 AlliedModders LLC and authors. - * All rights reserved. - * ====================================================== - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in a - * product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_UTIL_H -#define _INCLUDE_UTIL_H - -#include - -/** - * @brief Utility functions - * @file util.h - */ - -/** - * @brief Returns true is string is not blank, false otherwise. - */ -#define IS_STR_FILLED(var) (var != NULL && var[0] != '\0') - -/** - * @brief Returns a pointer to the extension in a file name. - */ -const char *UTIL_GetExtension(const char *file); - -/** - * @brief Removes C-style comments from string. - */ -void UTIL_TrimComments(char *buffer); - -/** - * @brief Removes whitespace characters from left side of string. - */ -void UTIL_TrimLeft(char *buffer); - -/** - * @brief Removes whitespace characters from right side of string. - */ -void UTIL_TrimRight(char *buffer); - -/** - * @brief Breaks a string at the first space until it reaches a non-space. - */ -void UTIL_KeySplit(const char *str, char *buf1, size_t len1, char *buf2, size_t len2); - -/** - * @brief Compares two file paths. - */ -bool UTIL_PathCmp(const char *path1, const char *path2); - -/** - * @brief Same as snprintf except that it ensures the string buffer is null terminated. - */ -size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...); - -/** - * @brief Same as vsnprintf except that it ensures the string buffer is null terminated. - */ -size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params); - -/** - * @brief Forms a relative path given two absolute paths. - * - * @param buffer Buffer to store relative path in. - * @param maxlength Maximum length of the output buffer. - * @param relTo Destination folder to use as a working directory. - * Final folder name should not be pathchar-terminated. - * @param relFrom Source file or folder to use as a target. - * @return True on success, false on failure. - */ -bool UTIL_Relatize(char buffer[], - size_t maxlength, - const char *relTo, - const char *relFrom); - -#endif //_INCLUDE_UTIL_H diff --git a/sourcemm/svn_version.h b/sourcemm/svn_version.h deleted file mode 100644 index 2d7e2fa..0000000 --- a/sourcemm/svn_version.h +++ /dev/null @@ -1,13 +0,0 @@ -/** This file is autogenerated by build scripts */ - -#ifndef _INCLUDE_SVN_VERSION_H_ -#define _INCLUDE_SVN_VERSION_H_ - -#define SVN_PRODUCT_VERSION "1.6.0" - -#define SVN_REVISION 423 -#define SVN_REVISION_STRING "423" -#define SVN_FILE_VERSION 1,6,0,423 -#define SVN_FILE_VERSION_STRING "1.6.0.423" - -#endif //_INCLUDE_SVN_VERSION_H_ diff --git a/sourcemm/svn_version.tpl b/sourcemm/svn_version.tpl deleted file mode 100644 index 9b93d57..0000000 --- a/sourcemm/svn_version.tpl +++ /dev/null @@ -1,13 +0,0 @@ -/** This file is autogenerated by build scripts */ - -#ifndef _INCLUDE_SVN_VERSION_H_ -#define _INCLUDE_SVN_VERSION_H_ - -#define SVN_PRODUCT_VERSION "$PMAJOR$.$PMINOR$.$PREVISION$" - -#define SVN_REVISION $GLOBAL_BUILD$ -#define SVN_REVISION_STRING "$GLOBAL_BUILD$" -#define SVN_FILE_VERSION $PMAJOR$,$PMINOR$,$PREVISION$,$GLOBAL_BUILD$ -#define SVN_FILE_VERSION_STRING "$PMAJOR$.$PMINOR$.$PREVISION$.$GLOBAL_BUILD$" - -#endif //_INCLUDE_SVN_VERSION_H_ diff --git a/sourcemm/version.rc b/sourcemm/version.rc deleted file mode 100755 index 67529d4..0000000 --- a/sourcemm/version.rc +++ /dev/null @@ -1,101 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" -#include "svn_version.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION SVN_FILE_VERSION - PRODUCTVERSION SVN_FILE_VERSION - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "000004b0" - BEGIN - VALUE "Comments", "Metamod: Source" - VALUE "FileDescription", "Metamod: Source" - VALUE "FileVersion", SVN_FILE_VERSION_STRING - VALUE "InternalName", "sourcemm" - VALUE "LegalCopyright", "Copyright (c) 2004-2007, Metamod: Source Development Team" - VALUE "OriginalFilename", "server.dll" - VALUE "ProductName", "Metamod: Source" - VALUE "ProductVersion", SVN_PRODUCT_VERSION - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0, 1200 - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/update_tool/Makefile b/update_tool/Makefile deleted file mode 100644 index 02273b2..0000000 --- a/update_tool/Makefile +++ /dev/null @@ -1,68 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson - -HL2SDK = ../../hl2sdk -SMM_ROOT = .. -SRCDS = ~/srcds - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O2 -funroll-loops -s -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = sourcemm_update_tool_i486.so - -HL2PUB = $(HL2SDK)/public -HL2LIB = $(HL2SDK)/linux_sdk - -OBJECTS = update_tool.cpp - -LINK = vstdlib_i486.so tier0_i486.so -static-libgcc - -INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ - -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - nasm api_link.asm -f elf -o $(BIN_DIR)/api_link.o -DLINUX - $(MAKE) sourcemm - rm -rf $(BINARY) - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - -sourcemm: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(BIN_DIR)/api_link.o $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true - -default: all - -clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/update_tool/README.txt b/update_tool/README.txt deleted file mode 100644 index 9c974a4..0000000 --- a/update_tool/README.txt +++ /dev/null @@ -1,90 +0,0 @@ -This is the README file for sourcemm_update_tool. - -This tool will automatically correct gameinfo.txt when your server gets updated, and Valve's updater overwrites Metamod:Source's changes. This tool is experimental, and is thus a separate download for now. - -1. INSTALLATION - - a. Extract the entire package to your mod folder. The structure should look like: - - /addons/metamod/bin/sourcemm_update_tool.dll - /addons/metamod/bin/sourcemm_update_tool_i486.so - /addons/metamod/README.txt - /addons/sourcemm_update_tool.vdf - /sourcemm_updater.conf - - b. Open /sourcemm_updater.conf with your favorite text editor. Change the - "cstrike" folder to match your mod folder. - -2. CONFIGURATION - - The sourcemm_updater.conf file has two configuration options. - - mmpath - Set this to the path Metamod:Source is located in. - This defaults to addons/metamod/bin - restart - Set this to how the server should be restarted when - gameinfo.txt is patched. There are three options: - - quit - Execute "quit" in the console. Currently does not work. - never - Do not restart. - error - Generate an error message. Because of a bug in SourceDS, - this will generate a crash dump on Windows, but the server - will successfully quit. - -3. USAGE - - You do not need to do anything to use the updater tool. When your server starts, - it silently checks to see if Metamod:Source is loaded. If not, it will make sure - gameinfo.txt is correctly set. Then, depending on how it's configured, it will - kill the server. Most game server provides have auto-restart functionality on their - servers; if not, you will need to manually restart the server. - - The update tool unloads itself immediately after the server starts, so it will not - use any resources, and will not display when you type 'plugin_print'. - -4. TROUBLESHOOTING - - This tool is currently experimental. There are two possible problems. For - any issue you encounter, you should post a report here: - - http://bugs.alliedmods.net/index.php?project=4 - - a. The updater tool does not patch gameinfo.txt - - Verify that the tool is loading. You can do this by opening up the - sourcemm_update_tool.vdf file and copying its file path. Then, enter - the following command in your server console: - - plugin_load - - Example: - - plugin_load cstrike\addons\metamod\bin\sourcemm_update_tool - - If you get the following reply: - - Failed to load plugin "cstrike\addons\sourcemm_update_tool" - Unable to load plugin "cstrike\addons\sourcemm_update_tool" - - Then the tool is working, and you should post a bug report. If instead, - you get: - - Unable to load plugin "cstrike\addons\sourcemm_update_tool" - Unable to load plugin "cstrike\addons\sourcemm_update_tool" - - Then the tool is not loading properly, and the path you are trying to use - is not correct. - - b. The server always dies, and you can't start it at all - - The updater tool is either crashing or not repairing Metamod:Source - correctly. First, try changing the 'restart' line in sourcemm_updater.conf - to the following line: - - restart = never - - If that does not fix the problem, remove the .vdf file so the updater tool - will not be loaded. - - In either case, you should post a bug report containing your mod name and - your gameinfo.txt as an attachment. - \ No newline at end of file diff --git a/update_tool/api_link.asm b/update_tool/api_link.asm deleted file mode 100644 index 6f94053..0000000 --- a/update_tool/api_link.asm +++ /dev/null @@ -1,138 +0,0 @@ -;;;; -;; (C)2005-2007 AlliedModders LLC -;; By the Metamod:Source Development Team -;; This software is licensed under the zlib/libpng free software license. -;; -;; This assembly file is a short thunk wrapper to let us load as a VSP and exit quietly, -;; without any overhead of the rest of the interface, and also to prevent linking against -;; tierX or vstdlib -;;;; - -;;Exports: -;; void GetBaseDir(char *buffer, maxlength); -;; void *GetThisPointer(); -;;Imports: -;; void LoadFunction(); - -section .text - -global GetThisPointer, GetGameDir, ServerCommand -global _GetThisPointer, _GetGameDir, _ServerCommand -global _GetICvar, GetICvar -extern _LoadFunction - -GetICvar: -_GetICvar: - mov eax, [icvar] - ret - -GetThisPointer: -_GetThisPointer: - mov eax, GLOBAL_POINTER - ret - -GetGameDir: -_GetGameDir: - push ebp - mov ebp, esp - - mov ecx, [engine] ;get this pointer - mov edx, [ecx] ;get the vtable - push dword [ebp+12] ;push maxlenth - push dword [ebp+8] ;push buffer - %ifdef LINUX - push ecx ;push this pointer - %endif - call dword [edx+216] ;call IVEngineServer::GetGameDir - %ifdef LINUX - add esp, 12 ;correct stack - %endif - - pop ebp - ret - -ServerCommand -_ServerCommand: - push ebp - mov ebp, esp - - mov ecx, [engine] ;get this pointer - mov edx, [ecx] ;get the vtable - push dword [ebp+8] ;push string - %ifdef LINUX - push ecx ;push this pointer - %endif - call dword [edx+144] ;call IVEngineServer::ServerCommand - %ifdef LINUX - add esp, 8 ;correct stack - %endif - - pop ebp - ret - -thisLoadFunction: - push ebp - mov ebp, esp - - push edi - - ;get factory - %ifdef LINUX - mov edi, [ebp+12] - %else - mov edi, [ebp+8] - %endif - - push dword 0 ;NULL - push dword VENGINESERVER ;iface name - call edi ;call factory - add esp, 8 ;correct stack - - test eax, eax ;do we have a valid pointer? - jz .end ;no, bail out - - mov [engine], eax ;store the engine pointer - - push dword 0 ;NULL - push dword VENGINECVAR ;iface name - call edi ;call factory - add esp, 8 ;correct stack - - test eax, eax ;do we have a valid pointer? - jz .end ;no, bail out - - mov [icvar], eax ;store the icvar pointer - - call _LoadFunction - -.end: - ;We never load, never ever ever! - xor eax, eax - - pop edi - - pop ebp - %ifdef LINUX - ret - %else - retn 8 - %endif - -thisUnloadFunction: - ret - -section .data - INTERFACE_NAME DB "ISERVERPLUGINCALLBACKS001", 0 - VENGINESERVER DB "VEngineServer021", 0 - VENGINECVAR DB "VEngineCvar003", 0 - - VIRTUAL_TABLE DD thisLoadFunction - DD thisUnloadFunction - ;We don't need any more of the vtable here - - GLOBAL_POINTER DD VIRTUAL_TABLE - - temp_ret DD 0 - temp_ptr DD temp_ret - engine DD 0 - icvar DD 0 diff --git a/update_tool/msvc8/update_tool.sln b/update_tool/msvc8/update_tool.sln deleted file mode 100644 index 5250f8a..0000000 --- a/update_tool/msvc8/update_tool.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "update_tool", "update_tool.vcproj", "{DDD1563F-7EE2-4E76-BE57-ED84A2664A51}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Debug|Win32.ActiveCfg = Debug|Win32 - {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Debug|Win32.Build.0 = Debug|Win32 - {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Release|Win32.ActiveCfg = Release|Win32 - {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/update_tool/msvc8/update_tool.vcproj b/update_tool/msvc8/update_tool.vcproj deleted file mode 100644 index 825e521..0000000 --- a/update_tool/msvc8/update_tool.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/update_tool/sourcemm_update_tool.vdf b/update_tool/sourcemm_update_tool.vdf deleted file mode 100644 index 79a505c..0000000 --- a/update_tool/sourcemm_update_tool.vdf +++ /dev/null @@ -1,6 +0,0 @@ -//This is a sample VDF file. You need to edit "cstrike" to point to the mod you use. - -"Plugin" -{ - "file" "cstrike/addons/metamod/bin/sourcemm_update_tool" -} diff --git a/update_tool/sourcemm_updater.conf b/update_tool/sourcemm_updater.conf deleted file mode 100644 index bdf1eea..0000000 --- a/update_tool/sourcemm_updater.conf +++ /dev/null @@ -1,9 +0,0 @@ -;Use this to configure where Metamod resides, if you have -;changed its location -;mmpath = addons/metamod/bin - -;Use this to specify how the updater tool restarts SourceDS -; never - don't restart -; error - restart by generating a fatal error message -; quit - restart by issuing a "quit" server command -restart = error diff --git a/update_tool/update_tool.cpp b/update_tool/update_tool.cpp deleted file mode 100644 index ef6dbfe..0000000 --- a/update_tool/update_tool.cpp +++ /dev/null @@ -1,366 +0,0 @@ -#include -#include -#include -#include - -#if defined _MSC_VER -#define SEPCHAR "\\" -#define MMPATH "addons\\metamod\\bin" -#define WINDOWS_LEAN_AND_MEAN -#include -#elif defined __linux__ -#define SEPCHAR "/" -#define MMPATH "addons/metamod/bin" -#include -#endif - -#include - -extern "C" void GetGameDir(char *buffer, int maxlength); -extern "C" void *GetThisPointer(); -extern "C" void ServerCommand(const char *command); -extern "C" ICvar *GetICvar(); - -size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...); -bool s_isspace(char c); -bool RenameFile(const char *old, const char *newf); -bool RemoveFile(const char *file); - -/* This will be called by the thunk */ -#if defined _MSC_VER -extern "C" void LoadFunction() -#elif defined __linux__ -extern "C" void _LoadFunction() -#endif -{ - ICvar *pCvar = GetICvar(); - if (pCvar->FindVar("metamod_version") != NULL) - { - /* Already exists, bail out */ - return; - } - - char gamedir[260]; - char mmpath[260]; - - enum RestartMode - { - Restart_Never, - Restart_Error, - Restart_Quit, - }; - - RestartMode mode = Restart_Error; - - GetGameDir(gamedir, sizeof(gamedir)); - - /* Defaults */ - UTIL_Format(mmpath, sizeof(mmpath), "|gameinfo_path|%s", MMPATH); - - /* Read config */ - char config[260]; - UTIL_Format(config, sizeof(config), "%s" SEPCHAR "sourcemm_updater.conf", gamedir); - FILE *fpCfg = fopen(config, "rt"); - if (fpCfg) - { - char cfgLine[512]; - while (!feof(fpCfg) && fgets(cfgLine, sizeof(cfgLine), fpCfg) != NULL) - { - char key[255]; - - size_t keyLen = 0; - - /* Strip whitespace */ - char *input = cfgLine; - while (*input != '\0' && s_isspace(*input)) - { - input++; - } - - /* Strip ending whitespace */ - size_t len = strlen(input); - for (size_t i = len - 1; - i >= 0 && i < len; - i--) - { - if (s_isspace(input[i])) - { - input[i] = '\0'; - len--; - } else { - break; - } - } - - /* Eat stuff until we find a key */ - while (*input != '\0' && !s_isspace(*input)) - { - if (keyLen < sizeof(key)) - { - key[keyLen++] = *input; - } - input++; - } - key[keyLen] = '\0'; - - /* Eat spaces until we hit an = sign */ - while (*input != '\0' && *input != '=') - { - input++; - } - - if (*input == '=') - { - input++; - } - - /* Eat spaces again */ - while (*input != '\0' && s_isspace(*input)) - { - input++; - } - - /* Ignore comments */ - if (key[0] == ';') - { - continue; - } - - /* The rest is our key */ - if (strcmp(key, "mmpath") == 0) - { - UTIL_Format(mmpath, sizeof(mmpath), "%s", input); - } else if (strcmp(key, "restart") == 0) { - if (strcmp(input, "never") == 0) - { - mode = Restart_Never; - } else if (strcmp(input, "error") == 0) { - mode = Restart_Error; - } else if (strcmp(input, "quit") == 0) { - mode = Restart_Quit; - } - } - } - fclose(fpCfg); - } - - char old_path[260]; - char new_path[260]; - - UTIL_Format(old_path, sizeof(old_path), "%s" SEPCHAR "gameinfo.txt", gamedir); - UTIL_Format(new_path, sizeof(new_path), "%s" SEPCHAR "gameinfo.new.txt", gamedir); - - FILE *fp = fopen(old_path, "rt"); - - if (!fp) - { - return; - } - - FILE *op = fopen(new_path, "wt"); - if (!op) - { - fclose(fp); - return; - } - - enum ParseState - { - Parse_None, - Parse_Root, - Parse_GameInfo, - Parse_FileSystem, - Parse_SearchPaths, - }; - - ParseState ps = Parse_Root; - - char input[1024]; - char backup[1024]; - - bool bWroteOutput = false; - - while (!feof(fp) && fgets(input, sizeof(input), fp) != NULL) - { - UTIL_Format(backup, sizeof(backup), "%s", input); - - if (ps != Parse_None) - { - char *inbuf = input; - - /* Strip beginning whitespace */ - while (*inbuf != '\0' && s_isspace(*inbuf)) - { - inbuf++; - } - - /* Strip ending whitespace */ - size_t len = strlen(inbuf); - for (size_t i = len - 1; - i >= 0 && i < len; - i--) - { - if (s_isspace(inbuf[i])) - { - inbuf[i] = '\0'; - len--; - } else { - break; - } - } - - /* Strip quotation marks */ - if (inbuf[0] == '"' - && inbuf[len-1] == '"') - { - inbuf[len - 1] = '\0'; - inbuf = &inbuf[1]; - len -= 2; - } - - /* Do tests */ - if (ps == Parse_Root && strcmp(inbuf, "GameInfo") == 0) - { - ps = Parse_GameInfo; - } else if (ps == Parse_GameInfo && strcmp(inbuf, "FileSystem") == 0) { - ps = Parse_FileSystem; - } else if (ps == Parse_FileSystem && strcmp(inbuf, "SearchPaths") == 0) { - ps = Parse_SearchPaths; - } else if (ps == Parse_SearchPaths) { - const char *game = strstr(inbuf, "Game"); - if (game) - { - if (strstr(game, "GameBin") != NULL - && strstr(game, mmpath) != NULL) - { - fclose(op); - op = NULL; - break; /* Nothing more to do! */ - } else { - fputs("\t\t\tGameBin\t\t\t", op); - fputs(mmpath, op); - fputs("\n", op); - ps = Parse_None; - bWroteOutput = true; - } - } - } - } - - fputs(backup, op); - } - - if (!op) - { - /* Well, we can't really do anything else. Give up. */ - fclose(fp); - return; - } - - /* Close all streams */ - fclose(op); - fclose(fp); - - /* If we didn't change anything, abort here */ - if (!bWroteOutput) - { - RemoveFile(new_path); - return; - } - - /* Move the old file to a backup name */ - char backup_name[260]; - UTIL_Format(backup_name, sizeof(backup_name), "%s" SEPCHAR "gameinfo.backup.txt", gamedir); - - if (!RenameFile(old_path, backup_name)) - { - /* If we can't rename, just bail out. - * We don't want to overwrite the client's default - * without backing it up first! - */ - return; - } - if (!RenameFile(new_path, old_path)) - { - /* Since this failed, we really have no choice. - * Try and rename the old back. - */ - RenameFile(backup_name, old_path); - return; - } - RemoveFile(new_path); - - if (mode == Restart_Error) - { - Error("Server is restarting to load Metamod:Source"); - } else if (mode == Restart_Quit) { - ServerCommand("quit\n"); - } -} - -bool RemoveFile(const char *file) -{ -#if defined _MSC_VER - return (_unlink(file) == 0); -#else - return (unlink(file) == 0); -#endif -} - -bool s_isspace(char c) -{ - if ((unsigned)c & 0x80) - { - return false; - } else { - return isspace(c) ? true : false; - } -} - -size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - size_t len = vsnprintf(buffer, maxlength, fmt, ap); - va_end(ap); - - if (len >= maxlength) - { - len = maxlength - 1; - buffer[len] = '\0'; - } - - return len; -} - -bool RenameFile(const char *old, const char *newf) -{ -#if defined __linux__ - return (rename(old, newf) == 0); -#elif defined WIN32 - return (MoveFileA(old, newf) != 0); -#endif -} - -#if defined _MSC_VER -extern "C" __declspec(dllexport) void *CreateInterface(const char *iface, int *ret) -#elif defined __linux__ -extern "C" __attribute__((visibility("default"))) void *CreateInterface(const char *iface, int *ret) -#endif -{ - if (strcmp(iface, "ISERVERPLUGINCALLBACKS001") == 0) - { - if (ret) - { - *ret = 0; - } - return GetThisPointer(); - } - - if (ret) - { - *ret = 1; - } - return NULL; -}

      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%0DRK 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%0DRK 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