BHX 5.6 now with great encoding

Discussion forum for all Windows batch related topics.

Moderator: DosItHelp

Post Reply
Message
Author
carlos
Expert
Posts: 503
Joined: 20 Aug 2010 13:57
Location: Chile
Contact:

BHX 5.6 now with great encoding

#1 Post by carlos » 12 Apr 2015 23:21

When I create my program bhx it always encode binary data using 16 hexadecimal characters, that is write out 2 bytes for 1 byte.
For reduce the output I recommend create a cabinet with the file using lzx compression and then apply bhx.
But today I replaced the default hexadecimal encode with a encoding based on the encoding ZeroMQ Base-85 that uses 85 printable characters.
The result is awesome, this saves more bytes than base 16 encoding, and even more than base 64 encoding.

For example, the current bhx.exe size is: 12288 bytes.
Using the previous default hexadecimal it produced a script file (that includes the decoder) with size:
flat(hex): 26921 bytes
cab(hex): 11288 bytes
And now using the new 85 encoding produces a script file (that includes the decoder) with size:
flat(85): 17957 bytes
cab(85): 8182 bytes.

BHX v5.6
Encode a binary file in a batch script for rebuild it.

By default, the generated batch script name is mybin.cmd.
Is recommended convert your file in a cabinet
with compression, created with this command line:
Makecab /d compressiontype=lzx file file.cab
and use the generated cabinet as source.
This can save many bytes in the output script.

BHX source [/ne] [/o:out] [/y]

source Binary to encode.
/ne If the source file is a cabinet, not write code
for expand it.
/o:out out is the output filename instead of mybin.cmd.
/y Overwrite the output file.
/hex Encode binary data using 16 hexadecimal characters.
The default encoder uses 85 printable characters.

BHX /author
display the author of the program.


This is the script for rebuild bhx 5.6 :
build_bhx.cmd

Code: Select all

@Echo Off
SetLocal EnableExtensions
Call :Rebuild
If ErrorLevel 1 Echo Rebuild failed.
Goto :Eof

:Rebuild
Rem Script made using BHX 5.6 { consolesoft.com/p/bhx }
SetLocal EnableExtensions EnableDelayedExpansion
Set "bin=bhx.cab"
Set /A "size=4688"
For %%# In (
"bhx.exe"
"!bin!" "!bin!.da" "!bin!.tmp"
) Do If Exist "%%#" (Del /A /F /Q "%%#" >Nul 2>&1
If ErrorLevel 1 Exit /B 1 )
Set "fsrc=%~f0"
Findstr /B /N ":+res:!bin!:" "!fsrc!" >"!bin!.tmp"
(Set /P "inioff="
Set /P "endoff=") <"!bin!.tmp"
For /F "delims=:" %%# In ("!inioff!") Do Set "inioff=%%#"
For /F "delims=:" %%# In ("!endoff!") Do Set "endoff=%%#"
Set ".=ado="adodb.stream""
Set ".=!.! :set a=createobject(ado) :a.type=1 :a.open"
Set ".=!.! :set u=createobject(ado) :u.type=2 :u.open"
Set ".=!.! :set fs=createobject("scripting.filesystemobject")"
Set ".=!.! :set s=fs.opentextfile("!fsrc!",1,0,0)"
Set ".=!.! :e="0123456789abcdefghijklmnopqrstuvwxyzABCDEF"
Set ".=!.!GHIJKLMNOPQRSTUVWXYZ.-:+=^^`/*?&<>()[]{}~,$#"
Set ".=!.!" :max=!size! :wri=0 :n=array(0,0,0,0,0)"
Set ".=!.! :for i=1 to !inioff! step 1 :s.readline :next"
Set ".=!.! :do while i<!endoff! :d=replace(s.readline," ","")"
Set ".=!.! :for j=1 to len(d) step 5 :num85=mid(d,j,5)"
Set ".=!.! :v=0 :for k=1 to len(num85) step 1"
Set ".=!.! :v=v*85+instr(1,e,mid(num85,k,1))-1 :next"
Set ".=!.! :n(1)=Fix(v/16777216) :v=v-n(1)*16777216"
Set ".=!.! :n(2)=Fix(v/65536) :v=v-n(2)*65536"
Set ".=!.! :n(3)=Fix(v/256) :n(4)=v-n(3)*256"
Set ".=!.! :for m=1 to 4 step 1 :if (wri < max) then"
Set ".=!.! :u.writetext chrb(n(m)) :wri=wri+1 :end if :next"
Set ".=!.! :next :i=i+1 :loop"
Set ".=!.! :u.position=2 :u.copyto a :u.close :set u=nothing"
Set ".=!.! :a.savetofile "!bin!",2 :a.close :set a=nothing"
Set ".=!.! :s.close :set s=nothing :set fs=nothing"
Echo !.!>"!bin!.da"
Set "ret=1"
Cscript.exe /B /E:vbs "!bin!.da" >Nul
For %%# In ("!bin!") Do If "%%~z#"=="!size!" Set "ret=0"
If "0"=="!ret!" Expand.exe -r "!bin!" -F:* . >Nul
If ErrorLevel 1 Set "ret=1"
Del /A /F "!bin!" "!bin!.da" "!bin!.tmp" >Nul
Exit /B !ret!

:+res:bhx.cab:
o&BzG00000p.A:d00000ec2UI000000,5A50rr9100000l&Wh`0rrim05axM
000000053GgJJJ~vRy0swQ4+^KCANO1qgX*ty.l-0$URo001i0u]d&-zud0f
-<<e$`?Qg83G?R.y^e~Je~dIEXE]Z4n(h6pYsVvV?q9p}/NAw]Vp]m0KCfwQ
pW^snUILblayLQW:q?YRDjH[OMop-WRZpYyTXkL6]k8][I-1)o1]}b8&eOcA
?[=`l{?,h:o(Issn#SdZ{$yoh[ZFG=Q#ol5)YL^.Z$(Qs1gx5UC9:&lf#hJh
/QcS}1y2oA`rmgn>#$tmXN?<BtEvDY&WDYU?}[.m0dU4H+)TOH/ao(+=*nHT
*9&9Patsx>P^*y(t&rxlBoMXzqj5KnTQMByJIc~Ly)2qu28{kZ,h60:pE/]J
Oe[9uuBn>`US~K:Zlos$aW<C7ck4Xh.69$p5Hsm.YP2l:oD~Rj)k/ogSl]~F
Yj)Lm4$$4.Mi5^=YFY6E410qi+p<eUb.8OOW:xL#Y:yUcl`nVd]6YZZ4`5A[
zXA&$IUBnH9ApjHD5-*~Lp-texo}?=hV+.S7l8N7(I`<61NBovWtkj(?:B9^
&[A}#+>Woi=N-UrWOe7zG1p:mTMrUZefLC1TV15f3AOl-n}gbc-cU]AzqozI
.Oy&VJs&onVez?/TtNeig7,y{p?}~jgX1pyCv7mZxMT$?L>.9Y<6aS?7TrmQ
j(fbLjBx(D:Ug#J*)=2L<2li+Dk=z`>QvJ6($zgYo67:x*DG-L?7WmUeb(/B
0~hP#vfa1kb]BI]+O?DFl,2co9#q)1:h=cXKlp,{3<J0srJsO[`&SsZps+<^
927vFWn725F:Ri>-oiE,o^bzh`-$8G<d1o}jQ*0(Y.ZpfV72nBPOM<rq$ck^
([PUlfJkL5oKDa+ju(9>E=:~LIp)9<5J}I7pCyVW~y<6io2e,,2xL3tb(iT-
i5&wK:s-vlxd/.YAuKUE1]5kE:8N(H6vzuA:mvH}MY2(C[&g92bu9kZ^6,2(
ATQs?[3snVUgU]AT7D-&FRifCX9OL.3dwZdeL-uLF/X9>(]}d4c9S&L/yocb
4XVejL)hi,-62-z{h:F8hl-WPzLJUlLuo),wQac4>tenasB`kJs0o]yaKd6m
mJM&s:dv1/Z2=8cBQ(ur-:1Zs>GnTuWYWiLM{W5x1VXa7T?c9E>v9X65]uIh
cHGGMzGKP:.5Y)R}E^)URY^+0i~x#q9je}Q-SklG4p0^0aU]O422h(ho`=kH
wfOh]-mb/52f`#lLI1RWhFK<${u?*#ox]6KBDC`7w}S7}eY-ySz2x=YwZhQu
0^nUg:W}D3G)RaUO?G.zdR{8r*3Y?$^C?+SD8ky7how{M2t$7h(&=Z~[DlL:
k?L}=zp2=SF9[zkol(AGOw,k&<BB6(+Py}T^Xe,+(V01ZIG-]=h,AKcW&T.h
HEKCj=L+r&D[E:d=,IJl<66j*3HAc8BjosK]E{8L<Ium2lBgRx5c?1.YDOO.
?Hisz7#j?P8X,90~oVCW8,zE/>dk~=yAk0rnGg?^x)0yW2P-8{XYwA^yJ{$)
DVfqP+B0ymc:qo1NDldq~Hqg&,1~{XMrqojQkoO)0M<+t~gjy{3t:G4G^M)T
0sR7]2IKZsKjI9NAq4,6P1qT=AF&9z/-wqCXO-?yq.-}VNYk##?s`p??.YH:
x2lXkz84OEObb>38Q}cTUbJ3<W.5p1&1bjy)55TVwqUb]N&a]G]nB8UWd,+X
~7IHcIsaCWXnFFLXwkfE5i6IXgJ?0M7$}g0*&zp9v1#oJ17w>13v-QdFvLO-
Ff7(Czk2d*J3nmGtcrm&y-g<V4=z[SyWbj9xy7*lMVYx*>]WCON#c5e(Wba(
hPdBHVu875qpv&hB?N}NV-cO$ZkpW:pjaAvoC/1x{}TOn:eRp{U<50tosiSI
TQCIL>`J1}Ep-Y.qoM=~+9Z{~Wa{tuz14$)}l$M)^hV]AS&Ix4sl8FB*lMaP
3^)3<Pfvbj4QeBD^6<$:=$l1}p7p}{c.*^M0PPULpwF?gh-uE~6`qvLBYW/e
YumXgsUj?l8TK6o+/xtng6nG1E108Z-yz33Zl}RLPWdA3TUwK)Ixj,PvArE0
>&2]~OP3[F}5rzk5V9{o8~i+>I~:6T)kh$VZ6u}OqcIQIfhW5<A/<5Kd3-Z6
=R+NM[k:&22m1kUaH[G{CxDn:tcciBrnLHVPetws4xrC$M?av]P{}FcI:WdY
/hJ22>x(OqC8]X^gYsLD(]IzVEFhy/IBUm~uT:*ytZFt:y5l74k:zIcrRUs7
}oA~QasE4]`MlS+q0C$HwtciIuGND=ser8$SosoX.N+cHqAO^S.6eNLIL,c<
[x9#7(9.[(JSy94LTPM<am3thYlju9-v<f^hRBN8z)re>>}1eDDOv^n-+R{:
P7Lp3BfGlGGzm^ekj/7d2OXX$*#gWM9F$d4Jd7Y,4?bJg9`4^HXpgN=B{5M)
D]I{gH~6XvH)]W^xHsqv]cqV3P>9,y3?5gu(GJRBo}S6+TK${uxCI.ik{=<}
VvB]up7NdbQC.L:f-sVQ(iP2opTYH0Z&PxpT]0I-G2-A0m>Gdd.#zAw[eWzF
gauBUTPhqn{cSh/ZkA9U,jbc/0o(:{dOPfQ}=upakEJox[<*31HLC(EF-gnV
m2Oy*s$a9AG<g#zqIsvfbP4DZH-,av{.vzQUp0U7cx#E~xYZ1pUP[Vs[[:5]
O#S.UB5.o$2u=OrhNs$k)e=o#B/jlj?6g8U8<**c2AE~}D$hrc?Te{4M]=cT
]{#9y}Z$U(LIB3r>Q[#9]8pSW2/{W)0n:UNRgk~``fa+OIk:[a)a7+b0E}c>
v:Atv02u{EZXSHR*T>muxXT(9FH.{6i[zNB`J}X9(m-B+Aq^y~l)LAdDb}u$
j,-JVrWuh0~(0HZ^3qYFPKl&:r($8UR#TCtS(qi*{8y)65:Vce9jjzO1oY>x
7WM<=x24{/}5w/ihYTz=H}Uo.QJyemJt=DUshn)7pY268M329d9iFP2?X]{~
<5ZzY9evytnrZOu`.r5lrZ1gkdT~)+d49ZVGFe$Cn3yd{(d9,$/GT&d/nEwi
c~scFK(Vaiog4$$MMdObX4vc7GvQMI)eA.a1L&Fk+b?bRG[k&T47#+}ZTBIt
DzC}6a2CEa=.fspVy$<-BRapn`Hz:#i>}A2r>hNB>VMIknm2Nm&q80Jd`/RU
L48LV^HVuvY#B:dZ*qet,jf*:WX(B+T5/PZ6A6Qqz~KG~T1v{p1O>]By$WpN
yIW)vC/Nv[aT#gtMYxUjN/LC1J&VduDNCZ:~+(bR=uRt1YpQ]WpWenylh<Ew
ETuDAgMThk8e6n1n1f1)M]cL?(JG&*d&xnMMcrYuD8aRz=2w#qUbM+dnO/~]
FbrewTxv~hX8}(s{TDx3oU62cvxp1+}K,/Ub)+UeLSg5/fHI5YsR&d>wGWuH
}8FXrH:Q{CdZ}[<4r]^9tu{>S{BHV4j*Mi-j+d?Wo:HgR([-Mh2Y*YajOBK0
B&.+3MUd,EUPs7wI1Q6$MhNqxy$DaeCjyZSlVd[*EifRNBBCARNmHNTvYvVv
5ar:R+eFF=tJrwla9SgPXnKsr){kt<Ju4PM)=b{B{F9D=p4p>YYi*#/I-v.~
AnL8isncsL=hQ$Lvk,OYkrYyqQ21B.*pgMZ/`=`pl~19~]ExzyRW^^^vW&t1
2Y)>`3zY{6L$v[Wc*8Q./`+Nf.]e(G3Ky(#-4DlC({3JAi3ZtXh5]HB5O&1P
5Y6-U7.Xdh)[)jg6G.icncRv{367=xik`L-TK)Kcs$*{-AA#n,jRFIL-ypz,
+Tpe.eo7#}R<9XGO5J[:h6K$iBpjPUg66#RYqO3yzQ38iTJ{jDaDJqdvWB1g
uTSdno]muUJ10(,SH6w>(>v3oTw2J#DmM,4fS6fAe/u9p]4mPl(g3Bp:Al44
^8YmS[}2uC3gT.[T]Hb4:Z)L`iCH^skQsaVacuBG(>Qv#rSR+Qh#CK`FIcRe
EibB{=Omp6a[neh1i?X,x?(4yF1xK0:S-p41zR:qb:>^^Urtq[=VhoFBct.V
)=:M.abd`VU{T+oNB4Uf6LE[UF?O*`Vz{lj-Zixo^N9`rQ{]znp+sdegN~so
0Ni8ddvGm&dw*].gpx4+=pTTvxjAthe:v9o>s^bLadBwI5gJ#o&c~Em?M`vw
F>Jnck-en2zVqX(dJ$,5*e>pI?9G*yupk-RB`[xzLu*jztZd)CvU5&sjUg[^
21TXtpl9Lk-nuCG8:Y/Z--1y/ORh^GRxvrxpqp3JWesf{Z3]?2,i29dL/YI)
{zT/Qr{Bwx>+`{RSuOpcW`Darudm`Z0$#<b6EC1Zg17pJoW/tZN:xetKwOyo
]{aoQ5rWEUFHQ2>*fHZ$[(}QE]0tA&>yd+:<p]PFI8BYFvB{.Ursnsgw*K?F
L[rn:r/a`#<,-TARBq<*sX=jRV(0wgQP5FpWQH0PLhq5Kd)0hql+Z90Fupg.
9V9B^TJ:t`wTWg=/<jEnN:*hT1A[VO]qU/c&k~3fM::p.7nGB1Id}i*jS:fm
{OIXmB+24vLh9Ydq<R-CM/S/KBj8pm?[tsMF.L~=JvFJvpZVJr*,<qF~<lZo
6pb:&`1*${YElmJL9fx-HKCi5F2u)LKj+pV.I>6[/dM8O/{Lt.3dosc>rq9p
t)eY2E+Cmec~6^Roz6hV^PJa)fmoeSI]F3Zb9~QkG`PKDuxriz^GkVb6CuWs
Sq-bmRcDB9G:VL?j>[G6jiYd5.uq$W.[-7HvTe(`ZTkh5nTlq[hc#e0n:bP9
WsQkP4tc#CoTQN+i[}]e7]v<5O3~U/D[hu.iWU,k6}5oiQTBOxDnBaDKvSH#
kcmxtOYzHavv}Z?8yP->F/y,}N]q?tTIwpZ<<g}uXKL)t9i+qKI2sfJGTj[j
7<2D6Q]{]RHqNyn3}Ii-i<$/L`&f&~t>k9(j36Yn}~wG]owEn~rz$g1r}/PE
vHrPeEvHvd379e,~lD,1UO<o=oZCD,lB^T~hKgx9Xq0`FPg#dEp`kTVMX<FU
0~c(Qjw1Kzq3j.hpmZou.:i0nT<EzvOmjWUnw#uSZl#DpHKL6n2ajXW=HKwW
JRUr>Eo$&0L=C>+`B79lb5g<TvL/*OURT.MS6/alJR.an{nR>?a[nITROkHq
:gN~ZFn3:nwOU+Dey)W$oMdlCSqPKQDh<dyV1[z1upi+#sWEzig~`:[QYS>R
Lg^E]2>nM`rLU*Cf/7,xV{8B7-ooRlISpmt]5#-YCDzxN4LiO9p$g#Gr6DKP
6)DguCsFFRH?B96s#qF(h`M&]zeoS22<<0?hF`FpOg78X62Tz,U*2B5oN6nJ
ts3#WvskPRSL&5O}6Ku71gKrXive,a.oA2MMG-AxOYTNcnU4n[Zm}2(az0j8
n:^in`sdV2hs>]*+~:Au*`qkL5s45j4$2l7}GZ$xU~6GSTe7x4:u*Va]n1?,
r7>V&.ZcdGG/Ubb^Zv)C7^y2T(qedT6kX{LbeEewt^?Pdtxw.vrdl<qw4(r8
yIS/OSe>iyLOGhgg7ardm~1N</}v>IE){)c(Gl4n-~)$C:O<X4]paSxiP[Tn
/<w~NtJV6`MwT:(MQcbx)GKzdW{mnoA[YVy+f[zTJFE<fn0aOkqAX4IwI7P2
d&`FHL~.z/gVG{,C6EaxJ`R{9he}~OUZ)0zVJUvGNKZqxXP4#~YeWWJU17j3
l*)zba2jwy9$/a42Jyyalhwv<0R+6]r(&#Z5qF2q1kGxT?0N`qju{eu.NO*a
X}/BV-YwF&)~60ImVF(eMW2BWJf,n^J#H5dE,8UpT1,JI5xd:oxayG}JIn`6
u-{4yEQ593L{XP$QgHgY(9ErT+]/Cs+z&C/wyHRfn$eTNYR=NCSazzKPL74B
O-Twh~VsDRgw*t~&x~zhLk9:E{sW>zh(O*jD-CDs
:+res:bhx.cab:

Last edited by carlos on 15 Apr 2015 06:32, edited 6 times in total.

Squashman
Expert
Posts: 4465
Joined: 23 Dec 2011 13:59

Re: BHX 5.4 now implement a awesome encoding

#2 Post by Squashman » 13 Apr 2015 06:30

+1

carlos
Expert
Posts: 503
Joined: 20 Aug 2010 13:57
Location: Chile
Contact:

Re: BHX 5.6 now with great encoding

#3 Post by carlos » 14 Apr 2015 11:40

thanks Squashman.
I updated to version 5.6 improving the description of the program, and also with a bugfix.
I think this is the final version of my program.

mirrormirror
Posts: 129
Joined: 08 Feb 2016 20:25

Re: BHX 5.6 now with great encoding

#4 Post by mirrormirror » 24 Feb 2016 21:08

Thank you Carlos - just investigating this now - very cool !

mirrormirror
Posts: 129
Joined: 08 Feb 2016 20:25

Re: BHX 5.6 now with great encoding

#5 Post by mirrormirror » 27 Feb 2016 21:17

Hello Carlos, I have a feature request and a question in case you happen to still be reading these forums...
Question: Is there a technical reason for TWO "SetLocals" when a creation script is generated? ex:

Code: Select all

SetLocal EnableExtensions
Call :Rebuild
If ErrorLevel 1 Echo Rebuild failed.
Goto :Eof

:Rebuild
Rem Script made using BHX 5.6 { consolesoft.com/p/bhx }
SetLocal EnableExtensions EnableDelayedExpansion
Set "bin=bhx.cab"

Request: Could you add an option to specify output line width? Currently it looks like everything is output at a fixed 61-character width.
Either way, I am happy that you made this available for us to use - I like it!

lazna
Posts: 52
Joined: 27 Dec 2012 10:54

Re: BHX 5.6 now with great encoding

#6 Post by lazna » 18 Nov 2020 04:39

Utilizing BHX 5.6 for some time, but now I add move command just behind the 'call :rebuild' to move rebuilded binary into the %temp% path, but Microsoft defender stopping action reporting "Trojan:Script/Wacatac.B!ml". Is it possible to extract binaries directly to specific directory? There is no such option in documentation.

carlos
Expert
Posts: 503
Joined: 20 Aug 2010 13:57
Location: Chile
Contact:

BHX 6.0

#7 Post by carlos » 21 Nov 2020 15:00

lazna wrote:
18 Nov 2020 04:39
Utilizing BHX 5.6 for some time, but now I add move command just behind the 'call :rebuild' to move rebuilded binary into the %temp% path, but Microsoft defender stopping action reporting "Trojan:Script/Wacatac.B!ml". Is it possible to extract binaries directly to specific directory? There is no such option in documentation.
Hello, although the BHX project is in status "Archived" I still continue updating when I give some advice of something become not working (because the new windows updates)
The last version is 6.0 (updated in September of 2020). The last time I test it works nicely on Windows 10.
Is available here: https://github.com/carlos-montiers/cons ... st/bhx.zip

BHX 6.0 have a nice update, now it uses only one ":Rebuild" routine of code, this allows you copy the data of many build script and put all together in a single batch file using only one ":Rebuild". Is an expected feature that BHX rebuild more than one file in a single command line, now that the :Rebuild get the data by parameters is possible. Maybe someday I will add this feature.

Now the data necessary to rebuild the file is the label. As example: :+res:b85:11022:bhx.zip:
mean a resource that was encoded using base 85, once rebuilt the size will be 11022 bytes and the name of the rebuilt file is bhx.zip

For also have the version 6.0 in this topic this is the rebuild of bhx.zip (includes inside bhx.exe and also the source files).

bhx60.cmd

Code: Select all

@Echo Off
SetLocal EnableExtensions
Call :Rebuild "bhx.zip"
Goto :Eof

:+res:b85:11022:bhx.zip:
p`H([3ig5a001*mBX~bs0000000000000c4003FwCRq(^0,w~h00000lr#GD
0000000000000002MK&8vRy0tvRGZkp`H([6Awak2MRblhC)^ybg(C~0000w
000Jf003FwCRrJuzzbEjCRiMLw:IHay*f#O:h#Nwe[H6&cipp.c:3z3T-F0I
p22DZudOeDeb=nH:5{~</y{IkyX~CLumf:I^HzY<oB9e,G.v[ZHnWH]d::}t
3tUfl9sVu?wGT$6f+}KN*)r<R4h^LP[CAgfj>BYe6.)rok?-u2=:**V=VvxG
C0pqpg.SgU7$y8V`5lXh:>}MsFn,ghPsZ2KF8ugK`4M?QWM/<C*CA&plZA[i
S/>L[4O=lrd=+n7m*BkaQGHKAR4m~s400kjwi$FmN-M6f:E<{Pi{yydZPTSc
I12BzHQB~]N[7({Ua5XdECxnZH4aq#3g<5^+k6+a~b8a4l<XdqItUn-qY$&7
u+]x}ki/~YoE&4)BNukXda~VzVnxJ$2Ppsl0Bjt&I,p8W&Eily^Lka6jrR/^
(7UIzCi*)Z{A}2vY,U6o}TRgFPG)fPdgr#mUKiWiEcFOJgx#ibL/Zd.fZNy5
Yf6i>-*)K{o6U~k5PX1cLuSA9~3A65FV7~$m$O}bpoUE8Eo-2Rml95]M[uXd
.G{O.?(E^#nA>&&</vG44&=GICXIhQIsg?(?ILq-xhM5FyZbkppR.qQHW..(
?Epz6]7-jt<w:ysEv>&:]mUI^*dIyoP1i8K.VD??m$Y[N0a,504*pSl<`6Du
iW[A&nTL-H0EK1<d#pvnfMWh+jPRmA00q$I3bB-<Rmh~(&$zzzrEB^0+`^*:
k7:&W(ikW2c.GVdbJ[b91Kt[E]1beVugNUfOiqtU1C*jTg[7>01(,9eUU}$k
]/fYON8AzuGzwrQ(snlU1u=Xt^+1##K8CcdoXYHxpia-7Tbg-`[NO=+&Zu>`
fkx.R/ScO$-Rwp9Ml^8uXDUZRf/pbDS&}b4Fr,>~=H}}4.DaOY.3Mtmb:Fxk
t&&Hi7wUdOveiZZdZE<N}nZ*je=Ebw}s5J[Fby*k[YwUSXqEF(AeOZiI^5HD
[Mb<VNQ)qB6rKN*Jl+k`rP6*utqdCh</~I<lrP[F,iP*XM{fKLF7iUn+kWeA
a0F97:~Z^5LPJ2)KVmMK?<uKv68`vvmPVkmkNIB~?(6`cW{2t^UKynQDcq-Q
tF#(+n++IG.ec)8izPB=]vMjT~zQ[[DvK{s[GMyz)<(92t6HF,DRD:AROeNC
Q0~Yei`hc+Uu4YqsU)K64y+XOFr):KcBU*#<X[aL~BWk/F(Ni^itH}paqT]6
[{^Stz*SjEZ`kx*2F3z?7F}}r1?hbx<7B``&RqvnE6}UT^EdA>4bp5J<?[>>
?[?Zv9Lj)Z3M#XaIi>:^,a9{)Hn*`mkI/+ldng]a9rBQhhpcFQ>R7GKqFBj.
Hk.+xJ/[45h^R96M=vtCcDq}C<y][t[ndv2t:/HW+tlDl=]tefc$}$ja&Tgm
XHDw}j*B{>W$>n9~7K={bMy.:}qx~~s/n4)]8b^+xc(RQSTmLJFO+0x&S,,r
H2h{bYDq}p]x03r[4zV4MGrhH~webU+[Oz/XQ`Q[et8V$F1E>EenAcA8${vG
Sqkaw`=/[Q4lCDEQ4fMbhG>WJ)KM4HEZKNBhk26A/isRZ)WYD=L}B~&R?uF7
Pg9}y/iiCf}ek)/eXM(fG`8o9F=.>ZF{rqPZ67$wNtFgYtOz^6yKw/iSgx3x
w(oRwl,+~C5:4j~+PH^Fh{OYqgc+H7>Q>+C<OwpQ4ePyW/TovoBmK4NmA<2=
e+[uFpEf$n(]Xu#8#x6-]&zax?lC8ocuc`TLX{&NF0O8H{QI]&i3yJ7TZW^w
]k83GlG:,)?e4MrcRMdGD94/-3XaW:ldiRG7OhTO?DW=6)6h]fJ}q$pEQx/G
Eq,BN{d~Dq{=&,xEqaiaR#DdjIB.SYRA}CA~z0927W7ln~MXF?Z9Gs*Nj7f3
O(xT7*/taW5C(DPU59:nLC&I&wF$k8QM+d(hVX3X6`00]2&L<xMWiTU}zz-N
z[[F*M]S9PDac$1wT,1S1`T#L/ay4kf6*BRjNP}tFmy1<KP^=9/H}nI<$Hgr
`$cS,z^=2G}4V82<[1Me~cZ=zZ#(O0pXjxAPu)66et7nT}81-zZ#)VK~5QD2
E7)[?Py.<=Pj^$E+akOT3NJ-X?*tuLa1G][+qcgV?k-5fiYxD$LUNiWmWDlQ
)T^/2Gj:`Tx+.}SeHF}bnZh1Codq?H^<0`G}YzKSo6$=k`IS^D^-)Vmf(sIJ
+Sfy[VGV^81RtC#L1rgLmCS]vOFh?2On8`1rvyysTrHP79$ecC95Qf4`K]0B
ym2^A]DV#PxXFOpAz~0mX$G/[pk22#Q#$1SQIC`-A.ma=/,Cw4bYo}OL4]PF
isT5fgDhyt4LsaMT4{pb0e6Y}bwwIeg$/Kr*JIq{mw,$=oB]32{,>2lL:>i0
Z.4xbdO1TtRD)v*PhS#1IoJk4r,n,`5q`FeU>nhpXn?{~Wzsy]MQHK)1`O/A
r`+-7(wuc=n4l(HwhT/<ZtJ$tc6uf#<`Xa=^f0V6EE[TQw/Jjsq9lm:`fyVR
*#{*D`MCi:Z-:8tHO]}Q2`~mjwgT81iTNc&RMn,.La=R.U[U-tD)ub{jDO18
oMw-3DtI4tjY101Otdt=Dipu^b$jZ=D3f9{&m,<+yZl#arP=X^FWKZw?3({~
Vc[V?:JXkj3M7>gW4kI>mmMCwq7ffGN-q6N5~W1}.:{cC9ntIKn*ZVq-tQi>
f/:mcvDiG?^FE3V<22a>2KjHe+~?`8&,0YY4=/oBI}4HHp{zI`J-jx1IE.w>
:H]hq<At9,EPYykBHLXm}/DFaSx$vX97B6LB[uT?bqUL4{QQ`W):XT=yPWx`
*<n{Atm?&ePHn6/o=?Lf42$-M00#ksBr3tB*/CJ3*gE*]5Z.QgW$8<D[t}d1
^VtqV2v~giY0FgYWwx8i2GeqpfZgGF+a&U&1tW,,4s~YRBSZ28lC2A/GkPEA
:K6vmd}o+UvbMj(.:25azIJyLF(QCXer`p6&&w+w<h?zJ=FBhO&^tjn<j]41
WP6S/H>ssAOmT?#)B)qDX]~T&aCpR)wu:Y*z){U{gVnIOoT{WD-r2gOQ[O]U
LSE~72X>L0sRB{CY]>,1)l<7LQn8aCHN9?oe*#nK?ah2RbUYhSSy15NIL<T.
BR*i.aRp=aOJ+5Ad:0~hWOx0S7i8$NmfwFbm[VFjWxs3xhb}iqpuan2qR1VN
GL~$Vfw3.A5i~HmQeotJkdlG97T(]W^s`ICgA/efHR>~^bO{C~7^IBdTpo~K
fEtYC=sVT6T#WZW9jMYtzn4-fvAmfCr->lY&iEH=yh2PzuD:j8GmE/{jb)K0
eH{8C0.TwCcK=Fo-~uMoH7G1`5~Pd5^fstG5S1Dr/r1vxW,*YFL2L<O9zie?
9l&2nx8UVJB{=biQS3:qzq48{z(Ey9DJgBmzqRQt/x$^z?[eud~sswpP?^<6
B&EGg4JNQ=WD=RlEh+Mj0,`<w)06`=QmK26<0dO=5Vb1q<JpwTP>GbVyClj(
O]=fhcX)?W&bx:Gd~F1&X8zPr62qb#jEO&iqTyjDgK}.-sut/:SVCtKI:fS#
0VnsZ2khk[9v[V-KvPIq8*RMxBC*-3tQefK2X^-0Krdk8:zQikwyBZMIYvPC
g-eDEH}p/27NM6B7z7vca6#vGxeH.[rWX:hbpF]am#*5F&C-BCdq,o7>)nN$
8xe43TY~L?ErPHkN91RY+QKdO:KGPiT)tjOV+T,euC#]7<zc)G)J9U0l4pP+
hq}KnXIX25/w<oDL+`*cF$gpNXlK#E[+^g3{>3BVc[FyUUb#j.7S}GIzLs<F
4kM<hmBM#c1IRi}~/fV{~,.$VlN#8^M0LwqA,QdZ&S79njE]>(wk1/pc[]O[
A6P<LX1uURuJ.2RWUyoK)^g9}U+[7y7JR8tuB?9&DLA~)nh[AJ{(}SJ)0oP8
QP9S3h6c{E1inAn.{sPT.d:ikXy]Xt/NUo/HM?C>q<9+m3NWv<)>hy^LwW//
P0}l0-nj}tJ)uX9r:ZA5([]fBTo/0~I+XoyIzn{n-6>MsG<-6a0?b{C(A]3u
s>g5eZktLHy}/1kUj)7$me#Ni0-$K^v:6TgOE(lh1UO[qXLbmk{+((8K<u}B
)[.CfPFi-jwO`8+:ZytSvoo[>`Gjc>ttq6eXni7T:Nsodmg+,lY<ElkZNqYn
k9o}PYgigxSDq?zJTMsTe,sEKcptF8Oo)zTeD((Q}2pf/KcFxvbE:f`B[i1V
?w&Bpn6w5t*zHyFuA4d^Lj$L$NwWkv8<M//CDloQ/P6&optWyd)~C]zD()[K
FW2Z80e$hq9`[as:IwZE[O5&jGyGVvFPhQFsS3sg+`QZ,&,H:iwb^LAST)<a
K7CuXC#0vfAbXu(Vi(6u4+S9h[32v]d/5#+uigA[mG,P)^vI.rdTYJCx2.[V
41li}ROIh*lavYa`HS$tw)BJKog3#>6mu5K20in1/^4y}WML`*1Q1jywt-?t
pHO[xHe(5`:W9:Z]H$2a7yY7s:B=CO)/yneB]rZGeeW-fb&?I$Zp=t1o30t5
e}`QL03Kmw6YMSd?N=CqV8g:NkP{5ehtSvQs:KnU98BF0=+Ex?E]5=u1qy?o
00&NSJce0.LyqOF1onAp3ig5n0001dxM#gdml,somj~B/OMsG.*Eq:5Mh{)3
aBcK/HQH:Het9e.:3{GQx]]&0KtZ^r*[zj?-u/X]LisN.z$DA[6.Gd3VRaBR
Lnm<7PV.xz>GE6(HvZ-Nu(Qi8Bgr+leFec7ST#4Zrojy=?#?~33#xxL>]`HX
491NPb}6P5Y1NK(}.k.K{EvlEl1hsz*-q0&5AW8/5F0[&=Q6fiPOl~K8kpT<
:[:T*UTydhsv/.[BG[f)PW]yYd<bC+FV^Qge0(yCVnul,^-0vP27m&#-aoTO
QLRr7pa&>V{ElY}~nyimjg-2wam^3rnwYoS8tgPcsxPEF^C$Kv.bs?JqSUwK
MNGUb6-},Fa*8??U9=[B<&U.6Z56Kj~},sU<-c4)5jEieDx^yJ6mG6ZiQ&yi
6wHyP2*JI<p6k/)b7vQtk^7x#1#dM,PZ2JiHYedil}y23qSJ{I.IDd7Vef{a
Y3khLtOC}j{zfRJd2/ZDH&Ww]HF&WxwhK4b<Ul$33*QRW^cgUp:*R+pE<gce
mMCp,}:6+hJZR$:zp?AftJRWNRS0:w]rlQaXE)2-NxtVz<WH/A9n9:Dlhg].
tfG{a3Kdz]<J&spVKE-GJEWoeBllC=[9PiCtXK&*^173kVUeDY.m)$F7&XE`
{gK=ok7n3H{~TNQUbKUiySKC]AG5oS77X5.cIRA.>fpJ0/kFgAI}J3F=i-8A
&EhwBZ~sQ[MktaUWIy4EiX9>Co-]aGi)PZhWVx&xEZCO?W2G6/vx}1FigHVw
]~F[[zj]99EjMc=LL:<K]e82[7*rIj7C^D~KTr/I5uj66yfcUSPXKh51X&&]
XT~m3u9Q6J=^6vxtTIH-mVQO*T<3]X^c<,T{1z+jNa*(wLuOy0UX-?lOQ<<H
~>ed9552obfmL&Ue46v)~vz0A>RQk(qxaibyr>MU90A^XV}HU~b01AOYr+wq
SN7n7mIULv[VyKmwd>[4+x7vm`/Hdhv4-SmAjZ,$xfVn1nyaAE*XN]]AM1vU
y-F4j6qt5Qeg33Bv{jt?RjAngym.C1A2[))G#o=OdiDXCz{e?=0C5J2`6T:F
9Rbq3vz?Q5RLxX>Hfd+tB/pq.6=}<6f/^:P)TXEpWxHgIJfI4kXkG]zk.v2w
`hhc)0?dYHeu]FCs?R+2y:Yl0*rNLi3>6=).iO5ptdrOOKOt2vZ&suf=b$}}
xa-Ab6<4Fn4k.[Eh<NEb]^olI/2V`[Sc0mPCd:~zP~(0lnb?U}L:2qpg90PC
TYs=](75ed`)nKCz5i-ZoSS#~[MgXuc~Er0yC[hf}U~Cf)pnd`Gks/OB72=5
j134*b&INSwyhE~ft:.e=p/xhSAlj3h(=ymUzVVm=33UlQZC-l0Lw`w]]?Eq
ke0o}Zd01U.+drMN0m*9xpWtPE(W>41S+osDP&paxpWdvoI:.GI2IHngd/~9
igY5p^OG+T&FxVWJFEEOOqX3dFGfTO.$00X<qontnQN57~C*SN~0c4>0,w~h
00000bv0c70000000000000002MK&8vRy0tB8>+zp`H([6Awak2MQ~ghC}S7
BY`hC006I<000Dd003FwCRsbUv>Rq8CRiH/tygCCmW0/erSiEW>4]OY{(}Q*
dBRA>REFx7L2)~5:YY2/1o{a}0k).rIsAT0~KMR}-g7o&tus)GAg3=uRHb[7
`7~HAu$XV#gK~y/uJ`U~7j*U.GNQzZzs$Kte$r&h+r{K2~M5zk2/>ADAAMWi
E[0x~gBE<q*Th=dfU)BdZ-KLOs*h:~eHPu8&N9G]jDvkD7R(T80sIoM0xw~>
B^LP>KtX/<xWIMQaaaN+F+Y]aXH{oa21BKWU&=sB8fmxG9B[7:UZ4vot83V-
sXaHgZZh3h3u<iFk]LH`Xd8qo+c)Mj0$djs3)1=1/I-y.Rh^L9<uxs$QrX(N
}<+ZyOqf==mVIz#U,)Gq?1aSQi``3Z9jmOZ2?:$]L1r(o-8b${D>hRaGI*V3
&S$9[H)5&k<$p-Y<h&,#JeidKU^,8<n9Rj8l$3C91f1+[JBNGh2f$-*os/Y>
Hy(&>5Qpl(ZZbAVSVG0d:ie^rG]+Ep4K2EMQv{t15RB=s?/8Hd&Okh=n*2BY
p-s$/.huG[5cfRX{XyPcTF[.c(?D6K^Gg$q--aMkGgv0ykU&7El]ekbd#+b1
mfu1u1)<<[k]`UeTLX+x.wwX{jpU3?4}~b0LVem~N4[&sY8Zd.)Y&ghgrnJJ
4VZVn)kbs&WvP5<GLAG5xS<2^0OGD+ZH]8i]A1NU12q4>nRv^oo16,PYr?+R
iwF{c/tA:wLg49uj&qo]xNr<]^&(>Lem{$S.JSW4h#,3#2KMzYdUUw2Z~:hg
&q}c=IZQND?Rr8:{,AWi>jxt(Qad])&)/,645d7.TzPa.utBqA2[sOQESj~}
`5QG5gj/^nj~k>gdIk1<*V}k)3JC(w>fSbEj9$C-VvgP?O`FJ#.0>Dw=k&JZ
SaAQ88)7g</g?J~E-QC8X~aDG.$JB>WLS{]HNlc+9mn^]/o)rWoqA{eLD,w$
KpvSE:`#FK^kurl{h//N+)nFzbqLo&.p{6mUhqOf~kL#0(YACX~7#{K5RaJr
:ilEM{DG+/..gPHv5Nf+Y1Oa1TnNV?5c76Gn~OQ-GfkX+ZO)rx/yO?o/c32K
n=n8MWd,4-<N/M78j=iQ)`/rHCjCMfM0w+j}$n10pYHa9Ke?osF3-Bj?qMYW
)5l8r){r.SQCUo[EnIp$F7K.XN$/t):aM]Q+FM2<zjpZurbK7Vlbgt)`zYGN
(h&s3/WE]2XRgi1>ne~sEtftR&+fx6+{gv51ccb#+{Eb,`(?u$XtNE1vcp.p
pnPN6os&IY3dXdRbd+HMeZ]D2.),uYj-FDo0WjuMO/en:Q]o,uJ?/:f9.3)7
uw~obdUWA>&QZt~2#F=IJQ04vV:E/PpRLG5D*v/av6c2Pl<)GOn[n5jP[<b.
6c/nB5sOeaKhICwnxt:Jx{XTWohlmMWQ^r]Q(jd?wJ*GjTJ+`V5MT`4?u20p
O1rS~~5?{y-wD^S4Udra8I#0I:oVPOrlKtDJVZtJubuSU449bAmI(Gn-gl$r
I.26z7vNlfHwW-PwF){{iubMAjXl*XQM7nQ`wLD:xJVe+D1^RE.mz,O5+]8r
HTpps^c&R}VwqRY<#C5ghnKstvr}QxNJ6#FhHK~p/Wy(u&redffn)Cp/NNAj
c^(~/AX.5~)w`gQ3+W[HMkyM{f:9ldZUP1B[~)Gp`a0&FsI50Jp.22eSFtIU
-k[a#0,gJp.*Q+PbbFIYoSwOQb]Hd~rVj?HPmdRi.>GLjM7ob5G)ZN21apPF
H.XPWjvQuVPh{8^B2~C6I+B)VF*CawRKOYIbkxqCl1y1O&>Qs4o+L^AT=Cg9
mnXkK&b5JIPnKW^oPr2p1Muza9XP(a=m+e6mVBe.C(Z{:mUZsBVlt.UuWJ?1
*o^9+INU{YJqkGJpAY/{[SwqI8ZdKts#Au2wX1zkd7$qX<.gNqqbl/Av45+z
u{(/5b44v=5XLA.aIC&(m)T}yRtNR5JF}{s}6=d(-l8,)Z&T38jZ<G&Mmyje
Tuep`oCT?VC:50LV~`{,GIeY[8-fqY7.imOOmU:BMrlg)B4$pY)[OTcv.4Fg
T$=g6RBI>g2j6WrU=b/u^vI1Yr?6HzT+,&}7W`)xXE}UDghSugEA=xss08t1
sd:xIxp4S?/q2Xzaibg)+Koxa.5=-11THFyx/463-k[8~iJP}gl8rBcg}dif
J=jv(9c:6F5NJh8T?n^:<)E1YBH17Q6uSsVm,S{Q(EpTZunO9cG58QXiMF+x
~XR+00l+)Pb,NvtWh=H]XSS.Ww61~+Y+YH]ZdMjiFu&z5w<YA(Kx~QeS^muA
A^b1pT<BPs&6/QX7n:LNpM$9KiGQfSZ}6FMXq*.Zlni{aaV+Gkk/:<:v=j}{
ITE+[RL[A#v,(LN]xzj4{RICnb[/La^23y&`bFxJYZ:u1QI<PDG[bo&h(,H:
OCy)40YZHHqI.rfQLga`Mg:Z,-ry*WC2P8]1>Ouu`eKX1-L+r?V}Km:^Z19$
~z<ncfF^z:1gSivC~l#<p4/Umls}K41a~Ij*s2)kSZSROy(o50RCoBbn`Sji
Rl$RW0FVCi8/2f=PRC}]EWsm3>Txq[m.G=yxWX48)J<w8Ug+Ao8J]w>+cf*6
.v&`1u#{K,OiDg.OrlJXty~>#r:nmY0r0{KI&MWm03N`fU)vz]5V9seSYwK,
n7EJAM,$25<6[F?s3(3Tg*9,)6q*tnXC:[IPSS3brrWd+NcV6As(0Ruw{eV6
c=6xcAq&tz6?v(Mayi<9]p-qi2+/,B[[,Pi&l(ptAd(kvlK`b^jw0$3V=:?x
c.TE.=VM>wYKJr{wHbUh+BDtc+O=f^*B/WWkc<y7O486g}lW<PjW)NhtE7^O
K8OX3m&d./Vn5)QNbb)VZD22xNqsjZ{F-8i<)027XM#fg/2,r/3]rlcfc,]e
h60-KVz{Tx{2V[ATOa9?LcQL^Cw.`74Ccq1Vo$LlU^X{<sUS>O}oEPl~RP*=
3Da9q6a68B++lfo>aT-E>mJG=H$`=5p-p8RB,0~0I:?J?~j/Jf}M}`?-+T3A
Mc>zo6^xs.66p,ykA>yEW3<c(yg/R4<9bVdYrEBh=pvi4QJk$rF{fb/oLXg{
jDIJGP1iU7TExV<kpXqpgKz,#?w}7uqN]{PZplSHJK-[YoL]65i>~rdkLzx&
e:6}RX.mxm2#9UbEWZJ1socdr*.JD=F3H~qiu=YFwgAnLu(cI2fNm7ouBY+{
90*k=rqO1&m,?9ninAbJvBDwh&+$fR=.}t>y?[]2I9Lj.Ld^-KA*.x>Ses?p
(56df+YW0Dd`SUL>>pR`DE+Cr($2H[b&Xk6}v#TS)CF.}PkAqnFbJ1CNuK`:
[L3vCnZfe{FVN`>H1yBfn#{sK3BBGeG{6XSptqWKh2sJX~R.u}(>XIhQu+rU
l./PO3a.REK#i-G]bp}z6x<M2Hd9n)*{*m$F&(GjISFhrxQp3iW+,T<{,ti:
jbO3/4)ds.QGO9uQdL#&?Ovx9=d5[/]Rv=}>}4KnFZSu7FUKcaHsF5eeF/en
x-C1rNZc8EN<V.4Un}-+J5dTbfzD^>t1)xzsekmOL2/[&8Y&4T{mk-yU]tpn
rEPTgdNSQ6oc}slmB,A*&cNugcX(<:OInV#`~>S]+RZfW8A(sOqc}uBgCh{s
3$3WxY)5kfyR+*XL}kt4zniar8tK$g?{w++T(qsyV4SQ{fTjjafKww9mbCOl
yzkMBY1ok~M)+g{9/,5.]}lvmOIPHcjYzvxgiPw>>4g:uINVE`DCHU:WNR>[
>:ZNnVRCN=&TMSi~Ohn*<.`Z)~1gW{(liHKZ:b-xzy5nxz^^U<OPB8hB4EGZ
r,Z=MorSo+k:8P#afDCvkcbXM1N-YgHIQB`{Rf5k[6MDoj:*aQ1R#e1fc3Zj
vN7w-6Xtk.R+n8UXUIOi8wrRm3BbDZ[5tZVJf8dJLE:j,0jJyA46(Bbe.L~y
Gc.VaX[}~`I^TB#yTQjhvUP9YsK?(3Y-`IX0Dzm3D}-~pSi.a}jTDK7W:~4m
0IAOK{G?[)Np`R>o(5+pa`mc7ni:sax#cw?u$)DTw]/:GHvL~Z7ND3$l&`ey
ze*>,m~L+sWgPsDIC(5^{33s6piJ1qB>-02^[Vs-EoIpo]jl,1v(3o=P=BED
bk9qIXm)]jDqB1{?sRie[htvhe4,=7?S^ZKBb`F~UV3[3^-U}YqRfm{)4?b3
-4wbHTK7CZKaxaN.OvnwhqJ#q`SUHGWw4=}.9K8v/B{Iv>nkcyvvHr:BBKK-
b35HjsuGgtOyYWEsvp*uhCy0AOobwcBAjAOVcEizJtcy`2b20:-cVKmpJp<^
9E:biXxJNaRQP8$wSKKx~H~yRNX*4U[2}JbvC3>y)O`N^nY4*y0F=D3.#i(L
<Q#k&O:1Uov4(GzY>jR3*yNm81h-AdP0TnF[8h~sZWp+9NU2,CyiAOf27lo8
=+YRWuDP83*Z,YeAm`8exL*3sUBp6ZuuluAhzN3-0~uUCw0CGq?qO+DQGS>&
HsMP:XgI[0::CRkOOk+1hjJ4[[=7kEwXHReAXkqM`sZU/lh:22=#4?aM:tC^
oj-f)3C>7]HCm9^Ot1rB<:s^d:8-p.L`>ILyv.gL)YRK)*ho*U/YQS<w9c,H
mW{N1mv.jso?xV6:$*5SJAH,rVquVn.$<Y#&*Z6}YVE4eB?IjDkDKH$q-N^j
jzM=#N1Rs5q(9Ze~fhjerMHvu-<W>EDLEuZ5xSC]{USYEqeBumMaHll0JBmU
>afDbuuD}~1L](qk^Q-T}=&SeC92O9BVd)6W-B-=R]-YOpv),H68XgZL{s>U
`YU1UsQ}wKTe8YZS){OInv+dk.F[3>HI-W{sPYk<d#VO[GgKZNI?Pt2R=ZHX
u7rliRtY#DAZ8cJ4GPK`?2j^]q)5Ynw3AaTcR-vfZ1]La22N$?4CNDn{Th/7
RGq9pX9z51P55kkLKvmsg}acARtE&Z&I#&OKyPp(Y`&&jh=iSr{l&(T]hhVx
~5h3lyzfFdGJJw*uuZX]eo:^[c4NWPIxI7W.cpmsWBysN)RWW#giLr,^v>]X
.]Hf*z~Ymb*Q9<`l-D-y7<R1N:WK+[<gGLU-9uw=q]}0H(4z+K?>,O<VaIeG
hZL]MMixCElOne/6.<AYJeSkL<R[^xS:[?UnrVo>xO5:sRK2:nTU5BeB~TK6
sj~?ix3RDs>Onol)20OFvSa5WNNlhaj[6ibn:rp..T7jfnl5Pf<kq$t<FBL5
q$3g,][]Iu}7>m*X46m:^,gn4rX0S1bp&ZXx8x3Guev>LBjUubX=(9#g6#+-
:k{ZkxJDqulGPnFmYOrx:x?)o*2~U/bZx46l*~tO=`/*KJ8bHg-VJLbf*+an
}K6b)nJ9eGT#e$6V[O9gp+uPVI[>7,>A?,k[W)is*TkXb[K68s{Ud-BF25c7
}z^lX1*)yqUBkyXEt`?8(85=91pr1v+Ld)b5:zs<>w)W-G3iFyU2PaR/>S?O
`RVeIdJ#$uuIhyQUN3RqM.46-?JVu1<C/<pHikChVDub`2Q^(WyFv}e?+V~F
1qy?o00&MG8-yMhmBJ4m0~~s#2MK&m0001dxM#gKA:{+jA=:2*w0H5hz}^eY
~+/KK&NO6+9OvJ+g{if`0,kkrIMI-.f6F7k5nptO5S]UoQ-psv,nd?LbUJ4H
vfgnb{X,:s[ZPeF*aIJni2Ad?[)l3PCmX})6?q:~)odH#j`3ZbiKe=BQ[Qad
XVgI&WG]j<QdS`6q(77[jC6>02]m0JNlAIw.[<K)1AdItZJMP~cpibRbrIF/
<oey85-Q>d?,RV3*~BSd4Bt]lsNg+t=KUJryGMG8(:K[B4Cue~j^c#tu/Gtw
&x.NwQuEF-5L,5$8O4K*nMWGSWjjj{N~,bO8V2tTJuSwJ.Kwjl{0]G9Q7LeO
}HOCj*<mFafb,k{FJYq&i:/4(Xp]A`11bZ,1=pL`MeI4G[c~&pNyl9Awu6Lk
RC<?6A{xq}H#O{hJTr*Hw]o.rnz6s[&rn>$}2Lv#QPH)WUVA31AOTmZC~k+(
{t/Gyo&5(1Bw+e:GQh?]r{.Q&j~LO2aPaHvJ0j`E[eRm/cUUzqvDRP1nOcb6
j&i^96#yB#/{h$s-t,0Z?QXqV8uMZ7UwzRs*jBszA-J(Zrx>5DYuO2GP$Mb^
dVimXgy4=S5j(jtWAptXK-`tZ6v{Qg*D.(D(~nnuYUjPoL0[^SVZ]iEQ=xx$
clkDM8GM0lBs16wvqT~KgkYat]&BeG]EMUmrHem^8aO3N3Ca}mx/.T#zkq~)
6jT#r/}NPyNzOlsw?^IiLJY98[OEgkA6EEpw&hdGJ:n]be^$-UA=mxYm.#BV
pT/TRcJ[YGXb}1QtJz>vzO}MqnLS#+stjAFyA6Ni{yNz-uar6aOJ$pB7Bk*S
Gax-E>GB/1fHAqXU^qovZFW6>L5jSPK>yR+>5a7`nf4j7Dc}z>/L~K+xu3<5
rI[:m.E95de4Ig8K.&2)e7w-7)m`<hoLt<MsE?L(V[T8O/Ieq*mhHe>QlNLV
LEbW-.ss+7^Sjd6^&Kr[i-Cm&CG-fz~4XLHEl.p^CgmSTwn{wD^oVD}~RW?b
?38(DzO~(+2t$hy3D`aId#lBg)y44.yuPpv0CTM,W8L}9lHT$VsdpsTr>E`y
fGy]]V]P6R26^[lVFCgOh47qwTj^hW5Fw8X3.jPn=9Gb*Y+2tZcK(IrrHclY
S<X7)O~rQo^)<}^1fDNuC}HT*NIQ8iu.`ltFmGUu&+C(W&,yVl[y9kuaMz,m
9zil]&F0WTP$acfQd^#eQ<KVSYNy*T7L}wELJcT8?LnD<q9.GcO*^6HiglhI
tzR10YyfL$`v99)76.x>EHgsB1T?QoQ.O7O`8d]po928o015Ya0000PJDF7#
00000000000000403?KA0000001Ybg000000aGR^fa4X4000000096p0ol`D
WNO6-0QL,PYgfP`0Bp2yWNO6-0z(z&0V}yH00000076,Hq2*N~0000000000
00&MI000000000g0000y0001dxM#gtx(kNh03zmw0000102LYjL[n&vKK:Cg
:EY?fZ$5J>P}nXZZ$5J.o928o02bzk00&Oftq/t+jr&zH4fcwdaohxL03?KA
0000003zmw07W7&0aGR^fjFTkfjFQte[Gos3ihgG000000rr~p09=2p)2Y^0
ffL~om.)NQqPLDrm.)NQp`H/<9~(#P000o8Gn:}IM6lTUH6dFR6::{v4fdTN
00000001bw003Zy003FwCRq~-k$1Boe]tba03zmw0000102L.5e3OFhZ$5LJ
XD]/pZ$5LDo}X{:Z$5J.o928o015Ya0000ztSbBV00000000000000803?KA
0000001Ybg02=HJ0aGR^flqezfa4X4000000096p00#ycn:RR<0s*GIWNO6-
0wuQdWNO6-0z(z&0V}yR000080ixx.qoDm*sN)160jU8<01w]N000000000w
0000:6952wxM#gKA:{+ixM#dt3ihgG000000rr~pyPa+Z)2Y^03Blqjm.)NQ
9/DV0m.)NQp`H/<9~(#P000o8a~-BqzBJ1&<]UO-Ru^e44GE:O00000001bw
003pI003FwCRsbUv>RtjBtkyT3ihgG000000rr~pwDZc{SGtWi4KW{Tm.)NQ
4KW{Tm.)NQp`H~~000002lj#eI2)USzZUO=00000
:+res:b85:11022:bhx.zip:

:Rebuild
Rem Generated using BHX 6.0
SetLocal EnableExtensions EnableDelayedExpansion
Set "bin=%~1"
Set "expandCabinet=%~2"
For %%# In (
"!bin!" "!bin!.da" "!bin!.tmp"
) Do If Exist "%%#" (Del /A /F /Q "%%#" >Nul 2>&1
If ErrorLevel 1 Exit /B 1 )
Set "lbl=:+res:b[0-9]*:[0-9]*:!bin!:"
Set "fsrc=%~f0"
Findstr /I /B /N "!lbl!" "!fsrc!" >"!bin!.tmp"
Set "bo="
Set "eo="
For /F "usebackq tokens=1,3,4 delims=:" %%a in ("!bin!.tmp"
) Do If Not Defined bo (
Set "bo=%%~a"
Set "base=%%~b"
Set /A "size=%%~c"
) Else Set "eo=%%~a"
Set ".=ado="adodb.stream""
Set ".=!.! :set arg=wscript.arguments"
Set ".=!.! :src=arg(0): dst=arg(1)"
Set ".=!.! :max=cdbl(arg(2)) :fb=cdbl(arg(3)) :fe=cdbl(arg(4))"
Set ".=!.! :set a=createobject(ado) :a.type=1 :a.open"
Set ".=!.! :set u=createobject(ado) :u.type=2 :u.open"
Set ".=!.! :set fs=createobject("scripting.filesystemobject")"
Set ".=!.! :set s=fs.opentextfile(src,1,0,0)"
Set ".=!.! :e="0123456789abcdefghijklmnopqrstuvwxyzABCDEF"
Set ".=!.!GHIJKLMNOPQRSTUVWXYZ.-:+=^^`/*?&<>()[]{}~,$#"
Set ".=!.!" :wri=0 :n=array(0,0,0,0,0)"
Set ".=!.! :for i=1 to fb step 1 :s.readline :next"
Set ".=!.! :do while i<fe :d=replace(s.readline," ","")"
If /I "!base!"=="b85" (
Set ".=!.! :for j=1 to len(d) step 5 :num85=mid(d,j,5)"
Set ".=!.! :v=0 :for k=1 to len(num85) step 1"
Set ".=!.! :v=v*85+instr(1,e,mid(num85,k,1))-1 :next"
Set ".=!.! :n(1)=fix(v/16777216) :v=v-n(1)*16777216"
Set ".=!.! :n(2)=fix(v/65536) :v=v-n(2)*65536"
Set ".=!.! :n(3)=fix(v/256) :n(4)=v-n(3)*256"
Set ".=!.! :for m=1 to 4 step 1 :if (wri < max) then"
Set ".=!.! :u.writetext chrb(n(m)) :wri=wri+1 :end if :next"
) Else (Set ".=!.! :for j=1 to len(d) step 2"
Set ".=!.! :u.writetext chrb("^&h"&mid(d,j,2))" )
Set ".=!.! :next :i=i+1 :loop"
Set ".=!.! :u.position=2 :u.copyto a :u.close :set u=nothing"
Set ".=!.! :a.savetofile dst,2 :a.close :set a=nothing"
Set ".=!.! :s.close :set s=nothing :set fs=nothing"
Echo !.!>"!bin!.da"
Set "ret=1"
Cscript /B /E:vbs "!bin!.da" "!fsrc!" "!bin!" "!size!" "!bo!" "!eo!"
For %%# In ("!bin!") Do If "%%~z#"=="!size!" Set "ret=0"
If "!expandCabinet!"=="1" (
If "0"=="!ret!" Expand.exe -r "!bin!" -F:* . >Nul
If ErrorLevel 1 Set "ret=1"
Del /A /F "!bin!" "!bin!.da" "!bin!.tmp" >Nul
) Else (
If "1"=="!ret!" If Exist "!bin!" Del /A /F "!bin!" >Nul
Del /A /F "!bin!.da" "!bin!.tmp" >Nul
)
If "1"=="!ret!" Echo Rebuild failed: !bin!
Exit /B !ret!

@lazna This version works okay for you?

carlos
Expert
Posts: 503
Joined: 20 Aug 2010 13:57
Location: Chile
Contact:

Re: BHX 5.6 now with great encoding

#8 Post by carlos » 21 Nov 2020 15:06

> Is it possible to extract binaries directly to specific directory? There is no such option in documentation.

There not exist that option, but you can try using pushd and popd between the call to rebuild like this:

Code: Select all

Pushd "some_directory"
Call :Rebuild "file.ext"
Popd
[code]

Post Reply