From e6a7d5dda7803308a855ebe027556323075474dd Mon Sep 17 00:00:00 2001 From: phase <64127681+phasephasephase@users.noreply.github.com> Date: Fri, 4 Oct 2024 14:09:14 -0600 Subject: [PATCH 1/7] start nuget pkg --- bindings/cs/libhat-sharp/libhat-sharp.csproj | 19 ++++++++++++++++++ .../runtimes/win-x64/native/libhat_c.dll | Bin 0 -> 15872 bytes .../runtimes/win-x86/native/libhat_c.dll | Bin 0 -> 12800 bytes 3 files changed, 19 insertions(+) create mode 100644 bindings/cs/libhat-sharp/runtimes/win-x64/native/libhat_c.dll create mode 100644 bindings/cs/libhat-sharp/runtimes/win-x86/native/libhat_c.dll diff --git a/bindings/cs/libhat-sharp/libhat-sharp.csproj b/bindings/cs/libhat-sharp/libhat-sharp.csproj index 70547df..c48b9c6 100644 --- a/bindings/cs/libhat-sharp/libhat-sharp.csproj +++ b/bindings/cs/libhat-sharp/libhat-sharp.csproj @@ -6,6 +6,25 @@ enable enable true + 0.1.1 + 0.1.1.1 + + + libhat-sharp + 0.1.1 + phase + true + libhat-sharp + C# bindings for libhat, a high-performance game hacking library. Currently only includes the pattern scanner, which uses CPU vectorization features to quickly find patterns. + https://github.com/BasedInc/libhat + MIT + README.md + https://github.com/phasephasephase/libhat + git + + + + diff --git a/bindings/cs/libhat-sharp/runtimes/win-x64/native/libhat_c.dll b/bindings/cs/libhat-sharp/runtimes/win-x64/native/libhat_c.dll new file mode 100644 index 0000000000000000000000000000000000000000..2e5a408e0bc8b7d0f28521d291268857103caa71 GIT binary patch literal 15872 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 X$m;Q|(|CHzq0gTr^po;`#{>TbWm7B& literal 0 HcmV?d00001 diff --git a/bindings/cs/libhat-sharp/runtimes/win-x86/native/libhat_c.dll b/bindings/cs/libhat-sharp/runtimes/win-x86/native/libhat_c.dll new file mode 100644 index 0000000000000000000000000000000000000000..7ff022e0712541eb8301d5f295e641966decb4d7 GIT binary patch literal 12800 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 Date: Fri, 4 Oct 2024 15:41:20 -0600 Subject: [PATCH 2/7] nugetting --- bindings/cs/README.md | 36 ++++++++++++++++++++ bindings/cs/libhat-sharp.sln | 10 ++++++ bindings/cs/libhat-sharp/libhat-sharp.csproj | 10 +++++- bindings/cs/libhat-tests/libhat-tests.csproj | 4 ++- 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 bindings/cs/README.md diff --git a/bindings/cs/README.md b/bindings/cs/README.md new file mode 100644 index 0000000..4ddf0bc --- /dev/null +++ b/bindings/cs/README.md @@ -0,0 +1,36 @@ +# libhat-sharp +C# bindings for libhat, a high-performance game hacking library. + +## Notes +- Currently only includes the pattern scanning functionality of libhat (libhat_c only implements pattern scanning) +- Supports Windows only, x86 and x64 +- Linux support will be added in the future + +## Installation +The library is available on NuGet: https://www.nuget.org/packages/libhat-sharp/ + +You can install it using the following command: +`dotnet add package libhat-sharp` + +## Usage +```csharp +using Hat; + +// Parse a pattern's string representation into a byte array at runtime +Pattern pattern = new Pattern("48 8D 05 ? ? ? ? E8"); + +// Create a scanner object for a section in a specific module +Process process = /* ... */; +Scanner scanner = new Scanner(process.MainModule, ".text"); + +// ...or for a specific memory region +nint start = /* the start of the memory region you want to scan */; +uint size = /* ... */; +Scanner scanner = new Scanner(start, size); + +// A span can also be used +Span buffer = /* ... */; +Scanner scanner = new Scanner(buffer); + +// Scan for this pattern using your CPU's vectorization features +nint result = scanner.FindPattern(pattern); \ No newline at end of file diff --git a/bindings/cs/libhat-sharp.sln b/bindings/cs/libhat-sharp.sln index b83371b..6deeaa4 100644 --- a/bindings/cs/libhat-sharp.sln +++ b/bindings/cs/libhat-sharp.sln @@ -7,16 +7,26 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Release|Any CPU.Build.0 = Release|Any CPU + {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Debug|x64.ActiveCfg = Debug|x64 + {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Debug|x64.Build.0 = Debug|x64 + {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Release|x64.ActiveCfg = Release|x64 + {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Release|x64.Build.0 = Release|x64 {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Debug|Any CPU.Build.0 = Debug|Any CPU {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Release|Any CPU.ActiveCfg = Release|Any CPU {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Release|Any CPU.Build.0 = Release|Any CPU + {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Debug|x64.ActiveCfg = Debug|x64 + {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Debug|x64.Build.0 = Debug|x64 + {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Release|x64.ActiveCfg = Release|x64 + {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Release|x64.Build.0 = Release|x64 EndGlobalSection EndGlobal diff --git a/bindings/cs/libhat-sharp/libhat-sharp.csproj b/bindings/cs/libhat-sharp/libhat-sharp.csproj index c48b9c6..778a775 100644 --- a/bindings/cs/libhat-sharp/libhat-sharp.csproj +++ b/bindings/cs/libhat-sharp/libhat-sharp.csproj @@ -21,10 +21,18 @@ README.md https://github.com/phasephasephase/libhat git + Debug;Release + AnyCPU;x64 + libhat;vectorized;game-hacking;modding;pattern-scanning - + + + + + + diff --git a/bindings/cs/libhat-tests/libhat-tests.csproj b/bindings/cs/libhat-tests/libhat-tests.csproj index 6f53a12..1e8fcbc 100644 --- a/bindings/cs/libhat-tests/libhat-tests.csproj +++ b/bindings/cs/libhat-tests/libhat-tests.csproj @@ -6,10 +6,12 @@ Hat.Tests enable enable + Debug;Release + AnyCPU;x64 - + From 7c0cf5c36171c659fcef5d71d9fe41707ac80976 Mon Sep 17 00:00:00 2001 From: phase <64127681+phasephasephase@users.noreply.github.com> Date: Fri, 4 Oct 2024 20:31:32 -0600 Subject: [PATCH 3/7] scan result + fixes --- bindings/cs/README.md | 17 +++++++-- bindings/cs/libhat-sharp.sln | 10 ------ bindings/cs/libhat-sharp/ScanResult.cs | 34 ++++++++++++++++++ bindings/cs/libhat-sharp/Scanner.cs | 16 ++++++--- bindings/cs/libhat-sharp/libhat-sharp.csproj | 14 ++++---- .../runtimes/win-x64/native/libhat_c.dll | Bin 15872 -> 40960 bytes .../runtimes/win-x86/native/libhat_c.dll | Bin 12800 -> 29184 bytes bindings/cs/libhat-tests/Program.cs | 8 ++--- bindings/cs/libhat-tests/libhat-tests.csproj | 4 +-- 9 files changed, 73 insertions(+), 30 deletions(-) create mode 100644 bindings/cs/libhat-sharp/ScanResult.cs diff --git a/bindings/cs/README.md b/bindings/cs/README.md index 4ddf0bc..3a2cea9 100644 --- a/bindings/cs/README.md +++ b/bindings/cs/README.md @@ -16,7 +16,7 @@ You can install it using the following command: ```csharp using Hat; -// Parse a pattern's string representation into a byte array at runtime +// Parse a pattern's string representation to an array of bytes at runtime Pattern pattern = new Pattern("48 8D 05 ? ? ? ? E8"); // Create a scanner object for a section in a specific module @@ -33,4 +33,17 @@ Span buffer = /* ... */; Scanner scanner = new Scanner(buffer); // Scan for this pattern using your CPU's vectorization features -nint result = scanner.FindPattern(pattern); \ No newline at end of file +ScanResult? result = scanner.FindPattern(pattern); + +// Get the address pointed at by the pattern +nint address = result!.Address; + +// Resolve an RIP relative address at a given offset +// +// | signature matches here +// | | relative address located at +3 +// v v +// 48 8D 05 BE 53 23 01 lea rax, [rip+0x12353be] +// +nint relativeAddress = result!.Relative(3); +``` \ No newline at end of file diff --git a/bindings/cs/libhat-sharp.sln b/bindings/cs/libhat-sharp.sln index 6deeaa4..b83371b 100644 --- a/bindings/cs/libhat-sharp.sln +++ b/bindings/cs/libhat-sharp.sln @@ -7,26 +7,16 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Release|Any CPU.Build.0 = Release|Any CPU - {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Debug|x64.ActiveCfg = Debug|x64 - {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Debug|x64.Build.0 = Debug|x64 - {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Release|x64.ActiveCfg = Release|x64 - {EF020BDB-543C-4EA3-9C95-A3668E2E5E65}.Release|x64.Build.0 = Release|x64 {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Debug|Any CPU.Build.0 = Debug|Any CPU {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Release|Any CPU.ActiveCfg = Release|Any CPU {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Release|Any CPU.Build.0 = Release|Any CPU - {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Debug|x64.ActiveCfg = Debug|x64 - {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Debug|x64.Build.0 = Debug|x64 - {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Release|x64.ActiveCfg = Release|x64 - {1FDDD9F4-F557-45C9-96CD-7CDF111B8176}.Release|x64.Build.0 = Release|x64 EndGlobalSection EndGlobal diff --git a/bindings/cs/libhat-sharp/ScanResult.cs b/bindings/cs/libhat-sharp/ScanResult.cs new file mode 100644 index 0000000..86ef86b --- /dev/null +++ b/bindings/cs/libhat-sharp/ScanResult.cs @@ -0,0 +1,34 @@ +using System.Numerics; + +namespace Hat; + +public unsafe class ScanResult +{ + /// + /// The resulting address from the pattern scan. + /// + public nint Address { get; } + + internal ScanResult(nint address) + { + Address = address; + } + + /// + /// Reads a value of type located at a given offset. + /// + /// The offset of the value. Defaults to 0. + public T Read(int offset = 0) where T : unmanaged + { + return *(T*)(Address + offset); + } + + /// + /// Resolves a RIP relative address located at a given offset. + /// + /// The offset of the relative address. + public nint Relative(int offset) + { + return Address + Read(offset) + offset + sizeof(int); + } +} \ No newline at end of file diff --git a/bindings/cs/libhat-sharp/Scanner.cs b/bindings/cs/libhat-sharp/Scanner.cs index 6638cd0..9b6525c 100644 --- a/bindings/cs/libhat-sharp/Scanner.cs +++ b/bindings/cs/libhat-sharp/Scanner.cs @@ -57,22 +57,30 @@ public Scanner(Span buffer) _size = (uint)buffer.Length; } + /// + /// Creates a scanner for a of bytes. + /// + /// The buffer to scan in. + public Scanner(Memory buffer) : this(buffer.Span) { } + /// /// Scans for a pattern. /// /// The pattern to scan for. /// The byte alignment of the result. - /// The address of the pattern if found, otherwise, 0. - public nint FindPattern(Pattern pattern, ScanAlignment alignment = ScanAlignment.X1) + /// A containing the result of the scan if found, otherwise null. + public ScanResult? FindPattern(Pattern pattern, ScanAlignment alignment = ScanAlignment.X1) { if (_buffer is not null && _size is not null) { - return Functions.libhat_find_pattern(pattern.Signature, _buffer.Value, _size.Value, alignment); + var result = Functions.libhat_find_pattern(pattern.Signature, _buffer.Value, _size.Value, alignment); + return result == 0 ? null : new ScanResult(result); } if (_section is not null && _module is not null) { - return Functions.libhat_find_pattern_mod(pattern.Signature, _module.Value, _section, alignment); + var result = Functions.libhat_find_pattern_mod(pattern.Signature, _module.Value, _section, alignment); + return result == 0 ? null : new ScanResult(result); } throw new InvalidOperationException("Scanner is not initialized."); diff --git a/bindings/cs/libhat-sharp/libhat-sharp.csproj b/bindings/cs/libhat-sharp/libhat-sharp.csproj index 778a775..bf799dc 100644 --- a/bindings/cs/libhat-sharp/libhat-sharp.csproj +++ b/bindings/cs/libhat-sharp/libhat-sharp.csproj @@ -6,12 +6,12 @@ enable enable true - 0.1.1 - 0.1.1.1 + 0.1.2 + 0.1.2.1 libhat-sharp - 0.1.1 + 0.1.2 phase true libhat-sharp @@ -21,8 +21,6 @@ README.md https://github.com/phasephasephase/libhat git - Debug;Release - AnyCPU;x64 libhat;vectorized;game-hacking;modding;pattern-scanning @@ -30,9 +28,9 @@ - - - + + + diff --git a/bindings/cs/libhat-sharp/runtimes/win-x64/native/libhat_c.dll b/bindings/cs/libhat-sharp/runtimes/win-x64/native/libhat_c.dll index 2e5a408e0bc8b7d0f28521d291268857103caa71..90e2c4f491c4333f1aa2b526a073aeee0abc1eb2 100644 GIT binary patch literal 40960 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 delta 7041 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 X(@1Qjx*h&fd*|wZeMP{lS=@gCc)4lI diff --git a/bindings/cs/libhat-sharp/runtimes/win-x86/native/libhat_c.dll b/bindings/cs/libhat-sharp/runtimes/win-x86/native/libhat_c.dll index 7ff022e0712541eb8301d5f295e641966decb4d7..8ebae9d2ca0cb3a75b24d07ea248fe74d6248ecf 100644 GIT binary patch literal 29184 zcmeHw3wRV&o^MsCK!Xj{XwWdmAxJaQg4msBH+c{+9l{u#MnZrYAVlbxU`S%8T44q> zp^_mrMb9v<&bqVAE{?jx-0SY*j05QS=uXHB5Ce{YpcoOgVuJ)w2(R@0{ZDl#9YAMx z@3-Im_TJmySLd8M&;R+K|LgqEsbtO%S93haaRQ#`UrzMPH>6i1f7H0wMscqUe|!8+ zzToZgg=OV6iPfH}hdm{$5|@`$R#r)g54jUP-pa)C%Ea6s%u8HVwZc8s%yBL!#})9g zT*C|8!;$X0xR~)b@uN6yA#!fjb9XF9Y>L!CiqbJ0H#D3TiMega2u~u0%fXaTk+qA& z`s-gLj{5>t-}G|aM(Se|$89A9T>IO?apob{W?uguU&C?!sBFXI9QS(E`?blbl6y5k z;ARvdAoysm*C0QUm29qd)h@s6s_H_btezek<`r{c<>NX4LEdPyRQ?!2Ed& zisX}V>RR&@RWeU{&R@%!Y+XvO*;J(64jPqr3ChQ=qPbc#CMoYSiraI|#(KYGZW~6k z&g8|0Um#Wm^P9v)a_^9uRccBDNY)fwp(dEs3bSDOP&vIn%I)+X7xKe0N zY|Ayr(VP&+hvNi_eJP@HPWif_Ua8d?*t$r zJ|owhAlCmJS*2|VWMsuSz7!kY!b>o)34j}w1T(t%@>S$;mOk&e#sc##k)~KwgH+RK zXwBhy);8$1bp*$hM&S2_wHh1pmti3$KbE0uq?XI_WbktrM z>N!m5f8O!?+AFb-?d|?24CE^?$CVke%r51ScIyaW|B^T^hjV=Coz#6-C={Y{U!nPy z2VGjb0R)m@-o`6}Sp~cRzg|EUrN?qun%dxh;x<4lSPm;6D(}}i5~Zm#@||)o|KvI4 zjPiAG!XSMAfmbdlA383G^}G8*q3*X4_~!7+N6H?`+fI3}BEYomZ9|D7Tl0)Ox{qt{ zd*=kbz9oD^huE;3svr}{ji;*K_~4!N4zh@Mv`aUi7tB1%U)07FOmKwWAqiLNu)#0g zjk*bzK;6YKiMp=H{wtPFxi_&UO%6;@I_J8y??FuJB$@~kosBmlQ8Ob^AR++_@PMEc z8PFvceE(bMmH5*d#hYP*0;LLoh$t2)M(=CQ#)gnszX55nu@|Ab7<^q}p5z19f{(Q~ zVnK%IgJb*Gzn?OMm^{Y?$yJ+~%t?2P+Y3@TkdcuV21qh^4=EpGHH}!!OTb9*-3a|e zDoDc^c?SQae5_N276Xui|5MG>MZi@hxc~AEMZi*F{sNcwgSinAkfK-{LSX^W8xa6M zxFWY*vAiRP!UEtO*8;6QCxTrP071Oj{BlG9>;htLgwXlQrzG)C^vWl#>ijr$iBWYL z)RBG?d)-Qbd6H^Sa|Cd*^pl1IVnaMg$abE1jl-IoeXda5aZv7)Gkpo1EhLWPYS*se zIj>=s+}!6qryQdG=9?UcL|+G*@JB4Y{ADH1Y&qiS6gO-~me06GT;LZ+L%8GgTn z_{&$PsXr9ti@aF>_W*&IaSP_$is^ImNz+-;1eRoIA(RM!D^U^5TEk7W)~4FE5Yb}& z0<-`_npCIBrFnlqMFRRx1ck;!?j*WGUekkG0Buk!K{?WJR2QngnW2fadO1Gh&9U8eM0bf z4GflZO0(nKT0`&=+fm24b#4+){65PO{(T6}c1P3W^L#>an3${)Vj_Jr2})rKh$)4L z3B)A;CzBvH_i3Y`7J*W8(E_Zsk(N4#mRd5K8_r9DxOF$W5I~} zaRb80fTrV%v@hrA^Jd1vPeD@hE~D){7EIv0BZH%qE|=zFxq_NP>em3CO=n}E;?m}b zmJUr^J&2?*TtvDd22(@Y3FbKH9i^+R_a{(4T2BGTMVjv|Qucvz4Q>2ZRFMNhTOI~Q zn>^N3_6rcpEocC-+%}YT)3dZm_>Z-3(Az76Tk0TSe0^-+48f(9u$qFr7V=pdUZj~a zbtDb6+?gnGrvBOQ-K)+P8aj3+BU5w+kYDygB(-7vQzZMvg*jG0am^w2X?y|GQ-^{{ z)TM$n)h7&xO2V8ychy}y4O$mv85LkOxwMBe*yz616Xegklv!7TqAe7>$)$Z?&sW;i zq3Q#IB`_DlwdH=QYgAWp>ZpbeX_A^}u(U^{@!TtN;EH9xd@-?RDw$*ZU30Z*tP{iJ z1hbM2nYUE%2~|p-0h~#~0w~r-1CHxN@-^%0#B8y??fUvIUQ6q10x18X_5Jkw1UuH3 zbu)l#>f~>sj~65DD;@=z4Q{X7j|Qy3ShXCM?f$Dybp|Ze{k=+Hf48!`?kouyKH%sU z^WJuJzD93i-hSwk#*Z+6a3))%o9ixx7wM9|NKKJNdc$$!MS4-s$09)_GUH*t<$Yg* z2;)!O&NT{RYp%%iSiz-&vR_|A9`iuWNmxh6yQ*N8Zjt>lw8H!6LXUqkTVG);FRTRN zo0s_B$PzDLAQ+TvwzOE_Vk|KF1+Li|8#wJA7*>PU_TMiQcg z0q9l7U%XmwRA-nV+vDV}A+U|bhEIV2kirz%4uyD_uyGZ+?@;b&b%x-}oGG{UIWCFy z}*GWK~u#3lUoGXz0$4rIep$(`>K%iqJ0kM?Y6Jty(fa3 z-&pLyKJXdK!To(#Pw_B%s3?=8O7F#!KOa1|qUIXb-`1daPI zD~lri$-Cmi5-BVXwAG-9+SM7HG`exq=yBus1y2+#_f$8rqwHssktZ2J2ok2=jKETO4Dc8lAG zVR41hO=N?ikqJ9)TN<{5JyNE8nU|(3$9(zxYlIJVia99u+wU{6lG1o_N5X=-%jC%O zd}&WGN!?_#E9bl~6C4ooLz&nxD|TpmX1meU*)PnWkN{>3o5)};7nBR~=i+N*BU&zD zLy>#vElTreEkR!mFMlRlE;O7MbNkSH0{_u0+j+;OnkDL3ar=czd7<1zx&)C(T6pGB`9xZtat97k3!%gWA&JH^xZaK@xKb*r^Ov z4pK_7hK0;v?tnZ8)P|MND~T{0u%GIQUJT4opI;(srGVHnF;Dw|>5{M#uCn>_R&r(C zS4lUepbwb&PNgkuRtc~<`h5bR3HUdLJ$5hbRGNaHyD+d?7fRl5IIy zBG```hYVns$QdpR{y3dc^gUfqbPC`rg1F1Tx!)Wl@>9VHEP! z@;GdVgRimLM;u>>>w7^me9&=NoOM_^GE;0M5`wfgN~t~}Vk;!qg>8jBC}g_tmp1f; zr2t$$*97@^ml9`IW?l)74GY^Ktfy52breF`T2RfSCS_5aeAOVX{|jaX?1G1ULYfOB z#?1wb80Kkj&7kQTeL@Y%B~-8ir;iX_DQD$Alc!KQtelfSp`D@NGcH2raR{Z#wzFcj zpDU$6@3dO>n{4L?_BZFmCv&TN5DL|DtI2WB`z7`5I0yfbWVHD=l`5GtavV+G3qZaA zWnB%PGOl8T%segP`hO>oF==%MvqA%~LPfa=nfxiaWunsE{S;NGpc$<~igSf$bSfu2 zqes9`R!&-~1ZZe|I`@%~Ru0Oa_4tg{*G23_*mvA!B?ySZj7q$$dn%etoYwnQD5Tv2PzSRb zlh0)AP3cn3xU{|J;n~X* zNKJdEirXJZfJ5%_;cr^+;!O1&-YIhL_?^}y&h*-{setUh&ialwt&>TQpABNN<98<7 zIn$e5DwQ$PhBSO?sxA$6HBbCrcT&T6>PE0OqRmifi0aLxzQ8Q~pw*jCP&J2I9>44O zy47)2*xONJaaByq`=?K|^ga24c^7K1#0!+zfBIBIhhj8K+3;k+Mbgj&!Y8|kX~^$HWb>LjdU! z%USu-bn&OX7(;IAQaa_XF5-1K7c|vq<^v>uh9DzwDVD^TrCEF`kb&LCQ%#25WPWp^ z^L=HpISw0DCLRWRSpN!& zRl)2Nn0<#X6LhO65eRzPT#r&D7MoWfTw%^dSYb9}{P;osVG`_+V5WIU#JBW5t_7!1 zyDHR0$l6u0KC1LC9fzgqa;6#Xs3TZD*jRwZq}y3ghQSdt;S>_<>1-p)#`=P6tWPma zyyLLfhv{4aaJq`188;k2QJl0Qa6Fbjd*Q?2%~9tCa%&=7?Xv;P(3VqDd&|{B9W9?q ze#HL$8lCmkj&GNaM9a(9+xass?@75MIS|inyTtV{RgheLuHAb)xXpHeFnbnR5I6$A z2f#3@tQIWid_Un~nmFDO>km-*B%k0VqYRkEF^-ebD%qPRIF|+H5F&j2c`}rCuQW^U z15TbrJ2;NW_5@ypSAhoFQ5pyI=?uB4Pm;tPi|24*1N4+V!60eMIY*Du=iOpE5L~Fn zndResHh*v=^s_(4(InR2g$)plzHcIFaYw zf!>MSMV?o*N*h6-txZyY8MdhI7n59o#|4ZV_zH#DD8!7XQ{Bf6(V4e)Z z@(CHlZ~UG>U##Vb_>|vqN!d?a*|ZZQf-BpJqeSOnFoy|~6+jtlExX0_zeTCz5?D-J z|7#@Slc*d#`|XS)HRMk9>LV0L8Dla5lkZEFTlEBF5&v;7Dg=D(5MEG z%ge+HPC7Q<{Oz3h`q?2ctm)Wf1faC}l?%aJ2l#Im5iEq$m*@#p9vhj#=k{^ZC%cZ9 zo!brWF?e@&FQ+}}d14O2E1ehs?IwOVNRdRBx=^qj@%@;mbtaCaBQ#*#NL)Fv31m1P z1RwA%U<4!aCzEHlPhu!9pIx8l~zTuQYi0QK|F*7Z)Wac5R>O)Mr)C64`QbA;ct*%Bz9>EvkT*w zx|3T81237$6#>p^r)VQnS-_4TZ&(#$M5EX1DlAETP!P8dMM->1_vr&*mVO;j2p#b8 z>7xw?lsL0whpM~;Rk;?6$5ds!xFaqP?lru7jEzqVg#FfBVFl^Q&1@}@Kos7U^>t`FfS1x;`}d zjFTsCWJ8GS$rJDBX1u6lL0mrtS&$U4b*NIVe(lP4Ft^(XT6801ocEu@%h=`wPymad2H^yk^$YpI`Zz4_9|B21f#!vEgt2k+ zz`B4q^J2mUohWEPzgRFgs3;0!*lD_2E>>dRBtHG5TaN?{o8;z1$GcJ*xc(;Mer$|S z4YCKo-|bMa#+yiaLI(a0o$Jc;(_k}{C)oaZng`S%e*ySsvgLrcmc(a<1Xw0~v5iXlt-1{MYIr)bCXaGNM z3!@imQ{?w3M}otl=5&%#<`dJr0626#cWD9$N2}XKyrrwSa6KoEDkJLxJ=d)3Ih_=1 z;(|M%^z@f-$DSAej4n75S)>3NBWD<)_?8eSH%2&FkM;d7`L=Q~hJJ^_ru2e`-bh4y zOAGOkrY;irt6}bSyazobh#Qs?M|D~>%VBZ-gTzq1&~39RvswP6iw_2RV-*1>rQ%a9 z8K5e#l+tNCVCWW|O`vofha5paMp#yYFK#l#Ql_OzTu)-uaYS7IE5syse~y@MvK)bE zjq`nbLE;YrPwDmk9`M=2Dh=w)uj{I4^6iR+bxtbQczZA|+CFSagg@3GEdxc* zfm%C+qXX%S0eu8|zQmtyII3it#d@-`VOHH1)jp!Hj-Ut-4h=)7L0z5D)fFK0z8d`d zu#12QpVTcms<5a=o{rCQNn0KB74bl$;MgtJZ=}-es2|{y{b(Qo&@Xd-GM-^^3Gu-E zh<-8-@Bt=^-(dZ8&-MHO>+!Ppx4~P{w_OcmEryCLDDk7ZOn!2Fla#Q-J-N zBU56u;W_#SfbJ*gh^BHJp|+y@4$=1O5&z&~(DG{d3?!gnZA1~}nir}(_H5$zc(SBg zE}r%?lg-Y;_?9!LJM`UJlI=X(t!05KmXoQtYj{DeNK6vwQufK8b@9gn7h^%Sg5@k2Lxoj;34CIBJFIi| zlPMuO&%jnP_~J4w@F>Ls7^NHL-dga|`pZBC@y9vDkZgkTHou!X7GEWHXWregPnSPE zInM0!FfZ>J^78KUO&Q_DwIuoXsHqywKI0rLLI}V>sBMzlOmt<5OflfjWEZ`sbPcl_ zM%JEZ(JNkDk!HqqCDP3t^=qZ8w$2#+SU3MH9`O`l*|M76`DpTH?mAw5uER_EBLuQE(gy5j zG=H!GPCol0Sk?XKX9FZ0oaT@u{;pI2*?k90dOXVvg6Cz}Mw{0?9M*M+*2PQyrmvDStNZ ztwdCh90ZW9HkP=AKkaB!(8q>ZM9M9etCsh~^%+FTS0V0`C^Jan{&L`IEHuGWO&QpZ zJk@GDZ#bx;nX{FIqUbzEI>RU2HW{}V#PzKh2^VPAzloTH>2}08WrzbM#{=sre6Ml| zPP;!7Ex$>DYS9k<$Jf8+ z`-qj_!5elfjJpQpX&xC|%~Armiw|?xN&Bsmw(Gd-+}oJF_s!sD0;HQXrtK8y*Ff~! zh&N&s&@W+30f4 zp3+D3>kOaw^y3QWRg)O~p2Atr*Pz}OVA-nR&^n=i({YN(!1H;;LScjof)xNX(S@uL zy|y!Yy|I6gW}^ECU&8gRYy5*I_y=7X5&z)mom?LLgE=!J{y}bfzkhJ_&Yt_>AMDJJ z_78f#gTBFB1O7qzWHl_cO&D`Pl~lkFxJZC25SJ{gK;!YH;%Prlk*Z?w5=UNT^I{ej zpx^|aQ|c>bS{0mk*s#TcP15ibxaWK`FOhnQcut^RgvGFy3qt3_stW1@PObuwp5%<gX0PE=>LafL2}rCN z^D0DqeUQw|tzd}k51FkNuN}Az%hHSEWpeZ}#Ouz_h^Zz7hhsm;_A6!A+h^oI@cseY zln0a}x^oX#0&+n^x_@szIP!*68tvJ87qq(sv^xjP8|Bj@)WfG&V6K4oJq}QYmqXrF zt?zR-vejWe3kbA>-DKMXK@p1c{F%@|mY*>k6Z?Y%MY)y)#pdW8jjrG546^`ao7?Zq z)0IiYnTIQJRpnt`-=> z2x3OqnYW8LXkZ6qCZBH(`~&0<-^%#sTl{%B{c11b&wCeeG9F5Z;vO&)_F=?Bp9zCK zeYb`6ol5>b6Q~XTKB9I^70d#C-OpRiVct5x{C%}xuD{jacM1J{lfUm6%0Tsl{e8H! zSvtNGJ8~e*`={<@gIsA#JASL^e|2^kxLqHu^Elw&C7*1j|~TJUYK?Jy?N&pI5RfvU_3}$D`>mD#F+soI@$yE z(B?{j{t_%b*i?~APs1i_kniCvnBC}0nLPOwHjKEQt|no7^(6#{K$92O-;5mENs|{D zD^1Qkf{1Um?DIW9o`^W|BeRXtjeU8*LZKPdjWe#4etVSZJ6!gp8w)1wyEikHhYD=g z05o!XMck@>NA~R(SGY+PzrIpV30pg`4U$l{+WP}a^^vv@4kUNe;gzOg*j_r z{}o;X@CZ(7^s7hMe+l!kGEUlmh4BK_xh$eO?Obd%?t_uOJc6?zU0*bt;J?elbZ!D4 zw?jvg4{y-^s~v?#DuouclMjy$3j3AgvEb`WIhx3f{TGyghK)=)lKr8s7TB(fHpY&9 zVm-9`&W$rrd+Qd z+4DKF!Motn(+QKh_B?;XTG(6z1M(u`;JSVe{ziYE_y&#fE&jY85krOjc|Rb2 z>V>AuqfGeoddQzAKv@4D^yi%!#f0a7jX!S_kQ1Tn(;cM40)Z}Jz^4ams1{W?ToPga zyyYO`IcUL1oP2tp_1k~{X@6e7I)XLs-5z{8;{OV}^nQoo88h6_rN<5xzzJkL(UGvu z36R#;*#`suJ?)=HGL*VVALU2%QIvCUn68h$$)ER!zuljAjWh4qw>tBfzv3-M(>gt8 zf`=Dk?u!Rhj~%|exlla@+NeO)_?gm~#6nU&oM|mFx zA>SRiELir@NfLZ|eb`zV4k~Av{VF;Siq3s#Z}6quJ6SRpitEP!AXHjE5;3V7=Hr7? zi$>=UGJg|uLX!{WU zJ@_L8v0e>R6FhuD-NRQ2DD=G*`5^lJ9WB!l?v;0XPzCVoe?*(8! zi}lYi{c-~&i#rPQW5SyMU7+3q)HDBHf!WoDQ9$BA05-{a;706xh!YP7J`sYW!uqAf z1YAqBOir+0)hA%VE@+v(WL6x<3+>@<3)CD^g5Cd&-fTEl1US?$j6D7lbLT1VG2Aj= zsYQ3*@fXP<;w{?Z=jApeN62fmTZplg@%U97Jinxl6(s0yBkOx=1rN<`xM zkZ}szm175FAPi-sz^AvDNo-Mf0)GTGntNHT6!?0uw@ zF}wrJxktnLjQ7Hiuzm-C!?7sDmwv5}&O=FRk$-{@Feen#La1S~d`OT5`4$yQCE%OE z!_c#|(rHr!fs#+po6II1Yp74eR5{vGJC7OztYG5E%LxW1LGUV5&zhZf=GgzHHeA(asM5*vBHh=1hYt{%T72txl;R^kyGvN>%JrI5LRZf6ZO+}!6JPTY_}Z^j!-Vcnjx|b5?<&^BfDAOY&&WR zcuq#Vb&*XtBSp}Jd@Fc8_;%O=A$eVQk}d`)`y#@+-c0)sZS*17ob;{a(6&6?-pPxj z%Y@?Sy!f`fNl4+dt|=^seMy;T1?f#{%d@i*Z05spemE`&$C2{P@Ouu$wvf$l>kxmd z)SI{BRoQH&{hYGVyp5u#%_JvV^{WX~_^h70S+BE&BCJM(fAtEW!hnNcUxhgruHsEf zx9@4zBfhxl9KvyMJxe)C?_V1Vz2sxlTOhq9nskW7(eSO%7a;k;KcjS#?2lIjGckKD zVXKz)*!peYqiuX0u1AKR^x+6BIG)j`a&Z7YE8v6YFvpoi9Rf`4ZvZnBVCG0WuLCnP z_zD&eat_zwp12zj=c@S$q;=#=!$8H8JX66s`4R#b)bB(4+3v>>oB*LEV0g&t(;diz z`lH%G*#DLJ@p^_hTKCV<$FmXzD<~+$@;pr~>u@T7E^60~!>D%Al#|Gck+ABOO*uJ~ zkid{wtWxobX65jOP8yJoxQyOpOq=gi0vGn54-EBAJRex*h1=F2(1rmBKa|MG9&BSu z#fo-t2;REz#vqILy}~G?Nb8CN>+cfq1*{`blYo!h=-7F2Bc=};HDKYCZtV=jX7Ibp zY5AhbGelj-DfpVTXo1qI&1Q{_twK8aHyMc4etnZndW>zItNmLrB$7S|{UWV8GTs!7 z_uU(e2LWi*o}>{c(0D`DIq?cEnK&o8ikSNc!ydpDWO)}G7PSSXJ)n&>^Nmhxp!++u zAM=fKY|3GJPf`vCwBeLWrqnHzN}&`Sx{c0MU?i5SA&kHbJ7}@Op8po#UJC>hERtY0LBiVfCH$~$3k9<5SP|( z@!eTFdAABZ9a5b9^jnCWypW?EIQpvtu!AV@6K{<>?AZ#_^i@@7kG5LYN z#6kFS0R((GA~ptS_V}!0QJivkKQ1fRok86v-=M(pzGoZ^YB1tqM?h&2XLZ+I4MEm> z66LEOi1J24jMMDW$gegCF{6A=-laXRXNU2Et8*|7=(7iWc=2`-K5y-ULJ8BleA(og zqB=R>JUTE#z9&x2XMfD0o&K1^-Ey;8Iij>felK918WgZ9_Un;PL9|7kxW1p#5}D?F z^<;2l$ZODkj=mPbnIY24i{Y2gmNd)j47hdF0rYj#vUb;_2#u?0=2q#1ALod&*0 zJ<~RH8TdpRvC>$i9j3xXYU@(^nl^*|$pSCm-2EH$(Z8MFi>6DuhXK%tepOG-rN3}6 z#)NzIMGMq*M)ktv9(5mGC!KRezlW&q4s^%DBGEmp;+u0!>ijG0y2HiFj$Owe<@~!o zSr^~Q59w4xI4GxEDeVm%-uW^vVm9Ht|FZ7jo}d~|?&4N_^7HG#y_5)?8jwp2 zT-yv`Eq!Io)7QPt_)J^>1kamY2x;_fUM40D@(zv3MWT#G3XO?F5`PaU z2N5H9BL5L+b>Z-$+x-^~=d(;XYfC+vqRcx?bHVu#ys3oL zU|pL6+Lzr|xSjNoS*aryJ(|2ro`W7R)saj$u`kgIUcCuiQ|f4pr{Zid2wkKxO%C8g zc5-1YBEG##UTx;qj&E~bAr}cgv>T^7PpVvUN1Ywr`o*UMYM@zlYvBq>esxaI3I%|n zeeu#Cbu<@g(1bYeloD4whk>{^p9ScuO9%=XosucpukP*JCZ&;f}O*m<2?K&gpy_t~xuc$!ri&Sw@f4$$ZdIG%{sb2cy4zV~P^gg6L51R^e z`Ch|$@16Q0d`K+;zF77W8tEgV#^fY_&?H!kk3YHAbj|+JdLf&}I!+=LyPRqt3 z)%zET&-k0Q3!pzhGE5`;I2f;ef_IlTT!&X0l7uSX!OJ$jS=*~uHR@A33ldz^tUZm0 z&Z+k!roQVayZa{ywZ{+u->i?7dU}{vf<*8Xb+>@(Jcs}x_5&emQ}81CkSD$l z9O18{Op-^E6z5lth{zGRfB^oyq6Nu*-@3!e9rMKBs^@;R3HRb27nC0uk~@?I`1>}8 z)pZ{z&MS2nX1Oc9s`Er@d8K={;?z`US8Ao?u27sOll?j2w!S5Yl_9EAyUBU-rZ%NU zQ0_M<^Nd~xx|!HBJtSuN@n@B!30cdA#&A+XRy9RqvRp%laMCDbA{vHFe1|Mb3;RK4!}brSF8Kg(Doc6++J$Bg94Upn zi;>qI=GU58(;3kq543fjP^qD|(!9{&yt4L=14LaaP}mh2SQY5k2>coxohZzeRA(mv0*YQWb6|gCLm_;$?XPx7_7Gr(D~*> zX^lFPLEE0lhK1K>Nau4jkqJlSuB&f^ z$^MRJP%$1yY$9e$azLKgPMkxGsB7S&Xcer^F}!VAIYc`Mu;DtVGeI9yk}DxA_F%>^ z5S50F@S7>VMhc&)r|>s)i9q?&S_Gu;^dQ5N-ZN z!)8RPQ&1Y7M#4vlEl9MnaY-$!IagM?l!i^LbSptJ1CXEvfN67X9m8=sZO)fK71%Dm z5*jlF>Qn9UIkzg#-U#qubzSB9oW0Pnq;nypM?#8A22A&JXtPC2JHlU7mN}PkrWK)7 zbV%3ROt^?b9~$PRgpMP)nZL*x5vp&m*=h;*rINi&#WrKxNysq1yXJ>={7i-4(~1TMPMcJ+or zjm}U0$Tu$eoOHRI^)xM`*wBK~wpe;01Zcx9k;IqgXg`Ct(6T9*i=fO86;bv&0&Nz? zBwg;cXc~q<<;1d`RJx5yC$LhzL*m|~qZlweKaDnM^+&z;X?LMZwMWk8q;W;sGZz@3 z67-L8WegOOnx^gxE2V>>*u4M^L>Lr*w&e4W_Y-XjX0iw*d97uza+pT+uoq}(Cp0{U zHF=I2H~60vlKsK*{O4I$p;^kh6NCb78wPH4b}8$w=-7zyKBDDdO4>YNT>BFOc_PCS ztL*^rFub7MIf7u3xV`7XvD?p2xS)7XL?(DA>Zq;PLZ+@e5%P9vH8js=)q6tgLkG=( zcPFezQqA~_Ub4nX$+E^vi4=^cAeLrr)vls)FjhN+2o96rI7S5qZ4{9lKCoSfMSKRg z-ux~t1`EH4?0rT%sU|oKU|6tjn7ZEw1P|!@gV^&Jxs}GU9>P{WP=}37L&z&SvItL4 z4omiTzmNGaYQcH!2ssoZ#i~n8K^ua33kVZ`hY{5tAb?Izh;H?4OLR7EEA{MspfFY& z$G_gY0NMonWi<4%9r?~zs2CKdFNp?YTnt!LXEj!vcEYr5r1OX z6q;DTLKh1QS-6mei&?mgg)3NC#=;5~N-V5rVIvDSvTzd%=})hPCaz`S(=2?Jg_~Kp zg@s#L_!0|uA{=l%{QuN{Lkxh!$-L&EK-e!4z7E$|xMuN$vj!rl@f4ItGN@fH)yGpE z$wwVh&h&$<3sIbdC(_P}a>}D$bos_ed*oC5%~5@BLz-aPbPY_@7q#pBhH@9mPoRv( zq94uiE4-WF__5;Yhnbb?0kxrd(JvalNI$hGztQ{((4XE)$LHc}#;C>njph((LoxNO z_mi*g-J9>rSGfFq{Lx;Xo2}+I6qun@M;EAud~@PrGoK&IFHj16d-EZ}^3B#E`AROQ zZOZq>%DbBPCgzI^toboGKH$Vcb3=z;%x}xD!;aV-ldmimP4dYO$v4NGv%rr(4GZ@= zSD@~(=jUhi=KDta^M!n|9=Mv_oUgv)mlWrM{G9y!WOKgRC2sePiO-*uFFv`}>?>4r z)OMBk`2zXs;=X)EYQq&ixp$9dUba`;m8i}+3^Dr*?7!$aUYjNyf7|cc`q#eGT0}qO z%4)|GsTWzR$a`e0$U9I(arIc8*e7U=(hMQmcNM+UIm5J`v z%iYydc~vDxl}bFGk~N8y?#B}=+?5YYW!z)#xcl2Z?3Sp=ThX6WUE-;U9-!bc0!05A ze}c_6&OHjF^2Q<$1`f9=D(`#9gYm%ajLJ(#9!vwSJu0sVc`y{XD^Yo?kq4#!4ZmIC zk`olK=D0XKcjL*yQ;4S$Pd%Pz@w|d(H=YxCV%Ff_J>a2V65@P3%kcad&#&>kg6B;< z?RXC0q2C9HH9S4x_e+R{A9LJy@l3&!i>DONdOSbJvl&klo@01=@X)UpaSUcezyHp# z|2$@T@j{*JirpShl_#f0T9K2pXvRX<%-ozGa#lXKyr$%#3U^@{D0D?Z`9q!(&zk#6 zDk^HYDKWF$(tTc!$6YD8JXMUr@3}s2_6p7xm8*AzOzszyJBJZzeo5tu3ikr&*&)cA zx28sNuPQ8G<(^TKSB|lf;_8OXt}K_zODf8L?4DOpUL)lL9_}|oX4mApAM!r@u-oJE zxN86k_agGb@Kky7z*pd>NSP?i@m5IXGuKG&!m0)3E8O>$m3X*S!d$Q0v&QB2lva6G zl~gWw-&f^@d(*=`9Xro0&95wD@U3u0#1^2U(pO>&-JVtDU|9^HBY=A^_8Y5%?ThbQ zy&4#(dc40Y$P}))7+5dv7mCHptExehcV3sj!VO7SwT7D*E|Jz$yNk;!ORI{*CB+p$ z42M5L74EE92i%i_E?2FBxOH-?+^d$as^;*e8l`BQS(I8;^_ZK>r&Ns_Js7y+P6lclze;n z9q_MEd-|D>jE2QfMG~=n$XB5GVD-PRw#k#GhE0So8MAz?^ zby3x#%c(zR78XMU73&Hrsw(UDy80xXuB{Xez%^-dGF_APA9{Ux>|41Yh5jGe#@=TK zx}f)H82hDlPR>B3|7%h_^aMvw?cgbqsS94cK|T)ip>cqtP51{2gsf|RnbTLVsz`jy z?Ww^=A?r@tRO_9IH4-#&2{r}ptUK4ZYwnz$JtDKDrpCSMp^7z$s9srctOa8C? zf%_Muf0K2Awc7fjmA7Rl`I28sE=;LOIhHakb$Z&vX_M^^`&0Jq_BZVB+ppTkI_5j- z9KUir=XiA5FQ)x!+Ha=4I_<-07pL8kF+X!{*7~f=S@&cYXQxh|Hl0hB!_IcX5wBEFs zbTK_Hy)a$PCc;YqjB%;&PaBqTOGbRgof-FLq+}FlATtNBBXTEIrF7YS*_;bI7QCm~ za&1LPYm$SK8OuYwcU?f3WYd zciBI;pR$MS!yT&}&pWm|x*emZrBBP7wq)A!Y30+Zrg^9RWLn*{m#2-$croMOGj?Vy z$$TkO$QqG#OIAYG#H`6#wyeCY2eTGtEzNo%>tD0BX9co4vfj-)mi2kosjQLNw`AXu zJt2Eac2f4V?CII_vKMA=%>H%uZ?m^%|6BI!*-hE+Wq*`?F8i(Nho>K(j!7@$xTg{E z*6&)ES>4tjTmQxSN9$j#?_1AWFIWXzp6vl!olUjZ_@5rM9H* zN!_1%DD}hCPk`6csb8mFPUX{vrHxFxC2eflIIQX9G+SDFT2>nU@49V($z+YQ##^UY zt=1fCt~KB4vX+6~8m-S-H(Ot@ZneH-eckG}?y|O9_gX)&c3FEsGriU;R+DX#&1%cH zEwnAREwh!`Ds0uZjkZm;#YxMOI+OmARG7Rld0BF2@`+?Exi|SrvXGLHvNh$Elvgs^ zGyamHW%Oixm2o9Q$c)RJl$ny5pXtgh%v_kcEVC@LI&*bqZDxJu=FBab{>-k-lUNr+ X7D>K1z{>$rm$lYvw$aP~y}$njFKe_; delta 5159 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 diff --git a/bindings/cs/libhat-tests/Program.cs b/bindings/cs/libhat-tests/Program.cs index f35af7e..7933271 100644 --- a/bindings/cs/libhat-tests/Program.cs +++ b/bindings/cs/libhat-tests/Program.cs @@ -11,9 +11,9 @@ var pattern = randomBytes.AsSpan().Slice(0x1000, 0x10).ToArray().AsPattern(); var scanner = new Scanner(Marshal.UnsafeAddrOfPinnedArrayElement(randomBytes, 0), (uint)randomBytes.Length); -var address = scanner.FindPattern(pattern); +var result = scanner.FindPattern(pattern); -Console.WriteLine($"found pattern at 0x{address:X}"); +if (result != null) Console.WriteLine($"found pattern at 0x{result.Address:X}"); Console.WriteLine("\nscanning in module:"); @@ -21,6 +21,6 @@ var module = Process.GetCurrentProcess().MainModule!; var moduleScanner = new Scanner(module); -var moduleAddress = moduleScanner.FindPattern(modulePattern); +var moduleResult = moduleScanner.FindPattern(modulePattern); -Console.WriteLine($"found pattern at 0x{moduleAddress:X}"); \ No newline at end of file +if (moduleResult != null) Console.WriteLine($"found pattern at 0x{moduleResult.Address:X}"); \ No newline at end of file diff --git a/bindings/cs/libhat-tests/libhat-tests.csproj b/bindings/cs/libhat-tests/libhat-tests.csproj index 1e8fcbc..0667b0a 100644 --- a/bindings/cs/libhat-tests/libhat-tests.csproj +++ b/bindings/cs/libhat-tests/libhat-tests.csproj @@ -7,11 +7,11 @@ enable enable Debug;Release - AnyCPU;x64 + AnyCPU - + From 135c454bc4a208af3b5cb23726758df041c12c0d Mon Sep 17 00:00:00 2001 From: phase <64127681+phasephasephase@users.noreply.github.com> Date: Fri, 4 Oct 2024 20:45:10 -0600 Subject: [PATCH 4/7] nuget ready --- bindings/cs/libhat-tests/libhat-tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bindings/cs/libhat-tests/libhat-tests.csproj b/bindings/cs/libhat-tests/libhat-tests.csproj index 0667b0a..c3ba1cc 100644 --- a/bindings/cs/libhat-tests/libhat-tests.csproj +++ b/bindings/cs/libhat-tests/libhat-tests.csproj @@ -11,7 +11,7 @@ - + From 862a00618a45c07d61f69bdfd0ec6d5df616eb7e Mon Sep 17 00:00:00 2001 From: phase <64127681+phasephasephase@users.noreply.github.com> Date: Sat, 5 Oct 2024 10:16:05 -0600 Subject: [PATCH 5/7] Update README.md --- bindings/cs/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bindings/cs/README.md b/bindings/cs/README.md index 3a2cea9..aeef433 100644 --- a/bindings/cs/README.md +++ b/bindings/cs/README.md @@ -4,6 +4,7 @@ C# bindings for libhat, a high-performance game hacking library. ## Notes - Currently only includes the pattern scanning functionality of libhat (libhat_c only implements pattern scanning) - Supports Windows only, x86 and x64 +- Requires .NET 8, support for .NET Standard 2.0 will be added later - Linux support will be added in the future ## Installation @@ -46,4 +47,4 @@ nint address = result!.Address; // 48 8D 05 BE 53 23 01 lea rax, [rip+0x12353be] // nint relativeAddress = result!.Relative(3); -``` \ No newline at end of file +``` From 89293b70faf7c9cd09abcba31956f327493412a1 Mon Sep 17 00:00:00 2001 From: phase <64127681+phasephasephase@users.noreply.github.com> Date: Sat, 5 Oct 2024 21:46:21 -0600 Subject: [PATCH 6/7] updated to libhat 0.2.0 + remove binaries --- bindings/cs/.gitignore | 5 ++++- bindings/cs/libhat-sharp/ScanResult.cs | 17 ++++++++++++----- bindings/cs/libhat-sharp/libhat-sharp.csproj | 17 +++++++++++------ .../runtimes/win-x64/native/.placeholder | 1 + .../runtimes/win-x64/native/libhat_c.dll | Bin 40960 -> 0 bytes .../runtimes/win-x86/native/.placeholder | 1 + .../runtimes/win-x86/native/libhat_c.dll | Bin 29184 -> 0 bytes 7 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 bindings/cs/libhat-sharp/runtimes/win-x64/native/.placeholder delete mode 100644 bindings/cs/libhat-sharp/runtimes/win-x64/native/libhat_c.dll create mode 100644 bindings/cs/libhat-sharp/runtimes/win-x86/native/.placeholder delete mode 100644 bindings/cs/libhat-sharp/runtimes/win-x86/native/libhat_c.dll diff --git a/bindings/cs/.gitignore b/bindings/cs/.gitignore index bf52c2b..8480e2d 100644 --- a/bindings/cs/.gitignore +++ b/bindings/cs/.gitignore @@ -484,4 +484,7 @@ $RECYCLE.BIN/ *.swp # JetBrains Rider -.idea/ \ No newline at end of file +.idea/ + +# libhat_c binaries should only exist locally +libhat_c.* \ No newline at end of file diff --git a/bindings/cs/libhat-sharp/ScanResult.cs b/bindings/cs/libhat-sharp/ScanResult.cs index 86ef86b..141d20e 100644 --- a/bindings/cs/libhat-sharp/ScanResult.cs +++ b/bindings/cs/libhat-sharp/ScanResult.cs @@ -1,7 +1,8 @@ -using System.Numerics; - -namespace Hat; +namespace Hat; +/// +/// Represents the result of a pattern scan. +/// public unsafe class ScanResult { /// @@ -27,8 +28,14 @@ public T Read(int offset = 0) where T : unmanaged /// Resolves a RIP relative address located at a given offset. /// /// The offset of the relative address. - public nint Relative(int offset) + /// The amount of bytes remaining after the relative address. + /// + /// In some cases, the instruction pointed at by the result does not end with the relative address. + /// To prevent incorrect results caused by the remaining bytes, the parameter + /// should be used to specify the amount of bytes remaining in the instruction. + /// + public nint Relative(int offset, int remaining = 0) { - return Address + Read(offset) + offset + sizeof(int); + return Address + Read(offset) + offset + sizeof(int) + remaining; } } \ No newline at end of file diff --git a/bindings/cs/libhat-sharp/libhat-sharp.csproj b/bindings/cs/libhat-sharp/libhat-sharp.csproj index bf799dc..72959e8 100644 --- a/bindings/cs/libhat-sharp/libhat-sharp.csproj +++ b/bindings/cs/libhat-sharp/libhat-sharp.csproj @@ -6,22 +6,29 @@ enable enable true - 0.1.2 - 0.1.2.1 + 0.2.0 + 0.2.0.1 libhat-sharp - 0.1.2 + 0.2.0 phase true libhat-sharp - C# bindings for libhat, a high-performance game hacking library. Currently only includes the pattern scanner, which uses CPU vectorization features to quickly find patterns. + + C# bindings for libhat, a high-performance game hacking library. + Currently only includes the pattern scanner, which uses CPU vectorization features to quickly find patterns. + https://github.com/BasedInc/libhat MIT README.md https://github.com/phasephasephase/libhat git libhat;vectorized;game-hacking;modding;pattern-scanning + + - Updated to latest libhat release + - Added missing summary for ScanResult class + @@ -29,8 +36,6 @@ - - diff --git a/bindings/cs/libhat-sharp/runtimes/win-x64/native/.placeholder b/bindings/cs/libhat-sharp/runtimes/win-x64/native/.placeholder new file mode 100644 index 0000000..1513c59 --- /dev/null +++ b/bindings/cs/libhat-sharp/runtimes/win-x64/native/.placeholder @@ -0,0 +1 @@ +When building, place your compiled libhat_c binary here. \ No newline at end of file diff --git a/bindings/cs/libhat-sharp/runtimes/win-x64/native/libhat_c.dll b/bindings/cs/libhat-sharp/runtimes/win-x64/native/libhat_c.dll deleted file mode 100644 index 90e2c4f491c4333f1aa2b526a073aeee0abc1eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 diff --git a/bindings/cs/libhat-sharp/runtimes/win-x86/native/.placeholder b/bindings/cs/libhat-sharp/runtimes/win-x86/native/.placeholder new file mode 100644 index 0000000..2264f89 --- /dev/null +++ b/bindings/cs/libhat-sharp/runtimes/win-x86/native/.placeholder @@ -0,0 +1 @@ +When building, place your compiled libhat_c binary here. \ No newline at end of file diff --git a/bindings/cs/libhat-sharp/runtimes/win-x86/native/libhat_c.dll b/bindings/cs/libhat-sharp/runtimes/win-x86/native/libhat_c.dll deleted file mode 100644 index 8ebae9d2ca0cb3a75b24d07ea248fe74d6248ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29184 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 X7D>K1z{>$rm$lYvw$aP~y}$njFKe_; From e911ded8b4878e3946303340035d4942cb8b20f2 Mon Sep 17 00:00:00 2001 From: phase <64127681+phasephasephase@users.noreply.github.com> Date: Sat, 5 Oct 2024 21:48:23 -0600 Subject: [PATCH 7/7] Oops unused comment --- bindings/cs/libhat-sharp/libhat-sharp.csproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/bindings/cs/libhat-sharp/libhat-sharp.csproj b/bindings/cs/libhat-sharp/libhat-sharp.csproj index 72959e8..2ee3fb7 100644 --- a/bindings/cs/libhat-sharp/libhat-sharp.csproj +++ b/bindings/cs/libhat-sharp/libhat-sharp.csproj @@ -34,8 +34,6 @@ - -